MySQL 查询语句总结(基础查询、条件查询、模糊查询、聚合查询、排序查询、分页查询、连表查询) - 指南
一、基础查询
(一)查询关键字与基本语法
查询关键字:select
基础语法为 “select 字段 from 表名”
示例 1:查询某一个字段
查询 student 表中的 name 字段
select name from student;
示例 2:查询多个字段
查询 student 表中的 name、sex、age 字段
select name,sex,age from student;
(二)查询所有列
语法:select * from 表名;
示例:查询 student 表中所有列的数据
select * from student;
(三)条件查询
关键字:where ,where用于指定查询条件
语法为 “where 条件列 运算符 值”(字符串需加单引号 '')
常用运算符:包含 >、<、>=、<= 以及不等于(!= 或 <>)
具体示例:
1.运用运算符进行查询:
查询名字为张三的人
select * from student where name = '张三';
查询年龄不等于 20 的同学
select * from student where age !=20;
select * from student where age <> 20;
2.区间查询:between ...and...,查询条件列的值介于两个值之间
select * from student where age between 20 and 20;
3.多值匹配:in, 判断条件列的区间是否包含指定多个值
select * from student where id in (1,2,3,4);
select * from student where id in ('张三','李四');
4.空值判断:查询字段为空的记录
select * from student where class_num is null;
5.多条件查询:
和关系(and):同时满足多个条件
select * from student where class_num = '20201001' and sex = '男';
或关系(or):满足任意一个条件即可
select * from student where sex = '女' and class_num !='20201001' or class_num ='20201001' and sex = '男';
(四)模糊查询
关键字:like
用于根据关键词进行搜索,搭配通配符使用
通配符说明:% 可以匹配任意字符;_ 只能匹配一个字符(例如 “王_” 只能匹配两个字且姓王的名字)
具体示例:
1.查询姓王的学生
select * from student where name like '王%';
2.查询名字中包含 “王” 字的学生
select * from student where name like '%王%';
查询名字为 “王 X”(两个字且姓王)的学生
select * from student where name like '王_';
二、分组查询 / 聚合查询
(一)聚合函数
常用聚合函数及功能:
- sum:对指定字段求和。
- avg ():计算指定字段的平均值。
- max ():获取指定字段的最大值。
- min ():获取指定字段的最小值。
- count:统计记录数,查询结果为一个值,而非一列表。聚合函数示例:
- 查询同学中年龄的最大值
1.查询表中的某个字段的最大值
select max(age) from student;
2.查询表中的记录总
select count(*) from student;
select count(class_num) from student;
(二)分组查询
关键字:group by
用于根据指定字段进行分组
字段命名:查询时可对聚合函数结果重命名,语法为 “select 聚合函数 (字段) (空格) 新字段名“
具体示例:
1.查询每个班的平均年龄
select avg(age) avg_age from student GROUP BY class_num;
2.查询各个班级的男女同学数量,需结合 group by 与 count 函数实现
select count(*) sex_count ,sex , class_num from student group by class_num,sex
三、查询排序
关键字:order by 用于对查询结果进行排序
默认排序规则:根据 id 从小到大排序,新插入的数据因 id 较大,默认显示在末尾。
排序方式:
1.正序排列:默认按升序排列,也可显式指定 asc(通常省略)
select * from student order by age;
2.倒序排列:在字段后加 desc
select * from student order by age desc;
3.特殊需求:将新插入的数据放到最前面展示
select * from student order by id desc;
四、分页查询(限制查询)
(一)语法格式
格式 1:
limit pageSize offset pageStart(pageSize 为每页查询条数,pageStart 为查询起始位置)
格式 2:
limit pageStart, pageSize(与格式 1 功能一致,仅参数顺序不同)
(二)参数说明
前端通常提供 pageSize(每页显示数量)和 pageIndex(页码,如 1、2、3...)
换算关系:pageStart = (pageIndex - 1) * pageSize,因此分页查询语句可表示为 “limit pageSize offset (pageIndex - 1)*pageSize”
(三)具体示例
每页展示 5 条数据,limit pageSize offset pageStart
#假设每页显示5条数据
select * from student limit 5 offstet 0;#第一页
select * from student limit 5 offstet 5;#第二页
select * from student limit 5 offstet 10;#第三页
select * from student limit 5 offstet 15;#第四页
另一种写法 limit pageStart pageSize
#另一种写法 limit pageStart pageSize
select * from student limit 5 ,0;#第一页
select * from student limit 5 ,5;#第二页
select * from student limit 5 ,10;#第三页
select * from student limit 5 , 15;#第四页
五、连表查询(跨表查询)
(一)基本概念
适用场景:查询涉及多张表的数据,例如查询每个学生的班级名称
笛卡尔积现象:两张表进行连接查询时,若未添加任何条件限制,查询结果总数为两张表记录数的乘积
例子:
表一:class

