MySQL 第4章 单表查询
一、本章学习目标
- 熟悉SELECT语句作用,理解各子句含义
- 会做简单查询:查全部、查指定字段、去重查询
- 会做条件查询:比较运算、逻辑运算、模糊查询
- 会做高级查询:聚合函数、分组、排序、分页、常用函数
- 能给表和字段设置别名
- 能完成图书表实战查询
二、本章先认识:本章核心关键词
- SELECT:查询、选取数据
- FROM:从哪张表查询
- WHERE:查询条件(过滤数据)
- DISTINCT:去重(去掉重复数据)
- ORDER BY:排序
- GROUP BY:分组
- HAVING:分组后过滤
- LIMIT:限制条数、分页
- AS:起别名
- LIKE:模糊查询
- IN:在某个列表里
- NULL:空值
三、SELECT 语句完整语法(最核心)
SELECT[DISTINCT]字段列表FROM表名[WHERE条件][GROUPBY分组字段][HAVING分组条件][ORDERBY排序字段ASC/DESC][LIMIT起始位置,查询条数];各子句讲解
- SELECT:要查哪些列
- DISTINCT:查询结果去掉重复
- FROM:指定从哪张表查
- WHERE:筛选数据(行)
- GROUP BY:按字段分组(统计用)
- HAVING:对分组结果再筛选
- ORDER BY:对结果排序
- LIMIT:只取前几条
四、简单查询
4.1 查询所有字段
讲解:查询表中全部列的数据
-- 方式1:写所有字段SELECTempno,ename,job,mgr,sal,comm,deptnoFROMemp;-- 方式2:用 * 表示所有字段(最简单)SELECT*FROMemp;4.2 查询指定字段
讲解:只需要某些列,就只写这些字段
-- 只查员工编号、姓名SELECTempno,enameFROMemp;4.3 去重查询 DISTINCT
讲解:查询结果有重复时,用 DISTINCT 只保留唯一值
-- 查询有哪些部门编号(重复的只显示一次)SELECTDISTINCTdeptnoFROMemp;-- 多字段去重:所有字段组合相同才算重复SELECTDISTINCTename,jobFROMemp;五、条件查询 WHERE
5.1 比较运算符
讲解:用来判断数据大小、范围、是否相等
| 运算符 | 含义 |
|---|---|
| = | 等于 |
| <> / != | 不等于 |
| > | 大于 |
| >= | 大于等于 |
| < | 小于 |
| <= | 小于等于 |
| BETWEEN … AND … | 在区间内 |
| IN | 在列表中 |
| IS NULL | 是空值 |
| IS NOT NULL | 不是空值 |
示例
-- 1. 查询姓名是张三的员工SELECT*FROMempWHEREename='张三';-- 2. 查询工资 >= 3000SELECT*FROMempWHEREsal>=3000;-- 3. 查询部门是10或20SELECT*FROMempWHEREdeptnoIN(10,20);-- 4. 查询没有上级(mgr为空)SELECT*FROMempWHEREmgrISNULL;5.2 模糊查询 LIKE
讲解:不知道完整内容,只知道一部分时使用
- %:匹配任意多个字符(包括0个)
- _:匹配一个字符
示例
-- 姓名以“一”结尾SELECT*FROMempWHEREenameLIKE'%一';-- 姓名包含“十”SELECT*FROMempWHEREenameLIKE'%十%';-- 姓名3个字,最后一个是“一”SELECT*FROMempWHEREenameLIKE'__一';5.3 逻辑运算符
讲解:把多个条件组合起来
- AND:并且(所有条件满足)
- OR:或者(一个满足就行)
- NOT:取反
示例
-- 职位是经理,并且部门是20SELECT*FROMempWHEREjob='经理'ANDdeptno=20;-- 职位是经理 或 部门是10SELECT*FROMempWHEREjob='经理'ORdeptno=10;六、高级查询
6.1 聚合函数(统计数据)
讲解:对一列数据做计算,返回一个结果
| 函数 | 作用 |
|---|---|
| COUNT() | 统计行数 |
| SUM() | 求和 |
| AVG() | 平均值 |
| MAX() | 最大值 |
| MIN() | 最小值 |
示例
-- 员工总数SELECTCOUNT(*)FROMemp;-- 总工资SELECTSUM(sal)FROMemp;-- 平均工资SELECTAVG(sal)FROMemp;-- 最高/最低工资SELECTMAX(sal),MIN(sal)FROMemp;6.2 分组查询 GROUP BY
讲解:按某一列分组,常用于统计每个组的情况
-- 按部门分组,统计每个部门的平均工资、总工资SELECTdeptno,AVG(sal),SUM(sal)FROMempGROUPBYdeptno;6.3 HAVING 分组后过滤
讲解:对分组结果再筛选
-- 只保留平均工资 < 3000 的部门SELECTdeptno,AVG(sal)FROMempGROUPBYdeptnoHAVINGAVG(sal)<3000;6.4 排序 ORDER BY
讲解:让查询结果按某一列排序
- ASC:升序(小→大,默认)
- DESC:降序(大→小)
-- 按工资从高到低SELECT*FROMempORDERBYsalDESC;6.5 限量查询 LIMIT
讲解:只取前几条,用于分页
-- 取前5条SELECT*FROMempLIMIT5;-- 从第2条开始,取4条(下标从0开始)SELECT*FROMempLIMIT1,4;6.6 常用内置函数
讲解:MySQL 自带工具函数
- CONCAT():字符串拼接
- IFNULL():空值替换
- IF():条件判断
- NOW():当前时间
-- 拼接姓名和职位SELECTCONCAT(ename,'-',job)FROMemp;-- 奖金为空则显示0SELECTename,IFNULL(comm,0)FROMemp;七、设置别名 AS
讲解:给字段/表起一个简单好记的名字
-- 字段别名SELECTenameAS姓名,sal 工资FROMemp;-- 表别名SELECTe.enameFROMemp eWHEREe.deptno=30;八、上机实战:图书表 book 查询(全案例)
-- 1. 查询可借阅图书SELECTname,upload_timeFROMbookWHEREstate=0;-- 2. 按书名排序,取前5本SELECTname,price,stateFROMbookORDERBYnameLIMIT5;-- 3. 价格大于50SELECTname,priceFROMbookWHEREprice>50;-- 4. 价格 30~50SELECTname,priceFROMbookWHEREpriceBETWEEN30AND50;-- 5. 书名包含 JavaSELECTnameFROMbookWHEREnameLIKE'%Java%';-- 6. 书名以“入门”结尾SELECTnameFROMbookWHEREnameLIKE'%入门';-- 7. 查询西游记、红楼梦SELECTname,priceFROMbookWHEREnameIN('西游记','红楼梦');九、本章最重要总结(新手必背)
- SELECT + FROM是查询的基础
- WHERE用来筛选数据
- DISTINCT去重
- LIKE做模糊查询
- 聚合函数 + GROUP BY做分组统计
- ORDER BY排序,LIMIT分页
- 别名让 SQL 更简洁
- WHERE 过滤行,HAVING 过滤分组