这篇文章开始介绍SQL语句的第三部分,DQL(Data Query Language)数据库查询语言。
1.简介
DQL(Data Query Language)数据库查询语言,用来查询数据表中的记录,也是sql语句中最常用的部分,在一般的业务中查询需求是远大于增删改等其他操作的,并且在查询的过程中,还会涉及到条件查询、排序、分页等操作。
2.语法
SELECT 字段列表 FROM 表名列表 WHERE 条件列表
GROUP BY 分组字段列表 HAVING 分组后条件列表
ORDER BY 排序字段列表
LIMIT 分页参数
语法看起来很复杂,但是并不是每此查询都需要用到如此复杂的查询语句,可以由浅入深的进行学习。
- 简单查询
- 聚合查询
- 分组查询
- 排序查询
- 分页查询
每种查询都是可以任意组合的,可以根据实际业务需求自由搭配,例如先分组再排序,或者先排序再分页等等。下面分别介绍每种查询
3.简单查询
简单查询就是带条件或者不带条件查询
语法:
SELECT 字段1,字段2,... FROM 表名 [WHERE 条件];
WHERE条件是可省略的,不添加WHERE条件查询的是所有的数据,添加where条件则查询满足条件的数据。
WHERE条件中常用的比较符如下所示:
符号 | 作用描述 |
---|---|
> | 大于 |
>= | 大于等于 |
< | 小于 |
<= | 小于等于 |
= | 等于 |
<> 或 != | 不等于 |
BETWEEN … AND … | 基于范围之间,包含边界值 |
IN(…) | 包含在列表中,如in (1,2,3,4) |
LIKE | 模糊匹配,如 LIKE ‘张%’,或 LIKE ‘张_’ (_匹配单个字符, %匹配任意个字符) |
IS NULL 或者 IS NOT NULL | 判断是否为空 |
- 查询所有数据
SELECT * FROM 表名;
-- 查询学生表的所有数据
SELECT * FROM students;
- 查询指定字段
SELECT 字段1,字段2,... FROM 表名;
--查询学生表的名称和年龄
SELECT name,age FROM students;
- 字段别名
SELECT 字段1 [ AS 别名1 ] , 字段2 [ AS 别名2 ] ... FROM 表名;
-- 或者
SELECT 字段1 [ 别名1 ] , 字段2 [ 别名2 ] ... FROM 表名;
- 条件查询
SELECT * FROM 表名 WHERE 条件
-- 查询年龄大于18的学生
SELECT * FROM students WHERE age > 18;
-- 查询学号在1到20之间的学生
SELECT * FROM `student` WHERE id BETWEEN 1 AND 20;
-- 查询学号为1,3,4,5,7的学生
SELECT * FROM `student` WHERE id IN (1,3,4,5,7);
4.聚合查询
聚合函数用于对一组数据执行计算,并返回一个单一值。
常用的聚合函数有:
函数 | 功能 |
---|---|
count | 数量统计 |
max | 求最大值 |
min | 求最小值 |
avg | 求平均值 |
sum | 求和 |
- 统计学生表的人数
-- 语法
SELECT COUNT(字段名) FROM 表名;
-- 案例
SELECT COUNT(id) FROM student;
- 获取学生表中最大(最小)的年龄
-- 语法
SELECT MAX(字段名) FROM 表名;
-- 案例
SELECT MAX(age) FROM student;
SELECT MIN(age) FROM student;
- 获取平均年龄
-- 语法
SELECT AVG(字段名) FROM 表名;
-- 案例
SELECT AVG(age) FROM student;
- 年龄求和
-- 语法
SELECT SUM(字段名) FROM 表名;
-- 案例
SELECT SUM(age) FROM student;
当然聚合函数一般在实际业务中不会这么简单的使用,一般会在分组查询后使用。
5.分组查询
分组查询将数据集合按照一定的规则分组,并对每个分组执行聚合函数,如求和、平均、最大值和最小值等。
语法
SELECT 字段列表 FROM 表名 [ WHERE 条件 ] GROUP BY 分组字段名;
为了方便演示,这里需要给学生表(student)添加成绩字段,并添加数据
-- 添加字段
ALTER TABLE `student` ADD COLUMN `grade` int NULL AFTER `age`;
--插入数据
INSERT INTO `student` (`id`, `name`, `sex`, `age`, `grade`) VALUES (1, '张三', '男', 20, 80);
INSERT INTO `student` (`id`, `name`, `sex`, `age`, `grade`) VALUES (2, '李四', '男', 16, 60);
INSERT INTO `student` (`id`, `name`, `sex`, `age`, `grade`) VALUES (3, '王五', '男', 18, 90);
INSERT INTO `student` (`id`, `name`, `sex`, `age`, `grade`) VALUES (4, '李翠翠', '女', 16, 75);
INSERT INTO `student` (`id`, `name`, `sex`, `age`, `grade`) VALUES (5, '王芳芳', '女', 16, 50);
INSERT INTO `student` (`id`, `name`, `sex`, `age`, `grade`) VALUES (6, '赵琴', '女', 16, 90);
INSERT INTO `student` (`id`, `name`, `sex`, `age`, `grade`) VALUES (7, '皮洋洋', '男', 20, 80);
INSERT INTO `student` (`id`, `name`, `sex`, `age`, `grade`) VALUES (7, '张无忌', '男', 20, 80);
INSERT INTO `student` (`id`, `name`, `sex`, `age`, `grade`) VALUES (9, '张三丰', '男', 19, 75);
INSERT INTO `student` (`id`, `name`, `sex`, `age`, `grade`) VALUES (10, '张三丰1', '男', 17, 80);
INSERT INTO `student` (`id`, `name`, `sex`, `age`, `grade`) VALUES (11, '张三丰2', '男', 18, 60);
INSERT INTO `student` (`id`, `name`, `sex`, `age`, `grade`) VALUES (12, '张三丰3', '男', 19, 90);
INSERT INTO `student` (`id`, `name`, `sex`, `age`, `grade`) VALUES (13, '张三丰4', '男', 20, 75);
INSERT INTO `student` (`id`, `name`, `sex`, `age`, `grade`) VALUES (14, '张三丰5', '男', 18, 50);
INSERT INTO `student` (`id`, `name`, `sex`, `age`, `grade`) VALUES (15, '张三丰6', '男', 16, 80);
INSERT INTO `student` (`id`, `name`, `sex`, `age`, `grade`) VALUES (16, '张三丰7', '男', 19, 80);
INSERT INTO `student` (`id`, `name`, `sex`, `age`, `grade`) VALUES (17, '张三丰8', '男', 20, 90);
INSERT INTO `student` (`id`, `name`, `sex`, `age`, `grade`) VALUES (18, '张三丰9', '男', 18, 65);
INSERT INTO `student` (`id`, `name`, `sex`, `age`, `grade`) VALUES (19, '张三丰10', '男', 17, 75);
接下来可以对成绩进行分组,然后求取平均值或者年龄等。
- 对成绩进行分组,并统计各成绩段的人数
SELECT COUNT(id),grade FROM student GROUP BY grade;
- 对成绩进行分组,获取各成绩段人数的平均年龄
SELECT AVG(age),grade FROM student GROUP BY grade;
加上where条件
- 对成绩进行分组,并统计成绩大于等于80的人数
SELECT COUNT(id),grade FROM student WHERE grade >= 80 GROUP BY grade;
拓展
分组条件过滤除了使用where,还可以使用HAVING,但过滤方式与WHRERE有所区别:
- 执行时机不同:where是分组之前进行过滤,不满足where条件,不参与分组;而having是分组之后对结果进行过滤。
- 判断条件不同:where不能对聚合函数进行判断,而having可以。
语法
SELECT 字段列表 FROM 表名 GROUP BY 分组字段名 [ HAVING 分组后过滤条件 ];
6.排序查询
排序查询顾名思义就是对查询的结果进行排序。
语法
SELECT 字段列表 FROM 表名 ORDER BY 字段1 排序方式1 , 字段2 排序方式2 ;
排序方式分为两种,升序排序(ASC)和降序排序(DESC),省略不写默认为升序排序
- 对成绩程序排序
SELECT * FROM student ORDER BY grade;
-- 或者
SELECT * FROM student ORDER BY grade ASC;
- 对成绩降序排序
SELECT * FROM student ORDER BY grade DESC;
也可以对多个字段进行排序,多个字段排序时,只有当第一个字段的值相同时才会对第二个字段排序。
- 先对成绩升序排序,在对年龄降序排序
SELECT * FROM student ORDER BY grade ASC,age DESC;
7.分页查询
当数据表中的数据非常的多达到几百万甚至上千万时,一次展示这么多数据也不方便用户查看,这时就可以通过分页查询,每次查询一定量的数据。
语法
SELECT * FROM student ORDER BY grade ASC,age DESC;
注意
- 起始索引从0开始,起始索引 = (查询页码 - 1)* 每页显示记录数。
- 如果查询的是第一页数据,起始索引可以省略,直接简写为 limit 10
- 每页查询五条记录,查询第一页数据
SELECT * FROM student LIMIT 0,5;
-- 或者
SELECT * FROM student LIMIT 5;
- 每页查询五条记录,查询第二页数据
SELECT * FROM student LIMIT 5,5;
分页查询与where条件连用
- 查询分组大于60的数据,每页显示五条记录,查询第一页数据
SELECT * FROM student WHERE grade > 60 LIMIT 0,5;