# 数据库查询语句
# 查询语句完整语法
这里是一个完整的查询语句的模板,先不用看,只后解释。
SELECT[ALL|DISTINCT|DISTINCTROW|TOP]
{*|talbe.*|[table.]field1[AS alias1][,[table.]field2[AS alias2][,…]]}
FROM tableexpression[,…][IN externaldatabase]
[WHERE…]
[GROUP BY…]
[HAVING…]
[ORDER BY…]
# 概述
查询语句(DQL)是数据库的最重要的部分,数据库的核心。
-- 查询 student 表中 stu_no 和 name 字段
SELECT `stu_no`,`name` FROM student
还可以查询 MySQL 版本。
SELECT VERSION() -- 8.0.5
# 去重
按照够一个字段去掉重复的字段,使用 DISTINCT
关键字。
-- 获取 result 表中不重复的 stu_no 字段
SELECT DISTINCT `stu_no` FROM `result`
# Where 条件字句
通过 Where 语句可以筛选符合我们条件的数据,下面时一个简单的应用。
-- 从 student 表中选择 age 字段为 20 的学生
SELECT * FROM `student` WHERE `age`=20
(1)逻辑
使用逻辑运算符将多个条件连接起来。
-- 选择年龄在 12 ~ 20 的学生
SELECT * FROM `student` WHERE `age`>12 && `phone`<20
- and 或 &&:两个都为真
- or 或 ||:一个为真
- Not 或 !:非
(2)运算符
- IS NULL:操作符为 NULL,结果为真
- IS NOT NULL:操作符不为 NULL,结果为真
- BETWEEN:在某一个区间,
num
BETWEEN 55 AND 60 - LIKE:a 匹配 b,
address
LIKE "T%" - in:在某一个集合里里面,
num
in(a1,a2,a3)
(3)模糊查询
使用 like、in 关键字实现模糊查询,下面介绍 like 关键字的使用。
-- 匹配 address 字段开头是T
WHERE address LIKE "T%"
%
匹配一个或多个字符,To 和 Took 头符合条件。
%
可以放在任意位置,"%T%"表示中间包含 T 字符的。
-- 匹配 address 字段开头是T
WHERE address LIKE "T_"
_
只能匹配任意一个字符,比如,To 符合条件,Took 就不符合。
如果要模糊查询两个字符,那么包含两个 T__
, Too 就满足条件了,多个模糊查询也一样。
下面介绍 in 字段的使用
# 联表查询
联表查询是指从多个表中查询需要的信息,比如一个学生的姓名存放在一个表中,成绩存放在一个表中,查询分数和姓名需要查询两个表。
(1)INNER JOIN
选择两个表的交集。
SELECT stu.`studentno`, `studentname`,`studentresult`
FROM `student` AS stu
INNER JOIN `result` AS res
ON res.`studentno`=stu.`studentno`
上面的例子是选择了两个表 student
和 result
中 studentno
、studentname
、studentresult
的三个字段,依据是聊表表中的 studentno
相互对应。
(2)LEFT JOIN
以据左边的表作为主表,查询一些字段。
如果一些学生信息只有 LEFT 表中,那么这个用户的一些信息会显示为NULL。
(3)RIGHT JOIN
以右边的表作为主表,查询需要的字段。
如果一些学生信息只有 LEFT 表中,那么这个用户的一些信息会显示为NULL。
# 自连接
将一张表拆分为两张表。
# 排序
使用 ORDER BY
字段可以对数据进行排序,可以升序和降序。
-- 降序
SELECT * FROM `user` ORDER BY id DESC
-- 升序
SELECT * FROM `user` ORDER BY id ASC
# 分页
分页将多条数据进行分页返回给前端,目的是缓解数据库的压力,提升用户体验。
语法格式如下:
limit '起始下标' '数据大小'
SELECT * FROM `user` ORDER BY id ASC LIMIT 0,5
这个例子是,从下标 0 位置起,返回 5 条数据。
那么分页的逻辑如下:
- 第一页:limit 0, 5
- 第二页:limit 5, 5
- 第三页:limit 10, 5
- 第N页:limit pegeSize*(N-1), pegeSize
其中 pegeSize 是每一页中数据的大小,那么,总页数 = 数据总数/pegeSize。
# 子查询
在之前讲的 where 语句的条件按是固定的,在子查询中,where 语句的条件是计算出来的,语法像这样。
where( select * from)
# 分组
查询结果后使用 group by 进行分组。
SELECT any_value(`subjectname`), AVG(`studentresult`)
FROM `result` r
INNER JOIN `subject` s
ON r.`subjectno`=s.`subjectno`
GROUP BY r.`subjectno`
HAVING AVG(`studentresult`)>57
这里 avg 函数是计算平均分。这个例子查询的是,计算每个科目的平均分,最后过滤平均分小于 57 分的。
← MySQL MySQL 表的操作 →