SQL学习经验总结(第三期)共6期

目录

五、DQL单表查询

一、数据查询语言DQL

1、数据查询语言的基本概念

2、数据查询语言DQL

2.1、查询所有字段

2.2、查询指定字段

二、条件查询

1、条件查询基本格式:

2、条件查询的基本运算符:

3、空值与非空值查询

4、查询去重

5、分页查询

6、模糊匹配

三、范围查询

1、在……范围内查找:

2、在……范围外查找:

3、在集合范围内查找:

4、在集合范围外查找:

四、特殊条件查询

1、合并查询结果

2、数据表查询合并

3、排序查询

4、属性别名

5、分组查询

六、DQL多表查询

1、交叉连接

1.1、交叉连接无条件筛选

1.2、交叉连接的条件筛选

2、内连接

3、外连接

3.1、左外连接(左连接)

3.2、右外连接(右连接)

3.3、全外连接

3.3.1、全外连接基本操作

3.3.2、利用左连接和右连接实现全连接

4、多表连接查询


五、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] 别名。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

small建攻

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值