1. DQL介绍
DQL英文全称是Data Query Language(数据查询语言),用来查询数据库中表的记录。
查询关键字: SELECT
2. DQL-语法
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | SELECT 字段列表 FROM 表名列表 WHERE 条件列表 GROUP BY 分组字段列表 HAVING 分组后条件列表 ORDER BY 排序字段列表 LIMIT 分页参数 |
环境准备
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 | DROP TABLE IF EXISTS employee; DROP TABLE IF EXISTS tb_user; CREATE TABLE emp( id INT COMMENT '编号' , workno INT COMMENT '工号' , name VARCHAR (50) COMMENT '姓名' , gender char (1) COMMENT '性别' , age TINYINT UNSIGNED COMMENT '年龄' , idcard char (18) COMMENT '身份证号' , workaddress VARCHAR (50) COMMENT '工作地址' , entrydate DATE COMMENT '入职时间' )COMMENT '用户表' ; INSERT INTO emp(id, workno, name , gender, age, idcard, workaddress, entrydate) VALUES ( '1' , '1' , '柳岩' , '女' , '20' , '123456789123456789' , '北京' , '2000-01-01' ), ( '2' , '2' , '张无忌' , '男' , '18' , '123456789012345670' , '北京' , '2005-09-01' ), ( '3' , '3' , '韦一笑' , '男' , '38' , '123456789712345670' , '上海' , '2005-08-01' ), ( '4' , '4' , '赵敏' , '女' , '18' , '123456757123845670' , '北京' , '2009-12-01' ), ( '5' , '5' , '小昭' , '女' , '16' , '123456769012345678' , '上海' , '2007-07-01' ), ( '6' , '6' , '杨逍' , '男' , '28' , '12345678931234567X' , '北京' , '2006-01-01' ), ( '7' , '7' , '范瑶' , '男' , '40' , '123456789212345670' , '北京' , '2005-05-01' ), ( '8' , '8' , '黛绮丝' , '女' , '38' , '123456157123645670' , '天津' , '2015-05-01' ), ( '9' , '9' , '范凉凉' , '女' , '45' , '123156789012345678' , '北京' , '2010-04-01' ), ( '10' , '10' , '陈友谅' , '男' , '53' , '123456789012345670' , '上海' , '2011-01-01' ), ( '11' , '11' , '张士诚' , '男' , '55' , '123567897123465670' , '江苏' , '2015-05-01' ), ( '12' , '12' , '常遇春' , '男' , '32' , '123446757152345670' , '北京' , '2004-02-01' ), ( '13' , '13' , '张三丰' , '男' , '88' , '123656789012345678' , '江苏' , '2020-11-01' ), ( '14' , '14' , '灭绝' , '女' , '65' , '123456719012345670' , '西安' , '2019-05-01' ), ( '15' , '15' , '胡青牛' , '男' , '70' , '12345674971234567X' , '西安' , '2018-04-01' ), ( '16' , '16' , '周芷若' , '女' , '18' , null , '北京' , '2012-06-01' ); |
2.1 基本查询
2.1.1 语法
1 2 3 4 5 6 7 | -- 查询多个字段 SELECT 字段1,字段2,字段3... FROM 表名; SELECT * FROM 表名; -- 设置别名 SELECT 字段1[ AS 别名1],字段2[ AS 别名2]... FROM 表名; -- 去除重复记录 SELECT DISTINCT 字段列表 FROM 表名; |
2.1.2 案例
1 2 3 4 5 6 7 8 9 10 | -- 1. 查询指定字段 name,workno,age 返回 SELECT name ,workno,age FROM emp; -- 2. 查询所有字段返回 SELECT id,workno, name ,gender,age,idcard,workaddress,entrydate FROM emp; # 建议使用该条 SELECT * FROM emp; -- 3. 查询所有员工的工作地址,起别名 SELECT workaddress AS '工作地址' FROM emp; # AS 可省略 SELECT workaddress '工作地址' FROM emp; -- 4. 查询公司员工的上班地址(不要重复) SELECT DISTINCT workaddress FROM emp; |
2.2 条件查询(WHERE)
2.2.1 语法
1 | SELECT 字段列表 FROM 表名 WHERE 条件列表; |
2.2.2 条件
2.2.3 案例
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 | -- 1. 查询年龄等于 88 的员工 SELECT * FROM emp WHERE age = '88' ; -- 2. 查询年龄小于 20 的员工 SELECT * FROM emp WHERE age < '20' ; -- 3. 查询年龄小于等于 20 的员工 SELECT * FROM emp WHERE age <= '20' ; -- 4. 查询没有身份证号的员工 SELECT * FROM emp WHERE idcard IS NULL ; -- 5. 查询有身份证号的员工 SELECT * FROM emp WHERE idcard IS NOT NULL ; -- 6. 查询年龄不等于 88 的员工 SELECT * FROM emp WHERE age != '88' ; SELECT * FROM emp WHERE age <> '88' ; -- 7. 查询年龄在15岁(包含) 到 20岁(包含)之间的员工信息 SELECT * FROM emp WHERE age >= 15 && age <= 20; SELECT * FROM emp WHERE age >= 15 AND age <= 20; SELECT * FROM emp WHERE age BETWEEN 15 AND 20; -- 8. 查询性别为 女 且年龄小于25岁的员工信息 SELECT * FROM emp WHERE gender = '女' AND age < 25; -- 9. 查询年龄等于18 或 20 或 40 的员工信息 SELECT * FROM emp WHERE age = 18 or age = 20 or age =40; SELECT * FROM emp WHERE age IN (18,20,40); -- 10. 查询姓名为两个字的员工信息 SELECT * FROM emp WHERE name LIKE '__' ; -- 11. 查询身份证号最后一位是X的员工信息 SELECT * FROM emp WHERE name LIKE '%X' ; SELECT * FROM emp WHERE name LIKE '_________________X' ; |
2.3 聚合函数(COUNT、MAX、MIN、AVG、SUM)
2.3.1 介绍
将一列数据作为一个整体,进行纵向计算。
2.3.2 语法
1 | SELECT 聚合函数(字段列表) FROM 表名; |
注意:
NULL值不参与所有聚合函数运算
2.3.3 常用聚合函数
2.3.4 案例
1 2 3 4 5 6 7 8 9 10 | -- 1. 统计该企业员工数量 SELECT COUNT (*) FROM emp; -- 2. 统计该企业员工平均年龄 SELECT AVG (age) FROM emp; -- 3. 统计该企业员工最大年龄 SELECT MAX (age) FROM emp; -- 4. 统计该企业员工最小年龄 SELECT MIN (age) FROM emp; -- 5. 统计西安地区员工的年龄之和 SELECT SUM (age) FROM emp WHERE workaddress = '西安' ; |
2.4 分组查询(GROUP BY)
2.4.1 语法
1 | SELECT 字段列表 FROM 表名 [ WHERE 条件] GROUP BY 分组字段名 [ HAVING 分组后过滤条件]; |
2.4.2 where与having区别
- 执行时机不同: where是分组之前进行过滤,不满足where条件,不参与分组;而having是分组之后对结果进行过滤。
- 判断条件不同: where不能对聚合函数进行判断,而having可以
注意:
- 执行顺序: where > 聚合函数 > having。
- 分组之和,查询的字段一般为聚合函数和分组字段,查询其他字段无任何意义。
2.4.3 案例
1 2 3 4 5 6 | -- 1. 根据性别分组,统计男性员工和女性员工的数量 SELECT gender, count (*) FROM emp GROUP BY gender; -- 2. 根据性别分组,统计男性员工和女性员工的平均年龄 SELECT gender, AVG (age) FROM emp GROUP BY gender; -- 3. 查询年龄小于45的员工,并根据工作地址分组,获取员工数量大于等于3的工作地址 SELECT workaddress, count (*) address_count FROM emp WHERE age < 45 group by workaddress HAVING address_count >=3; |
2.5 排序查询(ORDER BY)
2.5.1 语法
1 | SELECT 字段列表 FROM 表名 ORDER BY 字段1 排序方式1,字段2 排序方式2; |
2.5.2 排序方式
- ASC 升序(默认值)
- DESC 降序
注意:
如果是多字段排序,当第一个字段值相同时,才会根据第二个字段进行排序。
2.5.3 案例
1 2 3 4 5 6 7 8 | -- 1. 根据年龄对公司员工进行升序排列 SELECT * FROM emp ORDER BY age; SELECT * FROM emp ORDER BY age ASC ; -- 2. 根据入职时间,对员工进行降序排列 SELECT * FROM emp ORDER BY entrydate DESC ; -- 3. 根据年龄对公司的员工进行升序排序,年龄相同,再按照入职时间进行降序排列 SELECT * FROM emp ORDER BY age,entrydate DESC ; SELECT * FROM emp ORDER BY age ASC ,entrydate DESC ; |
2.6 分页查询(LIMIT)
2.6.1 语法
1 | SELECT 字段列表 FROM 表名 LMIT 起始索引,查询记录数; |
注意:
- 起始索引从0开始,起始索引 = (查询页码-1) * 每页现实记录数;
- 分页查询是数据库的方言,不同的数据库有不同的实现,MySQL中是LIMIT;
- 如果是查询是第一页的数据,起始索引可以省略,直接简写为linit 10。
2.6.2 案例
1 2 3 4 5 | -- 1. 查询第1页员工数据,每页显示10条记录 SELECT * FROM emp LIMIT 0,10; SELECT * FROM emp LIMIT 10; -- 2. 查询第2页员工数据,每页显示10条记录 SELECT * FROM emp LIMIT 10,10; |
2.7 SQL练习
1 2 3 4 5 6 7 8 9 10 | -- 1. 查询年龄为20,21,22,23岁的女性员工信息 SELECT * FROM emp WHERE gender = '女' AND age IN (20,21,22,23); -- 2. 查询性别为 男,并且年龄在20-40岁(含)以内的姓名为三个字的员工。 SELECT * FROM emp WHERE gender = '男' AND ( age BETWEEN '20' AND '40' ) AND name LIKE '___' ; -- 3. 统计员工表中,年龄小于60岁的,男性员工和女性员工的人数。 SELECT gender, COUNT (*) FROM emp WHERE age < '60' GROUP BY gender; -- 4. 查询所有年龄小于等于35岁员工的姓名和年龄,并对查询结果按升序排序,如果年龄相同按入职时间降序排序; SELECT name ,age,entrydate FROM emp WHERE age <= '35' ORDER BY age ASC ,entrydate DESC ; -- 5. 查询性别为男,且年龄在20-40岁(含)以内的前5个员工信息,对查询的结果按年龄升序排序,年龄相同按入职时间升序排序; SELECT * FROM emp WHERE gender = '男' AND ( age BETWEEN '20' AND '40' ) ORDER BY age ASC ,entrydate ASC LIMIT 0,5; |
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
2020-02-01 Ansible-playbook