MySQL学习-多表操作

本文详细解释了数据库中的多对多、一对一关系模型,以及如何通过外键实现这些关系。介绍了笛卡尔积的概念,以及如何通过连接查询(包括内连接、外连接、自连接)和子查询(标量子查询、列子查询、行子查询和表子查询)进行有效多表查询。
摘要由CSDN通过智能技术生成

多表查询:

多表关系:一对一,多对多,一对多或多对一

        一对多:

案例: 部门 与 员工的关系

关系: 一个部门对应多个员工,一个员工对应一个部门

实现: 在多的一方建立外键,指向一的一方的主键

        多对多:

案例: 学生 与 课程的关系

关系: 一个学生可以选修多门课程,一门课程也可以供多个学生选择

实现: 建立第三张中间表,中间表至少包含两个外键,分别关联两方主键

        一对一:

案例: 用户 与 用户详情的关系

关系: 一对一关系,多用于单表拆分,将一张表的基础字段放在一张表中,其他详情字段放在另 一张表中,以提升操作效率

实现: 在任意一方加入外键,关联另外一方的主键,并且设置外键为唯一的(UNIQUE)

多表查询    要执行多表查询,就只需要使用逗号分隔多张表即可,如: select * from emp , dept ;

笛卡尔积:是指在数学中,两个集合A集合 和 B集合的所有组合情况。A集有2元素,B有3元素,则笛卡尔积为2*3=6.

在SQL语句中,如何来去除无效的笛卡尔积呢? 我们可以给多表查询加上连接查询的条件即可

select * from emp , dept where emp.dept_id = dept.id;

分类:

连接查询:

内连接:相当于查询A、B交集部分数据

外连接:

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

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

自连接:当前表与自身的连接查询,自连接必须使用表别名

子查询:

内连接:语法分为两种: 隐式内连接、显式内连接。

隐式  SELECT 字段列表 FROM 表1 , 表2 WHERE 条件 ... ;

显式  SELECT 字段列表 FROM 表1 [ INNER ] JOIN 表2 ON 连接条件 ... ;

表的别名: ①. tablea as 别名1 , tableb as 别名2 ; ②. tablea 别名1 , tableb 别名2 ;#一旦为表起了别名,就不能再使用表名来指定对应的字段了,此时只能够使用别名来指定字 段。

左外连接  SELECT 字段列表 FROM 表1 LEFT [ OUTER ] JOIN 表2 ON 条件 ... ;#相当于查询表1(左表)的所有数据,当然也包含表1和表2交集部分的数据。

右外连接  SELECT 字段列表 FROM 表1 RIGHT [ OUTER ] JOIN 表2 ON 条件 ... ;#右外连接相当于查询表2(右表)的所有数据,当然也包含表1和表2交集部分的数据。

自连接:SELECT 字段列表 FROM 表A 别名A JOIN 表A 别名B ON 条件 ... ;#在自连接查询中,必须要为表起别名,要不然我们不清楚所指定的条件、返回的字段,到底 是哪一张表的字段。

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

SELECT 字段列表 FROM 表A ...

UNION [ ALL ]

SELECT 字段列表 FROM 表B ....;

对于联合查询的多张表的列数必须保持一致,字段类型也需要保持一致。

union all 会将全部的数据直接合并在一起,union 会对合并之后的数据去重。

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

SELECT * FROM t1 WHERE column1 = ( SELECT column1 FROM t2 );

分类

根据子查询结果不同,分为:

A. 标量子查询(子查询结果为单个值)

B. 列子查询(子查询结果为一列)

C. 行子查询(子查询结果为一行)

D. 表子查询(子查询结果为多行多列)

根据子查询位置,分为:

A. WHERE之后

B. FROM之后

C. SELECT之后

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

案例: A. 查询 "销售部" 的所有员工信息

完成这个需求时,我们可以将需求分解为两步:

①. 查询 "销售部" 部门ID

1 select id from dept where name = '销售部';

②. 根据 "销售部" 部门ID, 查询员工信息

1 select * from emp where dept_id = (select id from dept where name = '销售部');

列子查询:子查询返回的结果是一列(可以是多行),这种子查询称为列子查询。

常用的操作符:IN 、NOT IN 、 ANY 、SOME 、 ALL

操作符                             描述

IN 在指定的集合范围之内,多选一

NOT IN 不在指定的集合范围之内

ANY 子查询返回列表中,有任意一个满足即可

SOME 与ANY等同,使用SOME的地方都可以使用ANY

ALL 子查询返回列表的所有值都必须满足

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

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

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

愚公移山山不移

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

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

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

打赏作者

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

抵扣说明:

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

余额充值