文章目录
1. 查询语法
SELECT [ALL | DISTINCT | DISTINCTROW ]
列1, 列2, 列3
FROM 表名
WHERE 查询条件
[GROUP BY col_name]
[HAVING where_definition]
[ORDER BY col_name [ASC | DESC]]
[LIMIT {[offset,] row_count | row_count OFFSET offset}]
2. 查询示例
2.1 查询全部
SELECT * FROM Student;
2.2 查询部分列
SELECT Stu_No,Stu_Name FROM Student;
2.3 查询结果起别名(as)
SELECT Stu_No AS 学号,Stu_Name 姓名 FROM Student;
2.4 查询条件(where)
SELECT * FROM Student WHERE Stu_Age > 20;
SELECT * FROM Student WHERE Stu_Birthday BETWEEN '1996-10-1' AND '1997-3-1';
SELECT * FROM Student WHERE Grade_Id IS NULL;
SELECT * FROM Student WHERE Stu_Age > 20 AND Stu_Sex = '男';
SELECT * FROM Student WHERE Stu_No = 1;
2.5 限定行数 – MySQL
SELECT * FROM Student LIMIT 0,4; -- 查询 编号大于0 的 4 条记录
SELECT * FROM Student LIMIT 4,2; -- 查询 编号大于4 的 2 条记录
2.6 查询结果排序(order by)
- desc 降序排列
- asc 升序排列(默认)
SELECT * FROM Student ORDER BY Stu_Birthday DESC;
2.7 模糊查询(只能对字符串类型的列进行查询)
- % 任意长度的字符
- _ 一个长度的字符
SELECT * FROM Student WHERE Stu_Name LIKE '%张%';
SELECT * FROM Student WHERE Stu_Name LIKE '张%';
SELECT * FROM Student WHERE Stu_Name LIKE '李_';
2.8 in 范围查询
SELECT * FROM Student WHERE Grade_Id IN (1,3,5);
SELECT * FROM Student WHERE Grade_Id NOT IN (1,3,5);
2.9 聚合函数
每个聚合函数的查询结果是一个值,且没有列名,需要指定别名;
- count:计数
SELECT COUNT(*) FROM Student; -- 对行计数
SELECT COUNT(Stu_Name) FROM Student; -- 对列计数,不统计Null
SELECT COUNT(Grade_Id) FROM Student;
SELECT COUNT(DISTINCT Stu_Name) FROM Student; -- DISTINCT : 去重复对列计数
- max 最大值
- min 最小值
- avg 求平均值
SELECT MAX(Stu_Age) 最大年龄, MIN(Stu_Age) 最小年龄, AVG(Stu_Age) 平均年龄 FROM Student;
- sum 求和
SELECT SUM(Stu_Age) 年龄总和 FROM Student;
2.10 分组查询
- GROUP BY 列1,列2 having 筛选条件
– 统计每个性别的人数
SELECT Stu_Sex 性别, COUNT(*) 人数 FROM Student GROUP BY Stu_Sex;
– 统计每个年级的人数
SELECT Grade_Id 年级 ,COUNT(*) 人数 FROM Student
WHERE Grade_Id IS NOT NULL
GROUP BY Grade_Id;
– 统计每个年级、每个性别的人数
SELECT Grade_Id 年级 ,Stu_Sex 性别 , COUNT(*) 人数 FROM Student GROUP BY Grade_Id,Stu_Sex;
– 不合理的实现 (已经分组、需要的是每组的结果,但是Stu_Name列不是针对组的,是针对每一行的)
SELECT Stu_Sex, Stu_Name ,COUNT(*) FROM Student GROUP BY Stu_Sex; -- 错误代码
【注意】:在分组查询中,位于select 和 from 之间的列,要么在聚合函数中,要么在 group by子句中。
-
having子句:在分组之后的结果中,对分组以后的结果进行筛选
-
having只能用在 group by 之后,不能单独使用
-
group by 子句可以直接使用列的别名 , having子句不能用列的别名
-- 查询出每个部门的名称、部门的人数、平均工资 , 保留平均工资大于2000的部门信息
select d.deptNo,d.dname,count(empNo),avg(sal)
from Emp e right join Dept d on d.deptNo = e.deptNo
group by d.deptNo,d.dname
having avg(sal) > 2000
order by avg(sal) desc