表二:student

这两张表的笛卡尔积现象:
select s.name,c.class_name from student s,class c;
student s,class c:给两个表起了简称
方法:原表名 (空格)新表名
查询结果:

(二)连接语法
1. SQL 92 语法
语法:select XXX from A 表,B 表 where 表连接条件 and 数据查询条件
示例 1(表连接条件):查询学生姓名与对应班级名称
select s.name,c.class_name from student s,class c where s.class_num = c.class_num(表连接条件);
示例 2(表连接条件和数据查询条件):查询张三对应的班级名称
select s.name,c.class_name from student s,class c where s.class_num = c.class_num and s.name = '张三';
缺点:提前把where占用了,并且表连接条件与数据查询条件被放在了一起
2. SQL 99 语法
语法:select XXX 字段(需标明所属表)from A 表名称 join B 表名称 on 表的连接条件
核心要求:查询的字段必须明确来自哪张表
示例:查询学生姓名与对应班级名称
select s.name,c.class_name from student s join class c on s.class_num = c.class_num;
(三)连接方式
1. 内连接(inner join)
语法:select XXX 字段 from A 表名称 inner join B 表名称 on 表的连接条件
功能:仅查询两张表中满足连接条件的相交部分数据
示例:查询学生姓名与对应班级名称
select s.name,c.class_name from student s inner join class c on s.class_num = c.class_num;
结果说明:student 表中有 17 条数据,该查询仅返回 15 条结果,class_num 无法与 class 表匹配的两条数据(如 id=16、id=17 的学生)不显示。
2. 左外连接(left join)
语法:select XXX 字段 from 左表 left join 右表 on 表的连接条件
功能:默认显示左表的全部信息,右表仅显示满足连接条件的数据,不满足则显示为 null
示例:查询学生姓名与对应班级名称(左表为 student,右表为 class)
select s.name,c.class_name from student s left join class c on s.class_num = c.class_num;
结果说明:
左表(student)的 17 条数据全部显示
右表(class)中无匹配的 class_num 对应的 class_name 显示为 null(如 id=16 的学生 class_num=20201004,id=17 的学生 class_num 为 null,对应的 class_name 均为 null)
右表中 “数学” 班级(class_num=20201005)无对应学生,不显示。
3. 右外连接(right join)
语法:select XXX 字段 from 左表 right join 右表 on 表的连接条件
功能:默认显示右表的全部信息,左表仅显示满足连接条件的数据,不满足则显示为 null
示例:查询学生姓名与对应班级名称(左表为 student,右表为 class)
select s.name,c.class_name from student s right join class c on s.class_num = c.class_num;
结果说明:
右表(class)的 4 个班级全部显示
左表(student)中无对应 class_num 的数据(如 “数学” 班级)显示为 null
左表原本 17 条数据,仅显示满足连接条件的 15 条,不满足的两条数据不显示

浙公网安备 33010602011771号