MySQL---多表查询

MySQL之多表查询



多表关系

一对多(多对一)
多对多
一对一

一对多

员工和部门关系
部门—1 员工—N
在多的一方设置外键,关联一的一方的主键

多对多

学生与课程关系
建立中间表,中间表至少包含两个外键,分别关联两方主键

一对一

用户与用户详情信息,多用于单表拆分
在任意一方加入 外键,关联另一方的主键,并且设置外键唯一的(UNIQUE)


笛卡尔积

笛卡尔积: 笛卡尔乘积是指在数学中,两个集合A集合 和 B集合的所有组合情况。

在这里插入图片描述

而在多表查询中,我们是需要消除无效的笛卡尔积的,只保留两张表关联部分的数据。

在这里插入图片描述


分类

在这里插入图片描述

连接查询

内连接

相当于查询A,B交集部分数据----绿色部分

隐式:SELECT 字段列表 FROM表1,表2 WHERE 条件·····
显示:SELECT 字段列表  FROM 表1INNER JOIN 表2 ON 连接条件

外连接

左外连接:查询左表所有数据,以及两张表交集部分数据

SELECT 字段列表 FROM 表1 LEFT JOIN 表2 ON 条件

右外连接:查询右表所有数据,以及两张表交集部分数据

SELECT 字段列表 FROM 表1 RIGHT JOIN 表2 ON条件

自连接:当前表与自身连接查询,自连接必须使用表别名 可以是内连接,也可以是外连接

SELECT 字段列表 FROM 表A 别名A  JOIN 表A 别名B ON 条件

子查询

SQL语句中嵌套SELECT语句,称为嵌套查询,又称子查询

SELECT * FROM 表1 WHERE 字段列表 =(SELECT 字段列表 FROM 表2);

子查询外部的语句可以是INSERT / UPDATE / DELETE / SELECT 的任何一个。

根据子查询结果不同,分为:
标量子查询(子查询结果为单个值)
列子查询(子查询结果为一列)
行子查询(子查询结果为一行)
表子查询(子查询结果为多行多列)


根据子查询位置,分为:
WHERE之后
FROM之后
SELECT之后

标量子查询

子查询返回的结果是单个值(数字、字符串、日期等),最简单的形式,这种子查询称为标量子查询。
常用的操作符:= <> > >= < <=

列子查询

子查询返回的结果是一列(可以是多行),这种子查询称为列子查询。
常用的操作符:IN 、NOT IN 、 ANY 、SOME 、 ALL

操作符描述
IN在指定的集合范围之内,多选一
NOT IN不在指定的集合范围之内
ANY子查询返回列表中,有任意一个满足即可
SOME与ANY等同,使用SOME的地方都可以使用ANY
ALL子查询返回列表的所有值都必须满足

行子查询

子查询返回的结果是一行(可以是多列),这种子查询称为行子查询。
常用的操作符:= 、<> 、IN 、NOT IN

表子查询

子查询返回的结果是多行多列,这种子查询称为表子查询。
常用的操作符:IN


联合查询

对于union查询,就是多次查询结果联合起来,形成一个新的查询结果

SELECT 字段列表 FROM 表A····
UNION [ALL] ----不加all直接去重
SELECT 字段列表 FROM 表B····;

对于联合查询的多张表的列数必须保持一致,字段类型也需要保持一致。
union all 会将全部的数据直接合并在一起,union 会对合并之后的数据去重。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值