当前位置: 首页 > article >正文

Mysql学习笔记之SQL-3

这篇文章开始介绍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
  1. 每页查询五条记录,查询第一页数据
SELECT * FROM student LIMIT 0,5;
-- 或者
SELECT * FROM student LIMIT 5;
  1. 每页查询五条记录,查询第二页数据
SELECT * FROM student LIMIT 5,5;

分页查询与where条件连用

  1. 查询分组大于60的数据,每页显示五条记录,查询第一页数据
SELECT * FROM student WHERE grade > 60 LIMIT 0,5;

http://www.kler.cn/a/447970.html

相关文章:

  • Windows中运行Linux(WSL)
  • 常见的哈希函数构造方法
  • libmodbus安装使用
  • 猫咪睡眠:萌态背后的奥秘与启示
  • 【HarmonyOS之旅】DevEco Studio的安装与环境配置
  • 04、Vue与Ajax
  • Nginx:刷新显示404
  • 【数据分析】活动效果评估
  • java中的继承
  • ARM 处理器平台 Ethernet Compliance 测试流程示例
  • 电脑运行库DirectX出问题怎么办?
  • 开源轮子 - Apache Common
  • 九大高效的前端测试工具与框架
  • 答:C++需要学到什么程度再开始学 qt 比较合理?
  • 【优选算法---分治】快速排序三路划分(颜色分类、快速排序、数组第K大的元素、数组中最小的K个元素)
  • Vue3 根据窗口的大小动态调整列表的长度
  • Java中双指针的介绍、分类及使用技巧示例
  • 游戏AI实现-寻路算法(Dijkstra)
  • 【机器人】机械臂位置、轨迹和转矩控制概要
  • 【计算机视觉基础CV-图像分类】01- 从历史源头到深度时代:一文读懂计算机视觉的进化脉络、核心任务与产业蓝图
  • 从0-1开发一个Vue3前端系统页面-9.博客页面布局
  • 医药垃圾分类管理系统|Java|SSM|JSP|
  • 【序】前端监控:打造高效稳定的用户体验
  • JAVA数字人创作文案视频链接提取数字人源码小程序+公众号+APP+H5
  • Mysql复习(二)
  • ES学习Promise对象(九)