DQL:数据查询语言
2020-12-28 21:39:41 0 举报
AI智能生成
DQL:数据查询语言,思维导图
作者其他创作
大纲/内容
连接查询
sql92
内连接
等值连接
注意事项
①多表等值连接的结果为多表的交集部分
②n表连接,至少需要n-1个连接条件
③多表的顺序没有要求
④一般需要为表起别名
⑤可以搭配前面介绍的所有字句使用,比如排序、分组、筛选
②n表连接,至少需要n-1个连接条件
③多表的顺序没有要求
④一般需要为表起别名
⑤可以搭配前面介绍的所有字句使用,比如排序、分组、筛选
非等值连接
自连接
sql99
内连接(连接用inner表示)
等值连接
非等值连接
自连接
语法
select 查询列表
from 表1 别名
inner join 表2 别名
on 连接条件
from 表1 别名
inner join 表2 别名
on 连接条件
注意事项
①添加排序、分组、筛选
②inner可以省略
③筛选条件放在where后面,连接条件放在on后面,提高分离性,便于阅读
④inner join连接和sql92语法中的等值连接效果是一样的,都是查询多表的交集
②inner可以省略
③筛选条件放在where后面,连接条件放在on后面,提高分离性,便于阅读
④inner join连接和sql92语法中的等值连接效果是一样的,都是查询多表的交集
外链接
左外连接(left)
右外连接(right)
全外连接(full)
(mysql不支持)
特点
1.左外连接的查询结果为主表中的所有记录
如果从表中有和它匹配的,则显示匹配的值
如果从表中没有和它匹配的,则显示null
外连接查询结果=内连接结果+主表中有而从表中没有的记录
2.左外连接,left join左边的是主表
右外连接,right join右边的是主表
3.左外和右外交换两个表的顺序,可以实现同样的效果
如果从表中有和它匹配的,则显示匹配的值
如果从表中没有和它匹配的,则显示null
外连接查询结果=内连接结果+主表中有而从表中没有的记录
2.左外连接,left join左边的是主表
右外连接,right join右边的是主表
3.左外和右外交换两个表的顺序,可以实现同样的效果
交叉连接(cross)
语法
select 查询列表
from 表1 别名
cross join 表2 别名;
from 表1 别名
cross join 表2 别名;
特点
类似于笛卡尔乘积
语法
select 查询列表
from 表1 别名 [连接类型]
join 表2 别名
on 连接条件
[where 筛选条件]
[group by 分组]
[having 筛选条件]
[order by 排序列表]
from 表1 别名 [连接类型]
join 表2 别名
on 连接条件
[where 筛选条件]
[group by 分组]
[having 筛选条件]
[order by 排序列表]
sql99语法与sql92语法的比较
功能:sql99支持的较多
可读性:sql99实现连接条件和筛选条件的分离,可读性较高
可读性:sql99实现连接条件和筛选条件的分离,可读性较高
子查询
标量子查询(结果集只有一行一列)
select后面
举例
#查询每个部门的员工个数
SELECT d.*,(
SELECT COUNT(*)
FROM employee1 e
WHERE e.dept_id=d.`id`
) 个数
FROM deptment d;
SELECT d.*,(
SELECT COUNT(*)
FROM employee1 e
WHERE e.dept_id=d.`id`
) 个数
FROM deptment d;
where后面或having后面
举例
#③查询dept_id与1号员工相同,salary比2号员工多的员工信息
SELECT *
FROM employee1
WHERE dept_id=(
SELECT dept_id
FROM employee1
WHERE id=1
) AND salary>(
SELECT salary
FROM employee1
WHERE id=2
);
SELECT *
FROM employee1
WHERE dept_id=(
SELECT dept_id
FROM employee1
WHERE id=1
) AND salary>(
SELECT salary
FROM employee1
WHERE id=2
);
列子查询(结果集只有一行多列)
where后面或having后面
行子查询(结果集有一行多列)
where后面或having后面
表子查询(结果集一般为多行多列)
from后面
举例
SELECT g.`level` 等级,平均工资,部门编号
FROM(
SELECT AVG(salary) 平均工资,e.`dept_id` 部门编号
FROM employee1 e
GROUP BY dept_id
) avg_salary
INNER JOIN grades g
ON 平均工资 BETWEEN g.`lowest_sal` AND g.`highest_sal`;
FROM(
SELECT AVG(salary) 平均工资,e.`dept_id` 部门编号
FROM employee1 e
GROUP BY dept_id
) avg_salary
INNER JOIN grades g
ON 平均工资 BETWEEN g.`lowest_sal` AND g.`highest_sal`;
exists后面(相关子查询)
举例
SELECT EXISTS(SELECT * FROM employee1 WHERE salary=10000);
语法
语法:
exists(完整的查询语句)
结果:
1或0
exists(完整的查询语句)
结果:
1或0
含义
出现在其他语句中的select语句,称为子查询或内查询
外部的查询语句,称为主查询
外部的查询语句,称为主查询
特点
①子查询放在小括号内
②子查询一般放在条件的右侧
③标量子查询,一般搭配着单行操作符使用
当行操作符:> < <= >= <>
②子查询一般放在条件的右侧
③标量子查询,一般搭配着单行操作符使用
当行操作符:> < <= >= <>
列子查询,一般搭配着多行操作符使用
IN:等于列表中的任意一个
ANY/some:和子查询返回的某一个值比较
ALL:和子查询返回的所有值比较
IN:等于列表中的任意一个
ANY/some:和子查询返回的某一个值比较
ALL:和子查询返回的所有值比较
④子查询的执行优先于主查询执行,主查询的条件用到了子查询的结果
分页查询
语法
select 查询列表 ⑦
from 表1 ①
[join type]jion 表2 ②
on 连接条件 ③
where 筛选条件 ④
group by 分组字段 ⑤
having 分组后的筛选 ⑥
order by 排序的字段 ⑧
limit iffset,size; ⑨
offset 要显示条目的其实索引(其实索引从0开始)
size要显示的条目个数
from 表1 ①
[join type]jion 表2 ②
on 连接条件 ③
where 筛选条件 ④
group by 分组字段 ⑤
having 分组后的筛选 ⑥
order by 排序的字段 ⑧
limit iffset,size; ⑨
offset 要显示条目的其实索引(其实索引从0开始)
size要显示的条目个数
特点
①limit 语句放在查询语句的最后
②公式:
要显示的页数page,每页的条目数size
select 查询列表
from 表
limit(page-1)*size size;
②公式:
要显示的页数page,每页的条目数size
select 查询列表
from 表
limit(page-1)*size size;
注意
offset代表的是起始的条目索引,默认从0开始
size代表的是显示的条目数
size代表的是显示的条目数
联合查询
语法
查询语句1
union
查询语句2
union
...
union
查询语句2
union
...
应用场景:
要查询的结果来自于多个表,且多个表没有直接的连接关系,但查询的信息一致时
特点
1.要求多条查询语句的查询列数是一致的!
2.要求多条查询语句的查询的每一列的类型和顺序最好一致
3.union关键字默认去重,如果使用union all可以包含重复项
2.要求多条查询语句的查询的每一列的类型和顺序最好一致
3.union关键字默认去重,如果使用union all可以包含重复项
含义
union 联合 合并:将多条查询语句的结果合并成一个结果
基础查询
查询单个字段
查询多个字段
查询所有字段
查询常量
查询函数
常见函数
字符函数
length:获取参数值的字节个数
concat:拼接字符串
upper():该函数是将字符全部变大写、lower
substr、substring:取子串、注意:索引从1开始
instr:返回子串第一次出现的索引,如果找不到返回0
trim:消除字符串两边的空格
lpad:用指定的字符实现左填充指定的长度
rpad:用指定的字符实现右填充指定的长度
replace:替换
数学函数
round:四舍五入
ceil:向上取整
floor:向下取整,返回<=该参数的最大整数
truncate:截断
mod:取余
流程控制函数
if函数:if else的效果
case函数的使用一:switch case 的效果
case函数的使用二:类似于 多重if
分组函数
max 最大值
min 最小值
count 计算个数
sum 求和
avg 平均值
查询表达式
条件查询
按条件表达式筛选
简单条件运算符:>,<,>=,<=,!=,<>
按逻辑表达式筛选
逻辑运算符:作用连接条件表达式,&&、||、!,and or not
模糊查询
like(一般和统配符搭配使用)
通配符
%:任意多个字符
_:任意单个字符
between and
in
is null | is not null
=或<>不能用于判断null值
is null或is not null可以判断null值
排序查询
升序查询
asc:代表的是从小到大排序,升序
降序查询
desc:代表的是从大到小排序。降序
语法表示
select 查询列表
from 表
[where 筛选条件]
order by 排序列表[asc|desc]
from 表
[where 筛选条件]
order by 排序列表[asc|desc]
order by的使用
order by字句中可以支持单个字段、多个字段、表达式、函数、别名
order by字句一般是放在查询语句的最后面,limit字句除外
分组查询
简单的分组查询
添加筛选条件的分组查询
分组前筛选 原始表 group by子句的前面 where
添加复杂的筛选条件
分组后筛选 分组后的结果集 group by子句的后面 having
语法
select 分组函数,列(要求出现在group by的后面)
from 表
[where 筛选条件]
group by 分组列表
[order by 字句]
from 表
[where 筛选条件]
group by 分组列表
[order by 字句]
注意
分组函数做条件肯定是放在having子句中
能用分组前筛选的,就优先考虑使用分组前筛选
group by子句支持单个字段分组,多个字段分组(多个字段之间用逗号隔开没有顺序要求),表达式或函数(用的较少)
0 条评论
下一页