第4章 SQL数据查询语言DQL(单表查询)
4.1 SELECT基本结构
SELECT 字段列表
FROM 表名
WHERE 条件
GROUP BY 分组字段
HAVING 分组过滤条件
ORDER BY 排序字段 [ASC|DESC]
LIMIT 起始位置, 记录数;
SQL查询语句的执行顺序:FROM → WHERE → GROUP BY → HAVING → SELECT → ORDER BY → LIMIT
4.2 WHERE条件运算符
- 比较运算符:=、<>、>、<、>=、<=
- 范围:BETWEEN...AND...
- 集合:IN、NOT IN
- 模糊匹配:LIKE(%匹配任意字符序列,_匹配单个字符)
- 空值判断:IS NULL、IS NOT NULL
- 逻辑运算:AND、OR、NOT
4.3 聚合函数
- COUNT(*):统计行数
- SUM(字段):求和
- AVG(字段):求平均值
- MAX(字段):求最大值
- MIN(字段):求最小值
-- 统计学生总数
SELECT COUNT(*) FROM student;
-- 计算平均年龄
SELECT AVG(sage) FROM student;
4.4 GROUP BY - 分组查询
GROUP BY按指定字段分组,通常配合聚合函数使用。
-- 统计各系学生人数
SELECT sdept, COUNT(*) AS 人数
FROM student
GROUP BY sdept;
4.5 HAVING - 分组过滤
HAVING对分组后的结果进行过滤。注意:WHERE是过滤行,HAVING是过滤组。
-- 查询人数超过3人的系
SELECT sdept, COUNT(*) AS 人数
FROM student
GROUP BY sdept
HAVING COUNT(*) > 3;
4.6 ORDER BY - 排序
ASC升序(默认),DESC降序。
-- 查询年龄最大的前3名学生
SELECT * FROM student ORDER BY sage DESC LIMIT 3;
4.7 DISTINCT - 去重
-- 查询有哪些系
SELECT DISTINCT sdept FROM student;
4.8 LIMIT - 分页
-- 查询第2页,每页5条
SELECT * FROM student LIMIT 5, 5;
4.9 典型查询示例
-- 查询所有男生信息
SELECT * FROM student WHERE ssex='男';
-- 查询姓"张"的学生
SELECT * FROM student WHERE sname LIKE '张%';
-- 统计各系学生人数
SELECT sdept, COUNT(*) AS 人数 FROM student GROUP BY sdept;
-- 查询年龄最大的前3名学生
SELECT * FROM student ORDER BY sage DESC LIMIT 3;
自学自检小问题
- WHERE和HAVING的区别是什么?
- COUNT(*)和COUNT(字段名)有什么区别?
- LIKE '%张%' 和 LIKE '张%' 分别匹配什么?
拓展学习资源
- 菜鸟教程:MySQL查询数据
- 实训数据集:电商订单表(order_id, customer_id, product_name, quantity, price, order_date)
第4章 基础巩固练习
0/5
第1题
选择题
以下哪个关键字用于消除查询结果中的重复行?( )
答案解析
正确答案:C(DISTINCT)。DISTINCT用于去重;ORDER BY用于排序;GROUP BY用于分组;LIMIT用于限制返回行数。
第2题
选择题
查询时对分组后的结果进行过滤,应使用( )
答案解析
正确答案:B(HAVING)。WHERE过滤行,HAVING过滤分组结果。
第3题
选择题
COUNT(*)和COUNT(字段名)的区别是( )
答案解析
正确答案:C。COUNT(*)统计所有行;COUNT(字段名)只统计该字段非NULL的行。
第4题
选择题
LIKE '张%' 匹配的是( )
答案解析
正确答案:B(以'张'开头的)。%匹配任意字符序列,所以'张%'匹配以张开头的所有字符串。
第5题
选择题
要查询表中的前10条记录,应使用( )
答案解析
正确答案:B(LIMIT 10)。MySQL中使用LIMIT限制返回行数。
0/0