MySQL基础教程——查询操作(上)
@
在了解了表的约束后,我们现在来学习关于表的核心操作查询。
一、基本查询操作
(1)创建Create
针对该表进行操作。

1、单行全列插入
insert into students values(101, 10001, 'aaa', '11111');
2、多行指定列插入
nsert into students (id,class,name) values(102, 10002, 'bbb'),(103, 10003, 'ccc');
结果查看:

3、插入否则更新
由于主键冲突的插入失败:

同步更新操作:
insert into students (id, class, name) values (100, 10010, 'ddd') on duplicate key update class = 10010, name = 'ddd';
4、替换
主键或者唯一键没有冲突,则直接插入;主键或者唯一键如果冲突,则删除后再插入。
replace into students(class,name) values(20001, 'bbb');
结果查看:

(2)读取Retrieve
1、select
对以下表进行操作:

全列查询
select * from exam_result;

指定列查询
select id,name,Chinese from exam_result;

查询字段为表达式
select id, name, Chinese + Math + English from exam_result;

为查询结果指定别名
select id, name, Chinese + Math + English tolal from exam_result;

结果去重
select distinct math from exam_result;
2、where
在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) |
因此在where语句加入相应的逻辑判断条件便可根据相应的逻辑查询数据。
如:查询英语不及格的同学及英语成绩 ( < 60 )

查询a开头的

查询a开头但后面只跟一个字符的

3、结果排序order by
-- ASC 为升序(从小到大)
-- DESC 为降序(从大到小)
-- 默认为 ASC
select ... from table_name [WHERE ...]
order by column [ASC|DESC], [...];
注意:没有 ORDER BY 子句的查询,返回的顺序是未定义的。
使用例子:同学及数学成绩,按数学成绩升序显示

4、筛选分页结果
从 s 开始,筛选 n 条结果
select ... from table_name [WHERE ...] [ORDER BY ...] limit s, n
从 0 开始,筛选 n 条结果
select ... from table_name [WHERE ...] [ORDER BY ...] limit n;
从 s 开始,筛选 n 条结果,比第二种用法更明确,建议使用
select ... from table_name [WHERE ...] [ORDER BY ...] limit n offset s;
分页筛选能帮助我们在对未知表进行查询时,避免因为表中数据过大,查询全表数据导致数据库卡死。
使用例子:按 id 进行分页,每页 2 条记录,分别显示 第 1、2 页

(2)更新Update
update table_name SET column = expr [, column = expr ...]
[WHERE ...] [ORDER BY ...] [LIMIT ...]
案例:将aaa同学的英语成绩变更为 80 分

(3)删除Delete
delete from table_name [WHERE ...] [ORDER BY ...] [LIMIT ...]
案例:删除aaa同学的考试成绩

如果没有where语句将删除整张表的数据。
截断表
truncate [TABLE] table_name
只能对整表操作,不能像 DELETE 一样针对部分数据操作;实际上 MySQL 不对数据操作,所以比 DELETE 更快,但是TRUNCATE在删除数据的时候,并不经过真正的事物,所以无法回滚;且会重置 AUTO_wINCREMENT 项。
(4)插入查询结果
INSERT INTO table_name [(column [, column ...])] SELECT ...
(5)聚合函数
| 函数 | 说明 |
|---|---|
| COUNT([DISTINCT] expr) | 返回查询到的数据的 数量 |
| SUM([DISTINCT] expr) | 返回查询到的数据的 总和,不是数字没有意义 |
| AVG([DISTINCT] expr) | 返回查询到的数据的 平均值,不是数字没有意义 |
| MAX([DISTINCT] expr) | 返回查询到的数据的 最大值,不是数字没有意义 |
| MIN([DISTINCT] expr) | 返回查询到的数据的 最小值,不是数字没有意义 |
案例:有多少个同学的考试成绩

(6)group by子句的使用
在select中使用group by 子句可以对指定列进行分组查询
select column1, column2, .. from table group by column;
在group by子句中having经常和group by搭配使用,作用是对分组进行筛选。
写在最后:在MySQL中子句执行顺序
| 子句执行顺序 | 作用 |
|---|---|
| 1 FROM | 确定数据源,包括多表关联(JOIN)和子查询 |
| 2 ON | 执行 JOIN 的连接条件 |
| 3 JOIN | 进行表连接操作(如果是外连接,这里补充外部行) |
| 4 WHERE | 对行数据进行过滤(分组前的筛选) |
| 5 GROUP BY | 对过滤后的数据进行分组 |
| 6 HAVING | 对分组后的结果进行过滤(分组后的筛选) |
| 7 SELECT | 选择要返回的列,计算表达式和聚合函数 |
| 8 DISTINCT | 对结果去重 |
| 9 ORDER BY | 对最终结果进行排序 |
| 10 LIMIT | 限制返回的行数 |

浙公网安备 33010602011771号