摘要:本文围绕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 表中查询并返回指定字段 nameentrydate

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;

MySQL员工管理系统中的数据查询操作实践_数据库

3.4 去除重复值查询

使用 DISTINCT 关键字查询员工表中有哪几种不同的职位,去除重复结果。

SELECT DISTINCT job FROM emp;

MySQL员工管理系统中的数据查询操作实践_条件查询_02

四、条件查询

学习条件查询就是学习条件的构建方式,而在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;

MySQL员工管理系统中的数据查询操作实践_字段_03

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;

六、分页查询

MySQL员工管理系统中的数据查询操作实践_mysql_04


分页查询语法:

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字段下相同的数据归为一组)

MySQL员工管理系统中的数据查询操作实践_条件查询_05

  • 先查询入职时间在“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;

MySQL员工管理系统中的数据查询操作实践_数据_06