DQL语言-数据查询语言
DQL(Data Query Language)语言是用来检索表中数据的语言
语法
执行顺序
SELECT 子句 6
FROM 子句 1
JOIN… ON… 子句 2
WHERE 子句 3
GROUP BY 子句 4
HAVING 子句 5
ORDER BY 子句 7
LIMIT子句 8
基础查询
一条DQL语句中至少要包含的子句有两个:SELECT子句和FROM 子句
SELECT子句用来指定检索表中哪些字段
FROM 子句用来指定检索哪些表
具体语法
SELECT 字段1[,字段2,…] 字段可以是具体字段名,也可以是"*",也可以是函数或表达式 FROM 表1[,表2]
例
SELECT * FROM 表名,可以检索表中所有记录,并且结果集会列出该表每条记录所有字段
检索teacher表中所有记录
SELECT * FROM teacher
上述SQL中SELECT子句中我们使用"“,”"表达查询该表中的所有字段.
注:
> 实际开发中,我们不要使用SELECT > > 原因: 当数据库看到SELECT * 时,会去检索数据字典了解该表的表结构,从而确定表中的字段名然后进行检索.这会消耗不必要的性能开销. > > 如果是临时手动执行SQL可以使用SELECT
**后期我们都是在JAVA代码中执行SQL语句,此时不能使用SELECT ***
检索表中某些字段的值
WHERE子句
在DQL中添加WHERE子句时,可以仅将满足WHERE子句要求的记录检索出来
连接多个条件
- AND:“与”,都为真时才为真
- OR:“或”,都为假时才为假
AND优先级高于OR的
为了提高OR的优先级,可以使用"()"
IN(列表)
IN(列表):判断是否等于列表中的其中之一
NOT IN(列表)
NOT IN(列表):判断不在列表中
BETWEEN…AND….
BEWTEEN…AND…用于判断是否在一个区间范围内
DISTINCT去重
DISTINCT关键字要紧跟在SELECT关键字之后
作用:可以将DISTINCT后面指定的字段值相同的记录从结果集中去除.
LIKE,模糊查询
LIKE中有两个通配符:
- _:下划线表示任意一个字符(1个)
- %:百分号表示任意个字符(0-多个) 组合示范
LIKE ‘%X%’:字符串中含有X(X前面可以有任意个字符,后面也可以有任意个字符)
LIKE ‘_X%’:字符串中第二个字符是X
LIKE ‘X%’ :字符串以X开头
LIKE ‘%X’ :字符串以X结尾
LIKE ‘%X_Y’:字符串倒数第三个字符是X,最后一个字符是Y
NULL值判断
判断一个字段的内容是否为空:
IS NULL:判断字段值为空
IS NOT NULL:判断字段值不为空
不可以使用=或<>判断NULL值
ORDER BY-排序
ORDER BY子句,用于对结果集按照指定的字段进行升序或降序排序.
- ORDER BY 字段名 [ASC]:将结果集按照指定的字段升序排(从小到大)
- ORDER BY 字段名 DESC:将结果集按照指定的字段降序排(从大到小)
- 可以按照多字段排序,排序存在优先级,有线按照第一个字段排序结果集,当第一个字段值相同的记录再按照第二个字段排序以此类推.
- 不指定排序方式时,默认为升序 ORDER BY
- 子句应当是DQL中最后一个子句(由于方言的存在,在Mysql,MariaDB中分页使用时会在其后追加LIMIT子句)
分页查询
将一个DQL的查询结果集分段查询出来.
场景
当一个DQL语句查询的结果集记录数很多时,我们就可以分段将数据查询数来,提高查询速度减少资源开销
方言
分页没有在SQL92中定义规定的语法,因此分页是方言,不同的数据库分页语法可能完全不一样.
在Mysql和MariaDB中使用LIMIT子句来完成,而ORACLE则是使用ROWNUM伪列来完成.
语法
ORDER BY 字段
LIMIT M,N
M表示跳过结果集中的多少条记录
N检索出多少条记录
在分页中常见的两个参数:
每页显示的记录数
当前要显示第几页
分页的计算公式:
*M:(当前页数-1)每页显示的记录数
N:每页显示的记录数
当前显示第3页,每页显示5条记录
M:(当前页数-1)*每页显示的记录数 -> m=(3-1)*5 m=10 跳过10条记录
N:每页显示的记录数 n=5 LIMIT 10,5
DQL中使用函数或表达式
在SELECT子句中使用表达式
例
查看每个老师的工资和年薪
SELECT salary,salary*12
FROM teacher
在SELECT子句中使用函数
IFNULL函数
定义:
IFNULL(arg1,arg2)
当arg1不为NULL时,函数返回arg1的值,如果arg1为NULL则函数返回arg2的值.
IFNULL的功能就是将一个NULL值替换为一个非NULL值
内部逻辑,用java代码示意
IFNULL(arg1,arg2){
if(arg1!=null){
return arg1;
}else{
return arg2;
}
}