[MySQL]DQL语句(一)

查询语句是数据库操作中最为重要的一系列语法。查询关键字有 select、where、group、having、order by、imit。其中imit是MySQL的方言,只在MySQL适用。

数据库查询又分单表查询和多表查询,这里讲一下单表查询。

基础查询

sql 复制代码
# 查询指定列
SELECT * FROM 表名
# 查询所有列
SELECT 列名1,列名2,... FROM 表名

" * " 表示所有

条件查询

关键字WHERE

sql 复制代码
WHERE 筛选条件

NULL的特殊性

null数据在mysql中比较特殊,在值运算中,任何值与null进行运算结果都为null;在逻辑运算中,任何条件与null进行逻辑运算结果都为false。在逻辑运算中,如果想表示不为空或者为空,格式应当为: 值 IS NOT NULL 或 IS NULL。

运算符和关键字

|-----------------|--------------|
| = | 等于 |
| != | 不等于 |
| <> | 不等于 |
| < | 小于 |
| <= | 小于等于 |
| > | 大于 |
| >= | 大于等于 |
| BETWEEN a AND b | 在a和b之间,包含a和b |
| IN(值1,值2,...) | 属于所举的值 |
| IS NULL | 为空 |
| AND、&& | 与 |
| OR、|| | 或 |
| NOT、! | 非 |

NOT一般和IS NULL 和 IN 搭配使用,组成IS NOT NULL 和 NOT IN,分别表示不为空和不属于

模糊查询

模糊查询可以在所有的字符串类型的数据的查询中使用。

模糊查询需要在WHERE语句中使用

通配符

关键字LIKE中,符号""用于表示任意的字符,10个连续的""就表示长度为10的任意字符串

关键字LIKE中,符号"%"用于表示0~n个任意的字符

下面举例说明

sql 复制代码
# 查询长度为6且第3和第4个字符为"5h"的字符串
WHERE str LIKE '__5h__';

# 查询以'@163.com'结尾的字符串
WHERE str LIKE '%@163.com';

# 查询包含子字符串"lai"的字符串
WHERE str LIKE '%lai%';

字段控制查询

去除重复记录

在一张表中某个字段有着重复的记录,要查询结果去除重复记录,需要使用关键字DISTINCT,字段名处可以为多个字段或"*"

sql 复制代码
# 查询student表的'name'字段并去除重复记录
SELECT DISTINCT name FROM student;

添加别名

添加别名需要使用关键字AS

查询数据时,不只能够查询已有的字段名,还可以以原有的字段为基础,添加新的列。

例:查询所有的员工信息,添加一行,其值为基础工资+奖金

sql 复制代码
SELECT *,sal+comm FROM emp;

像上例代码进行查询时,最终结果里最后一列上方的字段名为显示为sal+comm,这时候为了美观,就需要使用到关键字 AS 来添加别名。

sql 复制代码
# 设置别名时可以不添加'',使用''包围字符也不会有影响
SELECT *,sal+comm AS 总工资 FROM emp;

# 不只是自定义的字段才能用添加别名,添加别名时, AS 可以省略不写
SELECT name 姓名,id 学号 FROM student;

转换NULL

在运算中,如果碰到了NULL值会影响最终查询结果,这时需要使用运算式IFNULL(字段名,替换值),在查询时如果某条记录的"字段名"处的值为null,则将其替换为替换值进行匹配。

替换值只在进行匹配时使用,不会替换掉记录中的null值,也不会影响最终显示结果

sql 复制代码
# 查询所有字段并添加一行,其数据为sal + comm的值,若comm值为null,则替换为0进行运算
SELECT *,sal+IFNULL(comm,0) AS 总工资 FROM emp;

# 查询所有字段,条件是name的值不为空。若name值为空,则将null替换成'蒂蒂'进行逻辑运算
SELECT * FROM stu WHERE IFNULL(name,'蒂蒂') IS NOT NULL; 

