目录
五、DQL单表查询
一、数据查询语言DQL
1、数据查询语言的基本概念
DQL(数据查询语言)用于对数据库关系表中的数据进行查询(读取),其支持多种查询方式。
数据查询语言关键字:select
查询语句基本格式:
select <属性名> from <[数据库名.]表名>;
2、数据查询语言DQL
2.1、查询所有字段
select * from <表名>;
# 查询所有字段用*星号
2.2、查询指定字段
select <属性名1[,属性名2,…,属性名n]> from <表名>;
# 指定属性名查询数据
二、条件查询
1、条件查询基本格式:
select <属性名> from <[数据库名.]表名> where 查询条件;
2、条件查询的基本运算符:
①、条件运算符:>、<、=、!=(<>)、>=、<= (不存在==)
②、逻辑运算符:&&(and/AND)、||(or/OR),用于连接两个条件
3、空值与非空值查询
①、查询空值:is null
例:
select * from teacher where t_age is null; -- 查询属性t_age取值为空的记录
②、查询非空值:is not null
例:
select * from teacher where t_sex is not null; -- 查询属性t_sex取值不为空的记录
4、查询去重
去重关键字:distinct,同一个查询语句中只能对一个属性去重
例:
select distinct t_age from teacher; -- 查询teacher表中属性t_age不重复的取值
5、分页查询
分页:limit [偏移量n,记录条数m] 是指查询从第n+1条记录开始后m条数据,偏移量n默认为0
例:
select * from teacher limit 3,6;
select * from teacher limit 5;
6、模糊匹配
模糊匹配:like(只适用于字符串匹配)
①通配符%:匹配任意0个、1个或多个字符
例:
select t_id,t_name from teacher where t_name like '%小%';
-- 匹配属性t_name中含有'小'字的记录,前后任意多个字符 1
②通配符'_':匹配任意一个字符
例:
select t_id,t_name from teacher where t_name like '小_';
-- 匹配属性t_name中以'小'字开头,以任意一个字符结尾的元组,如:小李、小张、小小、小A、 小*等
select t_id,t_name from teacher where t_name like '小_%';
-- 匹配属性t_name中以'小'字开头,以至少一个字符结尾的元组,如:小李、小不点、小ABC等
三、范围查询
1、在……范围内查找:
between……and……
例:
select t_id,t_name from teacher where t_id between 5 and 8;
-- t_id的值在5和8之间
2、在……范围外查找:
not between……and……
例:
select t_id,t_name from teacher where t_id not between 5 and 8;
-- t_id的值在5 和8之外
select t_id,t_name from teacher where t_id not between 5 and 8 or t_id = 6;
3、在集合范围内查找:
in(……)
例:
select t_id,t_name from teacher where t_id in (1,2,5,7,8);
-- 将属性t_id的取值在集合(1,2,5,7,8)中的元组查询出来
select t_id,t_name from teacher where t_name in ('小李','A','小小小 李','K','Z','X','C');
-- 将属性t_name的取值在集合('小李','A','小小小李','K','Z','X','C')中的记录查询出
4、在集合范围外查找:
not in(……)
例:
select t_id,t_name from teacher where t_id not in (1,2,5,7,8);
-- 将属性t_id的取值不在集合(1,2,5,7,8)中的元组查询出来
# 由于in的内部处理没有where好,一般很少用in进行条件查询
四、特殊条件查询
1、合并查询结果
合并:union(合并)/union all(合并所有)
区别:union all是不去重,union是去重(去重:去除重复的数据)
例:
select 3,'abcde' union select 5,'12345'
union select 3,'abcde' union select '12345',5;
select 3,'abcde' union all select 5,'12345'
union all select 3,'abcde' union all select '12345',5;
临时结果集:select语句查询的结果是一个虚拟表(临时表),且合并的多个查询必须列的数量相同
2、数据表查询合并
-- 单独的表数据查询语句
select * from teacher where t_id = 10 || t_name = '小李' ;
select * from teacher where t_id = 6 || t_name like 'K' ;
-- 合并两个查询临时结果集
select * from teacher where t_id = 10 || t_name = '小李'
union
select * from teacher where t_id = 6 || t_name like 'K' ;
3、排序查询
3.1、对查询结果排序(默认升序)
例:
select * from teacher order by t_age;
3.2、降序排列:desc
例:
select * from teacher order by t_age desc;
4、属性别名
MySQL支持给属性(字段)取别名,也可以给表取别名。
给属性取别名:as
select t_id as 教师编号,t_name as 教师名称 from teacher;
# as可以省略
select t_id 教师编号,t_name 教师名称 from teacher;
5、分组查询
对查询结果进行分组。
分组关键字:group by
一般格式:
select 属性名1,属性名2,…,属性名n
from 表名 group by 属性名(1~n) [having 条件表达式];
# 注意:
①分组过后不能用where进行条件筛选,需要用having
②where:从数据源去掉不符合搜索条件的数据
③having:在分组中去掉每组不符合条件的数据
六、DQL多表查询
1、交叉连接
1.1、交叉连接无条件筛选
在现实生活中的查询往往需要查找多个表中的数据,要求所查询的数据表存在联系,这就涉及到多表查询了。
交叉连接的基本格式:
select <[数据库1.]表1.属性1>
[,[数据库2.]表2.属性2,…,[数据库n.]表n.属性n]
from <[数据库1.]表1>
[,[数据库2.]表2,…,[数据库n.]表n];
1.2、交叉连接的条件筛选
简单的多表查询不符合我们的要求,需要在其基础上添加相应的条件才能准确的查询出我们想要的数据。
基本格式:
select <[数据库1.]表1.属性1>
[,[数据库2.]表2.属性2,…,[数据库n.]表n.属性n]
from <[数据库1.]表1>
[,[数据库2.]表2,…,[数据库n.]表n];
where <条件表达式>;
# 交叉连接先产生笛卡尔积(多个表格所有的数据会相互匹配一次),再根据条件表达式筛选出相应的记录
2、内连接
内连接先判断连接条件,根据表中匹配的字段,列出与连接条件匹配的数据,也就是说只有相匹配的结果才能查询出来。
内连接的关键字:inner join
内连接的基本格式:
select [数据库1.]表1.属性1,
[数据库2.]表2.属性2,…,[数据库n.]表n.属性n
from [数据库1.]表1 inner join [数据库2.]表2 on 条件表达式1
inner join … inner join [数据库n.]表n on 条件表达式n;
交叉连接与内连接的区别在于:
①、交叉连接是先把所有情况都连接起来,再从中查询出满足条件的数据,也就是先产生笛卡尔积,然后判断条件筛选数据。
②、相同情况下内连接和交叉连接效果一致,但内连接是先筛选出满足条件的数据,再讲筛选出的数据进行连接,避免产生笛卡尔积。所以内连接比交叉连接的查询性能要好。
3、外连接
外连接是对内连接查询结果的补全(对应的查询结果完全显示),外连接又分为左外连接(左连接)、右外连接(右连接)和全外连接(全连接)。
3.1、左外连接(左连接)
以左表为基准,显示左表查询字段的所有记录,右表只显示与左表匹配的记录,没有匹配的用null代替。
左连接关键字:left join
左连接基本格式:
select [数据库1.]表1.属性1,
[数据库2.]表2.属性2,…,[数据库n.]表n.属性n
from [数据库1.]表1 left join [数据库2.]表2 on 条件表达式1
left join … left join [数据库n.]表n on 条件表达式n;
3.2、右外连接(右连接)
与左连接相反,是以右表为基准,显示右表查询字段的所有记录,左表只显示和右表匹配的记录,没有匹配的用NULL代替。
右连接关键字:right join
右连接的基本格式:
select [数据库1.]表1.属性1,
[数据库2.]表2.属性2,…,[数据库n.]表n.属性n
from [数据库1.]表1 right join [数据库2.]表2 on 条件表达式1
right join … right join [数据库n.]表n on 条件表达式n;
# 只要把两个表的顺序倒过来就可以实现左右连接相互转换,所以左右连接没有特别限制
3.3、全外连接
3.3.1、全外连接基本操作
全连接的左右表不做限制,显示全部数据,没有匹配的数据用NULL代替。
全连接关键字:full join
全连接的基本格式:
select [数据库1.]表1.属性1,
[数据库2.]表2.属性2,…,[数据库n.]表n.属性n
from [数据库1.]表1 full join [数据库2.]表2 on 条件表达式1
full join … full join [数据库n.]表n on 条件表达式n;
# 然而mysql不支持全外连接。所以通过左右连接的方式来实现全外连接
3.3.2、利用左连接和右连接实现全连接
基本格式:
select [数据库1.]表1.属性1,[数据库2.]表2.属性2,…,
[数据库n.]表n.属性n
from [数据库1.]表1 right join [数据库2.]表2 on 条件表达式1
right join … right join [数据库n.]表n on 条件表达式n
union
select [数据库1.]表1.属性1,[数据库2.]表2.属性2,…,
[数据库n.]表n.属性n
from [数据库1.]表1 left join [数据库2.]表2 on 条件表达式1
left join … left join [数据库n.]表n on 条件表达式n;
# 这里使用union连接两个查询语句来实现全连接。
4、多表连接查询
DQL不仅可以连接查询2个表,也可以连接查询多个表中的数据(一般最好不要超过4个表)。
格式1:
select 表1.属性1,表2.属性2[,…,表n.属性n]
from 表1 连接(inner/left/right join) 表2 on 连接条件1
连接(inner/left/right join) 表3 on 连接条件2
…… 连接(inner/left/right join) 表n on 连接条件n;
(连接两个表之后写上连接条件,再连接另一个表)
# 格式1是进行多表连接查询时应注意连接表之间的外键关系和连接条件,只有表中属性相互有关系的表才能进行连接。
格式2:
select 表1.属性1,表2.属性2,…,表n.属性n
from 表1 连接(inner/left/right join) 表2
连接(inner/left/right join) 表3
…… 连接(inner/left/right join) 表n
on 连接条件1 && 连接条件2 && … && 连接条件n;
# 这是将所有数据表连接完毕后再判断连接条件,这种方式格式比较混乱,不推荐使用
#给表取别名能够缩短连接查询的解析时间,使查询效率更高。
取别名关键字:as
# as可以省略
可以在查询时给表取别名,方便使用。
基本格式:表名 [as] 别名。