【深入探索MySQL的DQL语言】——多表连接查询

前言

哈喽大家好,你们的tutu又来了,这次博客的内容呢是将的MySQL的DQL语言中的连接查询、子查询、分页查询、联合查询,而我们对DQL语言的学习也到这里就结束了。DQL是共同组成数据库的完整语言中的一个,我们后续还会学习另外几种语言,从而对数据库进行更多的了解,如果想要一起学习的小伙伴们,期待你的关注哦!如果觉得博主写的还不错的,记得一键三连哦!蟹蟹~
在这里插入图片描述

连接查询

(一)概述

定义:又称多表查询,当查询的字段来自于多个表时,就会用到连接查询

笛卡尔乘积现象:表1 有m行,表2有n行,结果=m*n行

发生原因:没有有效的连接条件
如何避免:添加有效的连接条件

(二)分类

按年代分类

  1. sql92标准 : 仅仅支持 内连接
  2. sql99标准【推荐】:支持 内连接 + 外连接(左外和右外)+ 交叉连接

按功能分类

  1. 内连接 :等值连接、非等值连接、自连接
  2. 外连接 :左外连接、右外连接、全外连接
  3. 交叉连接

(1)sql92标准

  1. 等值连接

    ① 多表等值连接的结果为多表的交集部分
    ② n表连接,至少需要n-1个连接条件
    ③ 多表的顺序没有要求
    ④ 一般需要为表起别名
       1)区分多个重名的字段
       2)提高语句的简洁度
    注意:如果为表起了别名,则查询的字段就不能使用原来的表名去限定
    ⑤ 可以搭配前面介绍的所有子句使用,比如排序、分组、筛选
    
  2. 非等值连接

    条件一定不为等号,但是可以是其他任意情况
    
  3. 自连接

    一张表重复使用
    

(2)sql99标准

语法:

select 查询列表
from1 别名 【连接类型】
join2 别名 
on 连接条件
【where 筛选条件】
【group by 分组】
【having 筛选条件】
【order by 排序列表】

分类:

  1. 内连接(★):inner

  2. 外连接

    左外(★):left 【outer】
    右外(★):right 【outer】
    全外:full【outer】
    
  3. 交叉连接:cross

给大家推荐一篇博客,主要讲的就是连接查询的概念,可以很好地区分其中地几种连接Mysql 多表连接查询


内连接特点

1、添加排序、分组、筛选

2、inner可以省略

3、筛选条件放在where后面,连接条件放在on后面,提高分离性,便于阅读

4、inner join连接和sql92语法中的等值连接效果是一样的,都是查询多表的交集

外连接特点

1、外连接的查询结果为主表中的所有记录

  如果从表中有和它匹配的,则显示匹配的值 		
  如果从表中没有和它匹配的,则显示null
  外连接查询结果=内连接结果+主表中有而从表没有的记录

2、左外连接,left join左边的是主表; 右外连接,right join右边的是主表

3、左外和右外交换两个表的顺序,可以实现同样的效果

4、全外连接=内连接的结果+表1中有但表2没有的+表2中有但表1没有的

5、应用场景:用于查询一个表中有,另一个表没有的记录

(3)sql92和sql99 PK

           功能:sql99支持的较多

           可读性:sql99实现连接条件和筛选条件的分离,可读性较高


子查询

(一)概述

定义:

出现在其他语句中的select语句,称为 子查询内查询

外部的查询语句,称为 主查询外查询

(二)分类

按子查询出现的位置

  1. select后面 :仅仅支持标量子查询

  2. from后面 :支持表子查询

  3. where或having后面 :(★)

    标量子查询(单行) √
    列子查询  (多行) √
    行子查询
    
  4. exists后面(相关子查询):表子查询

按结果集的行列数不同:

	标量子查询(结果集只有一行一列)
	列子查询(结果集只有一列多行)
	行子查询(结果集有一行多列)
	表子查询(结果集一般为多行多列)

(1)where或having后面

支持的查询有

1、标量子查询(单行子查询)
2、列子查询(多行子查询)
3、行子查询(多列多行)

特点

  1. 子查询放在小括号内

  2. 子查询一般放在条件的右侧

  3. 标量子查询,一般搭配着单行操作符使用

    单行操作符:> < >= <= = <>
    
  4. 列子查询,一般搭配着多行操作符使用

    多行操作符:in、any/some、all
    
  5. 子查询的执行优先于主查询执行,主查询的条件用到了子查询的结果

(2)select后面

仅仅支持标量子查询

(3)from后面

将子查询结果充当一张表,要求必须起别名

(4)exists后面(相关子查询)

语法

exists(完整的查询语句)

结果:1或0

分页查询

(一)概述

应用场景:当要显示的数据,一页显示不全,需要分页提交sql请求

语法:

select 查询列表
from 表
【join typejoinon 连接条件
where 筛选条件
group by 分组字段
having 分组后的筛选
order by 排序的字段】
limitoffset,】size;

注意:
offset显示条目的起始索引(起始索引从0开始)
size 显示的条目个数

(二)特点

  1. limit语句放在查询语句的最后
  2. 公式 : 要显示的页数 page,每页的条目数size,示例如下:
    select 查询列表
	fromlimit (page-1)*size,size;

size=10
page      需要输入的数
1            0
2            10
3            20


联合查询

(一)概述

定义:将多条查询语句的结果合并成一个结果

语法

查询语句1 
union 
查询语句2 
union 
...

应用场景:要查询的结果来自于多个表,且多个表没有直接的连接关系,但查询的信息一致时

(二)特点

  1. 要求多条查询语句的 查询列数 是一致的!
  2. 要求多条查询语句的查询的 每一列的类型和顺序最好一致
  3. union 关键字 默认去重,如果使用 union all 可以包含重复项


学无止境
  • 3
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值