MySQL 的增删改查
1. CRUD
- 注释:在SQL中可以使用“--空格+描述”来表示注释说明
- CRUD 即增加(Create)、查询(Retrieve)、更新(Update)、删除(Delete)四个单词的首字母缩写。
create table student(id int,name varchar(20));
1.1 新增
语法:
insert [into] table_name [column] values(values_list);
这里 into 可加可不加
column 是表中属性 这里后面会说
values_list 这里是 按照表属性的顺序来添加数据
1.1.1 单行添加
insert into student values(1,"张三");
这里可以用中文 是因为 在创建数据表的时候用了 utf8;
这的 字符串 可以用 单引号 也可用双引号
1.1.2 指定列插入
insert into student (id) values (2);
这里的意思是 添加一个 id为 2的数据 其余为默认值 null
1.1.3 多行插入
insert into student values(3,"李四"),(4,"王五");
这里有一个要注意的点
多行插入的效率比 单行插入要高
datatime 类型如何填入?
可以用一个固定的字符串来表示日期
insert into student values(1,'张三','2000-01-01 12:00:00');
表示现在的时间可以直接用 函数 now();
insert into student values(2,'李四',now());
1.2 查询
select 条件查询的执行顺序
- 遍历表中每个记录
- 把当前值带入条件,根据条件进行筛选
- 如果合格记录条件成立,就要保留,进行列上的表达式计算
1.2.1 全列查询
语法:select*from + 要查询的表
select*from exam_result;
把表中所有的行和列 全部展示出来
*表示通配符 表示所有列
危险操作:
- 读取硬盘,把硬盘的 IO 跑慢了, 此时程序的其他部分像访问就 非常慢
- 操作网络,也可能把网卡跑满,此时其他客户端想通过网络访问服务器 也非常慢
1.2.2 指定列查询
select id,name,birthday from exam_result;
1.2.3 查询字段为表达式
select name,english-10 from exam_result;
注意 这个并不会改变我们的原始数据 只是在最终响应里做了计算
进行查询的时候,是把服务器这里的数据提取迟来,返回客户端,并且以 临时表的形式进行展示
所以 这里只是修改了 临时表
可以计算每个同学的总成绩
select name,chinese+english+math from exam_result;
查询时可以进行简单的统计操作
1.2.4 查询的时候 指定别名(给表也可以)
select 表达式 as 别名 from 表名;
1.2.5 去重
select distinct 列名 from 表名;
效率很低
1.2.6 排序
select 列名,列名 from 表名 order by 列名 asc/desc;
asc 为升序
desc 为降序
默认 asc
这里 前面的列名 是 返回临时表中展现的 后面的 列名 是 依靠这个列来排序的意思
- 没有 order by 字句的查询 ,返回的顺序是未定义,永远不要依赖这个数据
- null 数据排序 视为比任何值小,升序时出现在最上面
- null 跟 任何数 相加 还是 null
加入 上面的别名 (注意顺序)
select name,chinese+math+english as total from exam_result order by total desc;
对多个字段进行排序 这里的意思是这样的
优先数学降序 然后如果数学成绩相同 则看英语成绩升序排序
select name,chinese,english,math from exam_result order by math desc,english, chinese desc;
1.2.7 条件查询 where
比较运算符:
运算符 | 说明 |
---|---|
>, >=, <, <= | 大于,大于等于,小于,小于等于 |
= | 等于,NULL 不安全,例如 NULL = NULL 的结果是 NULL |
<=> | 等于,NULL 安全,例如 NULL <=> NULL 的结果是 TRUE(1) |
!=, <> | 不等于 |
between a0 and a1 | 范围匹配,[a0, a1],如果 a0 <= value <= a1,返回 TRUE(1) |
in (option, ...) | 如果是 option 中的任意一个,返回 TRUE(1) |
is null | 是 NULL |
is not null | 不是 NULL |
like | 模糊匹配。% 表示任意多个(包括 0 个)任意字符;_ 表示任意一个字 符 |
逻辑运算符
运算符 | 说明 |
---|---|
and | 多个条件必须都为 TRUE(1),结果才是 TRUE(1) |
or | 任意一个条件为 TRUE(1), 结果为 TRUE(1) |
not | 条件为 TRUE(1),结果为 FALSE(0) |
这里注意
- null 默认为 false
- where 条件可以使用表达式,但不能用别名
- and的优先级高于or 这边不建议记 如果需要优先进行可以直接用 ();
-
基本查询
select name,chinese from exam_result where chinese > 80; select name,chinese+math+english 总分 from exam_result where chinese+math+english < 200;
-
and 与 or
select * from exam_result where chinese > 80 and english < 70; select * from exam_result where chinese > 80 or english < 70;
-
between ... and ...
select name,english,chinese from exam_result where chinese between 80 and 90;
-
in
select name,chinese from exam_result where chinese in (98,87,82,88);
-
模糊查询like
通配符 % 匹配多个字符 (包括0)
select name from exam_result where name like '孙%';// 孙悟空 孙权
孙% 查询开头为 孙的
%孙 查询 结尾为孙的
%孙% 查询包含孙的
通配符 _ 匹配一个字符
select name from exam_result where name like '孙_';// 孙权 select name from exam_result where name like '孙__';// 孙悟空
-
Null 的查询 这里要注意
select * from exam_result where chinese = null;
我们使用 = 查询null 即使有 null 也会显示 没有
因为 在 mySQL 中 null 默认为 false
当他 查询到 null 会被认为是 空 然后 空又默认为 false 所以咧 无法查询到结果
这里就要使用:
select * from exam_result where chinese <=> null;//可以看到多个列 select * from exam_result where chinese is null;//只能看到一个列 select * from exam_result where chinese <=> english;
1.2.8 分页查询 limit
语法:
select * from exam_result limit 3;
select * from exam_result limit 3 offset 3;
查询 开头三行数据
offset 的意思是 偏移量
标签:exam,chinese,改查,查询,result,MySQL,增删,select,name From: https://www.cnblogs.com/ljy2003/p/18442953