摘要:本文围绕MySQL数据库,通过创建员工表并插入相关数据,详细阐述了在员工管理场景下的各类数据查询操作。涵盖基本查询、条件查询、排序查询、分页查询以及分组查询等内容。
关键词:MySQL;数据查询;员工管理;聚合函数
参考资料\图片来源:黑马程序员
一、引言
DQL英文全称是Data Query Language(数据查询语言),用来查询数据库表中的记录。
查询关键字:SELECT
查询操作是所有SQL语句当中最为常见,也是最为重要的操作。在一个正常的业务系统中,查询操作的使用频次是要远高于增删改操作的。当我们打开某个网站或APP所看到的展示信息,都是通过从数据库中查询得到的,而在这个查询过程中,还会涉及到条件、排序、分页等操作。
二、准备数据:员工表创建与数据插入
2.1 员工表结构定义
创建名为 emp 的员工表,用于存储员工的详细信息,包括员工 ID、用户名、密码、姓名、性别、图像、职位、入职时间、创建时间及修改时间。
CREATE TABLE emp (
    id INT UNSIGNED PRIMARY KEY AUTO_INCREMENT COMMENT 'ID',
    username VARCHAR(20) NOT NULL UNIQUE COMMENT '用户名',
    password VARCHAR(32) DEFAULT '123456' COMMENT '密码',
    name VARCHAR(10) NOT NULL COMMENT '姓名',
    gender TINYINT UNSIGNED NOT NULL COMMENT '性别, 说明: 1 男, 2 女',
    image VARCHAR(300) COMMENT '图像',
    job TINYINT UNSIGNED COMMENT '职位, 说明: 1 班主任,2 讲师, 3 学工主管, 4 教研主管',
    entrydate DATE COMMENT '入职时间',
    create_time DATETIME NOT NULL COMMENT '创建时间',
    update_time DATETIME NOT NULL COMMENT '修改时间'
) COMMENT '员工表';2.2 数据插入
向 emp 表中插入多条员工记录,为后续查询操作提供数据基础。
INSERT INTO emp
        (id, username, password, name, gender, image, job, entrydate, create_time, update_time) VALUES
        (1, 'jinyong', '123456', '金庸', 1, '1.jpg', 4, '2000 - 01 - 01', NOW(), NOW()),
        (2, 'zhangwuji', '123456', '张无忌', 1, '2.jpg', 2, '2015 - 01 - 01', NOW(), NOW()),
        -- 此处省略部分数据以节省篇幅
        (29, 'zhang12', '123456', '张十二', 1, '2.jpg', 2, '2020 - 01 - 01', NOW(), NOW());三、基本查询
3.1 查询指定字段
从 emp 表中查询并返回指定字段 name 和 entrydate。
SELECT name, entrydate FROM emp;3.2 查询所有字段
- 方式一:明确列出所有字段,这种方式效率较高且更直观。
SELECT id, username, password, name, gender, image, job, entrydate, create_time, update_time FROM emp;- 方式二:使用通配符 *表示所有字段。
SELECT * FROM emp;3.3 字段别名设置
为查询结果中的字段设置别名,使结果展示更具可读性,AS 关键字可省略。
select name as 姓名 ,entrudate as 入职日期 from emp;
SELECT name AS '姓名', entrydate AS '入职日期' FROM emp;
-- 省略AS关键字 使用''或""包含
SELECT name '姓名', entrydate '入职日期' FROM emp;
3.4 去除重复值查询
使用 DISTINCT 关键字查询员工表中有哪几种不同的职位,去除重复结果。
SELECT DISTINCT job FROM emp;
四、条件查询
学习条件查询就是学习条件的构建方式,而在SQL语句当中构造条件的运算符分为两类:
- 比较运算符
- 逻辑运算符
常用的比较运算符如下:
| 比较运算符 | 功能 | 
| > | 大于 | 
| >= | 大于等于 | 
| < | 小于 | 
| <= | 小于等于 | 
| = | 等于 | 
| <> 或 != | 不等于 | 
| between … and … | 在某个范围之内(含最小、最大值) | 
| in(…) | 在in之后的列表中的值,多选一 | 
| like 占位符 | 模糊匹配(_匹配单个字符, %匹配任意个字符) | 
| is null | 是null | 
常用的逻辑运算符如下:
| 逻辑运算符 | 功能 | 
| and 或 && | 并且 (多个条件同时成立) | 
| or 或 || | 或者 (多个条件任意一个成立) | 
| not 或 ! | 非 , 不是 | 
4.1 基于字段值的简单条件查询
语法:
select  字段列表  from   表名   where   条件列表 ; 
-- 条件列表:意味着可以有多个条件- 查询姓名为“杨逍”的员工信息。
SELECT id, username, password, name, gender, image, job, entrydate, create_time, update_time 
FROM emp WHERE name = '杨逍';- 查询 id小于等于5的员工信息。
SELECT id, username, password, name, gender, image, job, entrydate, create_time, update_time
FROM emp WHERE id <= 5;4.2 空值判断查询
- 查询没有分配职位(job字段为NULL)的员工信息,使用IS NULL判断。
- 不能使用 = null。
SELECT id, username, password, name, gender, image, job, entrydate, create_time, update_time
 FROM emp WHERE job IS NULL;- 查询有职位(job字段不为NULL)的员工信息,使用IS NOT NULL判断。
