DQL 查询表中的数据:查询语句(最复杂的语句)不会对数据库中的数据进行修改,只是一种显示数据的方式
语法格式:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | select 字段列表 from 表名列表 where 条件列表 group by 分组字段 having 分组之后的条件 order by 排序 limit 分页限定 |
一、基础查询
1、查询表所有行和列的数据,使用*表示所有列
1 | select * from 表名; |
2、查询指定列
1 | select 字段名 1 ,字段名 2 ,字段名 3 ,... from 表名; |
3、指定列的别名进行查询
使用别名的好处:显示的时候使用新的名字,并不修改表的结构
① 对列指定别名
1 | SELECT 字段名 1 AS 别名, 字段名 2 AS 别名... FROM 表名; |
② 对列和表同时指定别名
1 | SELECT 字段名 1 AS 别名, 字段名 2 AS 别名... FROM 表名 AS 表别名; |
表使用别名的原因,用于多表查询操作。
注意:as 关键字可以省略,省略后用空格分隔即可。
3、清除重复值
查询指定列并且结果不出现重复数据
1 | SELECT DISTINCT 字段名 FROM 表名; |
4、查询结果参与运算
① 某列数据和固定值运算
1 | SELECT 列名 1 + 固定值 FROM 表名; |
② 某列数据和其他列数据参与运算
1 | SELECT 列名 1 + 列名 2 FROM 表名; |
注意:
-
-
- 参与运算的必须是数值类型
- 如果两列中有一列为null,null参与的运算,计算结果为null,所以需要用到 ifnull()函数。
- ifnull(表达式1,表达式2) 表达式1:哪个字段需要判断是否为 null;表达式2:如果该字段为 null 后的替换值。
-
Demo:
1 | select math+ifnull(english, 0 ) as 总成绩 from student; |
二、条件查询
条件查询是对记录指定查询条件,对记录进行过滤。
语法格式:
1 | SELECT 字段名 FROM 表名 WHERE 条件; |
1、使用比较运算符
比较运算符:>、<、<=、>=、=、<> (<>在 SQL 中表示不等于,在MySQL中可以使用 != 来表示)
Demo:
1 2 | select * from student3 where age <> 20 ; select * from student3 where age != 20 ; // 查询 age 不等于20岁的学生 |
2、使用范围查询
关键字:between... and...(包含边界值)
Demo:
1 2 | select * from student where age between 20 and 23 ; select * from student where ange >= 20 and age<= 23 ; // 两者相等 |
3、使用 in(集合)
in 里面的每个数据都会作为一次条件,只要满足条件的就会显示。
1 | SELECT 字段名 FROM 表名 WHERE 字段 in (数据 1 , 数据 2 ...); |
Demo:
1 | select * from student where age [not] in( 18 , 20 , 23 ); // not 为可选值 |
4、使用模糊查询(Like 关键字)
Like 表示模糊查询,其中有两个通配符:"%" 匹配任意多个字符串;"_" 匹配任意一个字符。
1 | SELECT * FROM 表名 WHERE 字段名 LIKE '通配符字符串' ; |
Demo :
1 | select * from student where name like '%枫%' ; // 查询姓名中包含"枫"字的学生 |
5、使用逻辑运算符
逻辑运算符:
逻辑运算符 | 说明 |
and 或 && | 与,SQL中建议使用前者,后者并不通用 |
or 或 || | 或, |
not 或 ! | 非 |
Demo:
1 | select * from student where age> 18 or sex= '男' ; |
6、查询某一列为 Null 的值
Demo :
1 | SELECT * FROM student WHERE english IS (NOT) NULL; // 判断英语成绩不为 null的学生 |
注意:对 null 的值不能使用 = (!=)进行判断。
三、排序查询
通过 order by 子句,可以将查询出的结果进行排序(排序只是显示方式,不会影响数据库中数据的顺序)
语法格式:
1 | SELECT 字段名 FROM 表名 WHERE 字段=值 ORDER BY 字段名 [ASC|DESC]; |
ASC:升序,默认值;
DESC:降序
1、单列排序
单列排序是只按某一个字段进行排序。
Demo:
1 | select * from student order by age desc; |
2、组合排序
组合排序是同时对多个字段进行排序,如果第一个字段相等,则按第二个字段排序,依次类推。
1 | SELECT 字段名 FROM 表名 WHERE 字段=值 ORDER BY 字段名 1 [ASC|DESC], 字段名 2 [ASC|DESC]; |
Demo:
1 | select * from student order by age desc, math asc; // 查询所有数据,在年龄降序排序的基础上,如果年龄相同再以数学成绩升序排序 |
四、聚合函数
使用聚合函数可以进行纵向查询,可以对一列的值进行计算,然后返回一个结果值,聚合函数会忽略空值 null。
1、五个聚合函数
SQL 中的聚合函数 | 作用 |
max(列名) | 求这一列的最大值 |
min(列名) | 求这一列的最小值 |
avg(列名) | 求这一列的平均值 |
count(列名) | 统计这一列有多少条记录 |
sum(列名) | 对这一列求总和 |
2、语法格式
1 | SELECT 聚合函数(列名) FROM 表名; |
Demo:
1 | select count(*) as 总人数 from student; |
注意:聚合函数对于 NULL 的记录不会统计,如果统计个数则不要使用有可能为 null 的列,如果需要把 null 也统计进去需要使用 IFNull() 函数。
语法格式:
1 | IFNULL(列名,默认值) 如果列名不为空,返回这列的值。如果为 NULL,则返回默认值 |
Demo:
1 | select count(ifnull(id, 0 )) from student; |
五、分组查询
分组查询是指使用 Group By 语句对查询信息进行分组,相同数据作为一组。
语法格式:
1 | SELECT 字段 1 ,字段 2 ... FROM 表名 GROUP BY 分组字段 [HAVING 条件]; |
group by 将分组字段结果中相同内容作为一组,并且返回每组的第一条数据,所以单独分组没什么用处,分组的目的就是为了统计,一般分组会和聚合函数一起使用。
注意:当我们使用某个字段分组,在查询的时候也需要将这个字段查询出来,否则看不到数据属于哪组的。
Demo:
1 | select sex, count(*) from student group by sex; // 对学生表按照性别分组,并统计每组人数 |
having 和 where 的区别
子名 | 作用 |
where 子句 | 1) 对查询结果进行分组前, 将不符合 where 条件的行去掉, 即在分组之前过滤数据, 即先过滤再分组。 2) where 后面不可以使用聚合函数 |
having 子句 | 1) having 子句的作用是筛选满足条件的组,即在分组之后过滤数据,即先分组再过滤。 2) having 后面可以使用聚合函数 |
六、分页查询
limit 是限制的意思,所以 limit 的作用就是限制查询记录的条数。
语法格式:
1 | SELECT *|字段列表 [as 别名] FROM 表名 [WHERE 子句] [GROUP BY 子句][HAVING 子句][ORDER BY 子句][LIMIT 子句]; |
LIMIT 语法格式:
1 | LIMIT offset,length; |
offset:起始行数,从 0 开始计数,如果省略,默认就是0
length:返回的行数
Demo:
1 | select * from student3 limit 10 , 5 ; |
注意:
① 如果第一个参数是 0 可以省略写
② 如果最后一页不够显示的条数,有多少显示多少
③ 显示记录公式:开始的索引 = (当前的页码 - 1)* 每页显示的条数
④ limit 是一个“MySQL”的方言(只适用于MySQL中)
七、DOS 命令窗口操作数据乱码问题的解决
1、使用 DOS 命令进行 SQL 语句操作可能会出现中文乱码现象
2、乱码产生的原因
3、查看 MySQL 内部设置的编码
查看包含 character 开头的全局变量
1 | show variables like 'character%' ; |
执行效果:
4、解决方法
修改 client、connection、results 的编码为 GBK,保证和 DOS 命令行编码保存一致。
单独设置 | 说明 |
set character_set_client=gbk; | 修改客户端的字符集为 GBK |
set character_set_connection=gbk; | 修改连接的字符集为 GBK |
set character_set_results=gbk; | 修改查询的结果字符集为 GBK |
同时设置三项
1 | set names gbk; |
注意:退出 DOS 命令行就失效了,需要每次都配置
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 没有源码,如何修改代码逻辑?
· 一个奇形怪状的面试题:Bean中的CHM要不要加volatile?
· [.NET]调用本地 Deepseek 模型
· 一个费力不讨好的项目,让我损失了近一半的绩效!
· .NET Core 托管堆内存泄露/CPU异常的常见思路
· 微软正式发布.NET 10 Preview 1:开启下一代开发框架新篇章
· C# 集成 DeepSeek 模型实现 AI 私有化(本地部署与 API 调用教程)
· DeepSeek R1 简明指南:架构、训练、本地部署及硬件要求
· 没有源码,如何修改代码逻辑?
· NetPad:一个.NET开源、跨平台的C#编辑器