为了方便解释上方红色字体一行,这里放一下第二个例子的查询结果

排序

排序需要使用到关键字ORDER BY

其中ASC表示升序排序,也是默认值;DESC表示降序排序。

sql 复制代码
# 字段名1可以是字段2,升序排序,ASC是默认值,可以不写
SELECT 字段名1 FROM 表名 ORDER BY 字段名2 [ASC];

# 降序排序的DESC就不可以省略了

# 先按年龄降序排序,再按学号升序排序
SELECT * FROM student ORDER BY age DESC,id [ASC];

聚合函数

聚合函数是纵向计算的函数,一般在SELECT语句中使用

函数 描述
COUNT() 统计指定列不为NULL的记录行数
MAX() 计算指定列的最大值,字符串类型列使用字符串排序运算
MIN() 计算指定列的最小值,字符串类型列使用字符串排序运算
SUM() 计算指定列的数值和,如果列类型不是数值类型,计算结果为0
AVG() 计算指定列的平均值,如果列类型不是数值类型,计算结果为0

NULL值不参与所有的聚合函数计算,写语:

sql 复制代码
SELECT 聚合函数(字段列表) FROM 表名 ;

分组查询

分组查询需要使用GROUP BY关键字

聚合函数经常和分组查询GROUP BY 一起使用,而且聚合函数往往会在分组查询后才执行,这里关系到MySQL查询语句的执行顺序,具体可查看我的另一篇文章:查询语句的执行顺序

sql 复制代码
SELECT 字段列表 FROM 表名 [ WHERE 条件 ] GROUP BY 分组字段名 [ HAVING 分组 后过滤条件 ];

分页查询

分页操作在业务系统开发时,也是非常常见的一个功能,我们在网站中看到的各种各样的分页条,后台

都需要借助于数据库的分页操作。MySQL使用LIMIT用来限定查询结果的起始行,以及总行数。

语法:

sql 复制代码
SELECT 字段列表 FROM 表名 LIMIT 起始索引, 查询记录数 ;

注意事项:

起始索引从0开始,起始索引 = (查询页码 - 1)* 每页显示记录数。这里另外提一下,有关字符串的函数,它们对字符串的起始索引为1,也就是想要表示该字符串中的第一个字符,应当使用1表示,而不是0。

分页查询目前没有统一的关键字,都是数据库的方言来实现,MySQL中是LIMIT。

如果查询的是第一页数据,起始索引可以省略,直接简写为 limit 10。

相关推荐
初晴~3 分钟前
【Redis分布式锁】高并发场景下秒杀业务的实现思路(集群模式)
java·数据库·redis·分布式·后端·spring·
盖世英雄酱581368 分钟前
InnoDB 的页分裂和页合并
数据库·后端
YashanDB2 小时前
【YashanDB知识库】XMLAGG方法的兼容
数据库·yashandb·崖山数据库
独行soc2 小时前
#渗透测试#漏洞挖掘#红蓝攻防#护网#sql注入介绍11基于XML的SQL注入(XML-Based SQL Injection)
数据库·安全·web安全·漏洞挖掘·sql注入·hw·xml注入
小林coding2 小时前
阿里云 Java 后端一面,什么难度?
java·后端·mysql·spring·阿里云
风间琉璃""3 小时前
bugkctf 渗透测试1超详细版
数据库·web安全·网络安全·渗透测试·内网·安全工具
drebander3 小时前
SQL 实战-巧用 CASE WHEN 实现条件分组与统计
大数据·数据库·sql
IvorySQL3 小时前
IvorySQL 4.0 发布:全面支持 PostgreSQL 17
数据库·postgresql·开源数据库·国产数据库·ivorysql
18号房客3 小时前
高级sql技巧进阶教程
大数据·数据库·数据仓库·sql·mysql·时序数据库·数据库架构
Dawnㅤ3 小时前
使用sql实现将一张表的某些字段数据存到另一种表里
数据库·sql