SELECT id, username, password, name, gender, image, job, entrydate, create_time, update_time FROM emp WHERE job IS NOT NULL;4.3 不等值条件查询
查询密码不等于“123456”的员工信息,可使用 <> 或 != 表示不等。
SELECT * FROM emp WHERE password <> '123456';
SELECT * FROM emp WHERE password != '123456';4.4 范围查询
- 查询入职日期在“2000 - 01 - 01”(包含)到“2010 - 01 - 01”(包含)之间的员工信息,使用 BETWEEN... AND...。
SELECT * FROM emp WHERE entrydate BETWEEN '2000 - 01 - 01' AND '2010 - 01 - 01';- 查询入职时间在上述范围内且性别为女的员工信息,结合 AND运算符。
SELECT * FROM emp WHERE (entrydate BETWEEN '2000 - 01 - 01' AND '2010 - 01 - 01') AND gender = 2;4.5 多值匹配查询
- 查询职位是2(讲师)、3(学工主管)、4(教研主管)的员工信息,使用 OR连接条件。
SELECT * FROM emp WHERE job = 2 OR job = 3 OR job = 4;- 也可使用 IN关键字简化多值匹配。
SELECT * FROM emp WHERE job IN (2, 3, 4);4.6 模糊查询
- 查询姓名为两个字的员工信息,使用 LIKE结合下划线_通配符。
SELECT * FROM emp WHERE name LIKE '__';
-- 这是两个下划线- 查询姓“张”的员工信息,使用 LIKE结合百分号%通配符。
SELECT * FROM emp WHERE name LIKE '张%';- 查询姓名中包含“三”的员工信息。
SELECT * FROM emp WHERE name LIKE '%三%';4.7 综合条件查询练习
根据姓名、性别和入职日期的条件进行员工管理列表查询。
SELECT * 
FROM emp 
WHERE name LIKE '%张%' AND gender = 1 AND entrydate BETWEEN '2000 - 01 - 01' AND '2010 - 01 - 01';五、排序查询
语法:
select  字段列表  
from   表名   
[where  条件列表] 
[group by  分组字段 ] 
order  by  字段1  排序方式1 , 字段2  排序方式2 … ;5.1 升序排序
根据入职时间对员工进行升序排序,ASC 关键字表示升序,默认可省略。
SELECT * FROM emp ORDER BY entrydate ASC;
-- 省略ASC关键字
SELECT * FROM emp ORDER BY entrydate;5.2 降序排序
根据入职时间对员工进行降序排序,使用 DESC 关键字。
SELECT * FROM emp ORDER BY entrydate DESC;5.3 多条件排序
根据入职时间升序排序,若入职时间相同,则按照 update_time 降序排序。
SELECT * FROM emp ORDER BY entrydate ASC, update_time DESC;
5.4 综合排序查询练习
在员工管理列表查询中,结合条件查询并根据最后操作时间倒序排序。
SELECT * FROM emp WHERE name LIKE '%张%' AND gender = 1 AND entrydate BETWEEN '2000 - 01 - 01' AND '2010 - 01 - 01' ORDER BY update_time DESC;六、分页查询

 分页查询语法:
select  字段列表  from   表名  limit  起始索引, 查询记录数 ;6.1 基本分页查询
- 查询第1页员工数据,每页展示10条记录。
SELECT * FROM emp LIMIT 0, 10;
-- 当起始索引为0时可简化为
SELECT * FROM emp LIMIT 10;- 查询第2页员工数据,每页展示10条记录。起始索引计算公式为 (页码 - 1) * 每页记录数。
SELECT * FROM emp LIMIT 10, 10;6.2 综合分页查询练习
在员工管理列表查询中,结合条件查询、排序并进行分页。
SELECT * FROM emp WHERE name LIKE '%张%' AND gender = 1 AND entrydate BETWEEN '2000 - 01 - 01' AND '2010 - 01 - 01' ORDER BY update_time DESC LIMIT 0, 10;七、分组查询
常用聚合函数:
| 函数 | 功能 | 
| count | 统计数量 | 
| max | 最大值 | 
| min | 最小值 | 
| avg | 平均值 | 
| sum | 求和 | 
7.1 聚合函数使用
@ 统计员工数量:
- 使用 COUNT(字段),NULL值不参与运算。
SELECT COUNT(id) FROM emp;
SELECT COUNT(job) FROM emp;- 使用 COUNT(*)。推荐使用这个,MySQL优化了。
SELECT COUNT(*) FROM emp;- 使用 COUNT(常量)。
SELECT COUNT(1) FROM emp;
SELECT COUNT('A') FROM emp;@ 统计员工 ID 的平均值:
SELECT AVG(id) FROM emp;@ 统计最早入职的员工的入职日期:
SELECT MIN(entrydate) FROM emp;@ 统计最近入职的员工的入职日期:
SELECT MAX(entrydate) FROM emp;@ 统计员工的 ID 之和(没有实际意义,仅作练习):
SELECT SUM(id) FROM emp;7.2 分组统计
分组: 按照某一列或者某几列,把相同的数据进行合并输出。
分组其实就是按列进行分类(指定列下相同的数据归为一类),然后可以对分类完的数据进行合并计算。
分组查询通常会使用聚合函数进行计算。
语法:
select  字段列表  from  表名  [where 条件]  group by 分组字段名  [having 分组后过滤条件];- 根据性别分组,统计男性和女性员工的数量。
SELECT gender, COUNT(*) FROM emp GROUP BY gender;
-- 按照gender字段进行分组(gender字段下相同的数据归为一组)
- 先查询入职时间在“2015 - 01 - 01”(包含)以前的员工,再根据职位分组,获取员工数量大于等于2的职位。
SELECT job, COUNT(*) 
FROM emp WHERE entrydate <= '2015 - 01 - 01' GROUP BY job HAVING COUNT(*) >= 2;• 分组之后,查询的字段一般为聚合函数和分组字段,查询其他字段无任何意义
• 执行顺序:where > 聚合函数 > having
where与having区别
- 执行时机不同:where是分组之前进行过滤,不满足where条件,不参与分组;而having是分组之后对结果进行过滤。
- 判断条件不同:where不能对聚合函数进行判断,而having可以。
7.3 分组查询中的函数应用
- 统计男性与女性员工人数并标注性别:使用 IF函数。
- – if(条件表达式, true取值 , false取值)
SELECT
    IF(gender = 1, '男性员工', '女性员工') '性别',
    COUNT(*) '人数'
FROM emp GROUP BY gender;- 统计员工职位信息并标注职位名称:使用 CASE WHEN... THEN... ELSE... END语句。
SELECT
    (CASE 
    WHEN job = 1 THEN '班主任' 
    WHEN job = 2 THEN '讲师' 
    WHEN job = 3 THEN '教研主管' 
    WHEN job = 4 THEN '学工主管' 
    ELSE '无职位' END ) '职位',
    COUNT(*) 人数
FROM emp GROUP BY job;
-- 另一种写法
SELECT
    (CASE job 
    WHEN 1 THEN '班主任' 
    WHEN 2 THEN '讲师' 
    WHEN 3 THEN '教研主管' 
    WHEN 4 THEN '学工主管' 
    ELSE '无职位' 
    END ) '职位',
    COUNT(*) 人数
FROM emp GROUP BY job;
                
 
 
                     
            
        













 
                    

 
                 
                    