MySQL 笔记5 -- 多表查询

版权声明: https://blog.csdn.net/Wang_Jiankun/article/details/83861365

MySQL 笔记5 – 多表查询


MySQL 系列笔记是笔者学习、实践MySQL数据库的笔记

课程链接: MySQL 数据库基础入门教程
参考文档:
MySQL 官方文档


一、表之间关系


1、一对一

  • 单独的一张表
  • 与其它表没有关系

2、一对多

  • 一条信息和其它多条信息有关系
  • 一张个人信息表可以和另一张表关联,比如:资产表,人际关系表
  • 通过添加主键和外键实现 在这里插入图片描述

3、多对多

  • 多条信息和其它多条信息有关系
  • 学生的信息表和可选课表,一个学生可选多门课,一门课可以被多个学生选
  • 需要一张中间表,在两张表中各添加一个主键,在中间表添加两个外键
    在这里插入图片描述

二、多表查询


1、合并结果集

**合并结果集:**把两个select语句的查询结果按照行堆叠合并到一起,被合并的两个表的列数、列类型必须相同

合并结果集的两种方式:

  • UNION:合并时去除重复记录
  • UNION ALL:合并时不去除重复记录

格式:

格式 说明
SELECT * FROM 表1 UNION SELECT * FROM 表2; 合并表且去重
SELECT * FROM 表1 UNION ALL SELECT * FROM 表2; 合并表且不去重

示例:

# 创建两个表,表头一样
CREATE TABLE a(name VARCHAR(5),score INT);
CREATE TABLE b(name VARCHAR(5),score INT);
INSERT INTO a VALUES('a', 10), ('b', 20), ('c', 30);
INSERT INTO b VALUES('a', 10), ('b', 20), ('d', 40);

# 去重合并
SELECT * FROM a UNION SELECT * FROM b;

# 不去重合并
SELECT * FROM a UNION ALL SELECT * FROM b;

2、连接查询

连接查询: 也可以叫跨表查询,需要关联多个表进行查询

笛卡尔集:

  • 每个集合的所有元素和其它集合的每个元素组合,可以扩展到多个集合的情况。设A={a,b},B={0,1,2},则两个集合的笛卡尔集为{(a,0),(a,1),(a,2),(b,0),(b,1),(b,2)}
  • 同时查询两个表,出现的就是笛卡尔集结果
  • 格式:SELECT * FROM 表1,表2

查询时给表起别名:

  • 直接在表名后面添加别名
  • 格式:SELECT * FROM 表1 表1别名,表2 表2别名

多表联查,如何保证数据正确:

  • 在查询时要把主键和外键保持一致:SELECT * FROM 表1 表1别名,表2 表2别名 WHERE 表1别名.主键名 = 表2别名.外键键名
  • 这里的主键和外键是名义上的,不需要设置

内连接:

连接类型 格式 说明
等值连接 SELECT * FROM 表1 表1别名 INNER JOIN 表2 表2别名 ON 表1别名.列名=表2别名.列名; 后面还可以有WHERE语句
多表连接 SELECT * FROM 表1 表1别名 INNER JOIN 表2 表2别名 ON 表1别名.列名=表2别名.列名 INNER JOIN 表3 表3别名 ON 表2别名.列名=表3别名.列名; INNER JOIN … ON 语句可以并列有多个
非等值连接 SELECT * FROM 表1 表1别名 INNER JOIN 表2 表2别名 ON 条件语句; 可以为任意的条件语句

外连接:

  • 左连接:左边表当中的数据全部查出,右边表当中只查出满足条件的内容
  • 右连接:右边表当中的数据全部查出,左边表当中只查出满足条件的内容
连接类型 格式
左连接 SELECT * FROM 表1 表1别名 LEFT OUTER JOIN 表2 表2别名 ON 表1别名.列名=表2别名.列名;
右连接 SELECT * FROM 表1 表1别名 RIGHT JOIN 表2 表2别名 ON 表1别名.列名=表2别名.列名;

自然连接:

  • 连接查询会产生无用笛卡尔集,我们通常使用主外键关系等式来去除它
  • 自然连接无需你去给出主外键等式,它会自动找到这一等式
  • 要求:两张连接的表中列名称和类型完全一致的列作为条件,会去除相同的列

3、子查询

子查询: 一条语句中有一个 SELECT 语句中包含另一个完整的 SELECT 语句,或两个以上 SELECT 语句

子查询出现的位置:

  • WHERE后,把 SELECT 查询出的结果当作另一个 SELECT 的条件值
  • FROM后,把查询出的结果当作一个新表

格式:

位置 格式
WHERE后 SELECT * FROM 表1 WHERE (字段s) IN (SELECT 字段s FROM 表2 WHERE 条件)
FROM后 SELECT * FROM (SELECT 字段s FROM 表2 WHERE 条件) WHERE 条件

4、自连接

  • 从表中查询,根据查询结果再到该表中查询
格式
SELECT * FROM 表 表别名1 表 表别名2 WHERE 表别名1.列名=表别名2.列名 AND 条件2;

GOOD LUCK!


猜你喜欢

转载自blog.csdn.net/Wang_Jiankun/article/details/83861365