目录
一、概述
DQL:Data Query Language 数据查询语言,用来查询数据库中表的记录。
查询关键字:SELECT
DQL语法:
SELECT 字段列表
FROM 表名列表
WHERE 条件列表
GROUP BY 分组字段列表
HAVING 分组后条件列表
ORDER BY 排序字段列表
LIMIT 分页参数;
主要掌握:
-
基本查询
-
条件查询(WHERE)
-
聚合函数(count、max、min、avg、sum)
-
分组查询(GROUP BY)
-
排序查询(ORDER BY)
-
分页查询(LIMIT)
二、DQL-基本查询
1、查询多个字段
SELECT 字段1, 字段2, 字段3 ...... FROM 表名;
查询所有字段:
SELECT * FROM 表名;
2、设置别名 AS
SELECT 字段1 [AS 别名1], 字段2 [AS 别名2] ..... FROM 表名;
3、去除重复记录 DISTINCT
SELECT DISTINCT 字段列表 FROM 表名;
DQL-基本查询练习案例
-- --------- DQL 基本查询 ---------
-- 准备数据 --
USE my_database;
# 1、创建表
CREATE TABLE emp(
number int COMMENT '员工编号',
worker_id VARCHAR(10) COMMENT '工号',
name VARCHAR(10) COMMENT '姓名',
gender CHAR(1) COMMENT '性别',
age TINYINT COMMENT '年龄',
id_card CHAR(18) COMMENT '身份证号',
work_address VARCHAR(50) COMMENT '工作地址',
entry_date DATE COMMENT '入职时间'
)COMMENT '员工信息表';
# 查询表结构
DESC emp;
# 2、插入数据
INSERT INTO emp (number, worker_id, name, gender, age, id_card,work_address, entry_date)
VALUES
(1, '1', '柳岩', '女', 20, '123456789012345678', '北京', '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');
# 查看表数据
SELECT * FROM emp;
-- 案例
-- 1.查询所有员工的姓名、年龄、性别
# 查询多个字段
SELECT name,age,gender FROM emp;
-- 2.查询所有员工的工作地址并设置可读性更好的中文别名“工作地点”
# 设置别名
SELECT work_address AS '工作地址' FROM emp;
# 可省略AS
# SELECT work_address '工作地址' FROM employees;
-- 3.查询所有员工的工作地址,查询结果不要重复
SELECT DISTINCT work_address AS '工作地址' FROM emp;
二、DQL-条件查询
DQL-条件查询
1、语法
SELECT 字段列表 FROM 表名 WHERE 条件列表;
2、条件
WHERE语句常用的查询条件:
-
条件 语句
-
比较 =, >, <, >=, <=, (<>, != 不等于)
-
逻辑运算 AND, OR, NOT, XOR
-
范围判断 BETWEEN AND, NOT BETWEEN AND
-
集合判断 IN, NOT IN
-
字符匹配 LIKE, NOT LIKE 通配符 %, _
-
空值判断 IS NULL, IS NOT NULL, ISNULL()
DQL-条件查询练习案例
-- --------- DQL 条件查询 ----------
USE my_database;
-- 1.查询年龄等于88岁的员工
# 条件查询:比较判断,等于
SELECT * FROM emp WHERE age = 88;
-- 2.查询年龄小于或等于20岁的员工
# 条件查询:比较判断,小于等于
SELECT * FROM emp WHERE age <= 20;
-- 3.查询没有身份证号的员工
# 条件查询:空值判断
SELECT * FROM emp WHERE id_card IS NULL;
-- 4.查询有身份证号的员工
SELECT * FROM emp WHERE id_card IS NOT NULL;
-- 5.查询年龄不等于88岁的所有员工
# 条件查询:比较判断,不等于
SELECT * FROM emp WHERE age<>88;
-- 6.查询年龄在15~20岁之间的员工
# 条件查询:范围判断 BETWEEN
SELECT * FROM emp WHERE age BETWEEN 15 AND 20;
-- 7.查询性别为女,且年龄小于25岁的员工
# 条件查询:逻辑运算 AND
SELECT * FROM emp WHERE gender = '女' AND age < 25;
-- 8.查询年龄为18或20或40岁的员工
# 条件查询: 集合判断 IN
SELECT * FROM emp WHERE age IN(18,20,40);
-- 9.查询姓名为2个字的员工
# 条件查询:字符匹配 '_'
SELECT * FROM emp WHERE name LIKE '__';
-- 10.查询身份证号末尾为'X’的员工
# 条件查询:字符匹配 '%'
SELECT * FROM emp WHERE id_card LIKE '%X';
三、DQL-聚合函数
1、介绍
将一列数据作为一个整体,进行纵向计算。
2、常见聚合函数
count / max / min / avg / sum
3、语法
SELECT 聚合函数(字段列表) FROM 表名;
DQL-聚合函数练习案例
-- --------- DQL 聚合函数 --------
-- 1.统计员工总数
SELECT COUNT(*) FROM emp;
-- 2.统计平均年龄、最大年龄、最小年龄
SELECT AVG(age) FROM emp;
SELECT MAX(age) FROM emp;
SELECT MIN(age) FROM emp;
-- 3.查询谁的年龄最大?
SELECT name FROM emp WHERE age = (SELECT MAX(age) FROM emp);
-- 4.统计来自西安的员工年龄之和
SELECT SUM(age) FROM emp WHERE work_address = '西安';
四、DQL-分组查询
1、语法
SELECT 字段列表 FROM 表名 [WHERE 条件] GROUP BY 分组字段名 [HAVING 分组后过滤条件];
2、WHERE条件与HAVING条件的区别
-
执行时机不同:WHERE是分组之前进行过滤,不满足WHERE条件,不参与分组,而HAVING是分组之后对结果进行过滤。
-
判断条件不同:WHERE不能对复合函数进行判断,而HAVING可以。
分组查询案例:
-- --------- DQL 分组查询 ----------
USE my_database;
-- 1.根据性别分组,分别统计男性员工和女性员工的数量
SELECT gender, COUNT(*) FROM emp GROUP BY gender;
-- 2.根据性别分组,分别统计男性员工和女性员工的平均年龄
SELECT gender, AVG(age) FROM emp GROUP BY gender;
-- 3.查询年龄小于45岁的员工,并根据工作地址分组,获取员工数量大于3的工作地址
SELECT work_address AS '工作地点',
count(*) AS '员工数量'
FROM emp
WHERE age < 45
GROUP BY work_address
HAVING COUNT(*) >= 3;
五、DQL-排序查询
1、语法
SELECT 字段列表 FROM 表名 ORDER BY 字段1 排序方式1,字段2, 排序方式2;
2、排序方式
ASC:升序(默认值)
DESC:降序
注意:
-
如果是多字段排序,当第一个字段相同时,才会根据第二个字段进行排序。
排序查询练习:
-- ---------- DQL 排序查询 ----------
USE my_database;
-- 1.根据年龄对员工进行升序/降序排序
SELECT name, age FROM emp ORDER BY age ASC;
SELECT name, age FROM emp ORDER BY age DESC;
-- 2.根据入职时间对员工进行升序/降序排序
SELECT name, age, entry_date FROM emp ORDER BY entry_date ASC;
SELECT name, age, entry_date FROM emp ORDER BY entry_date DESC ;
-- 3.根据年龄对员工进行升序排序,年龄相同,再按照入职降序时间排序
select name,age,entry_date FROM emp ORDER BY age ASC , entry_date DESC ;
六、DQL-分页查询
1、语法
SELECT 字段列表 FROM 表名 LIMIT 起始索引, 查询记录数;
注意:
起始索引从0开始,起始索引=(查询页码-1)*每页显示的记录数;
分页查询是数据库的方言,不同数据库软件有不同的实现,MySQL中是LIMIT;
如果查询的是第一页数据,起始索引可以被忽略,直接可简写为LIMIT 10;(起始索引被省略)
-- ---------- 分页查询 ----------
USE my_database;
# 第1页
SELECT * FROM emp LIMIT 0, 10;
# 第2页
SELECT * FROM emp LIMIT 10, 10;
* DQL查询语句-综合练习
5个小任务:
1. 查询年龄为20/21/22/23岁的女性员工信息
2. 查询性别为男,且年龄在20-40岁(含)以内的姓名为三个字的员工
3. 统计年龄小于60岁的,男性员工和女性员工的人数
4. 查询所有年龄小于等于35岁的员工姓名和年龄,并对查询结果按照年龄升序排列,如果年龄相同,则按照入市时间降序排列
5. 查询性别为男,且年龄在20-40岁(含)以内的前3名员工信息,对结果按照年龄升序排序,年龄相同则按照入职时间升序排列
-- ---------- DQL-综合练习 ----------
USE my_database;
-- 1. 查询年龄为20/21/22/23岁的女性员工信息
SELECT * FROM emp WHERE age IN(20,21,22,23) AND gender = '女';
-- 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, entry_date
FROM emp
WHERE age <= 35
ORDER BY age ASC, entry_date DESC;
-- 5. 查询性别为男,且年龄在20-40岁(含)以内的前3名员工信息,对结果按照年龄升序排序,年龄相同则按照入职时间升序排列
SELECT *
FROM emp
WHERE (gender = '男')
AND (age BETWEEN 20 AND 40)
ORDER BY age ASC, entry_date DESC
LIMIT 0, 3;
* 关于DQL的编写顺序与执行顺序
编写顺序:
SELECT 字段列表
FROM 表名列表
WHERE 条件列表
GROUP BY 分组字段列表
HAVING 分组后条件列表
ORDER BY 排序字段列表
LIMIT 分页参数;
执行顺序:
FROM 表名列表
WHERE 条件列表
GROUP BY 分组字段列表
HAVING 分组后条件列表
SELECT 字段列表
ORDER BY 排序字段列表
LIMIT 分页参数;