前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >多表操作(DQL)

多表操作(DQL)

作者头像
木瓜煲鸡脚
发布2019-07-30 11:49:31
5750
发布2019-07-30 11:49:31
举报
文章被收录于专栏:Jasper小笔记Jasper小笔记

多表操作DQL

  1. 表之间的关系
  2. 合并结果集
  3. 连接查询
  4. 子查询

表与表的关系

一对多:主外键关联并且外键也是独一无二

例如:一夫一妻制

husband_id

husband_name

1

张三

2

李四

3

王五

wife_id

wife_name

husband_id

1

孙七

1

2

周八

2

3

吴九

3

wife表的外键husband_id与husband表对应,对于一对一来说此外键不能重复

一对多:外键可重复,设置外键的表就是多的一方

student_id

student_name

1

张三

2

李四

3

王五

textbook_id

textname

student_id

01

数学书

1

02

语文书

1

03

英语数

1

11

数学书

2

12

语文书

2

13

英语数

2

21

数学书

3

22

语文书

3

03

英语数

3

一个学生可以拥有多本书,但他的书只属于他

多对多:两表都需要重复,因此需要创建一个关系表来设置外键实现

student_id

student_name

1

张三

2

李四

course_id

course_name

1

语文

2

数学

student_id

course_id

1

1

1

2

2

1

2

2

学生有多门课,一个课也有多个学生,用第三张来设置外键就可以实现这种多对多的关系

合并结果集

什么是合并结果集

  • 合并结果集就是把两个select语句的查询结果合并到一起

合并结果集的两种方式

  • UNION:合并时去除重复记录
  • UNION ALL:合并时不去除重复记录
代码语言:javascript
复制
SELECT * FROM 表1 UNION SELECT * FROM 表2;
SELECT * FROM 表1 UNION ALL SELECT * FROM 表2;
/* 
 两个表的列数和数据类型要相同,
 最终显示的列名是表1的字段名
*/

id

name

1

张三

2

李四

c_id

c_name

3

王五

4

赵六

合并后

id

name

1

张三

2

李四

3

王五

4

赵六

连接查询

什么是连接查询

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

什么是笛卡尔集

  • 假设集合A={a,b},集合B={0,1,2},
  • 则两个集合的笛卡尔积为{(a,0),(a,1),(a,2),(b,0),(b,1),(b,2)}。
  • 同时查询两个表,出现的就是笛卡尔集结果

表1:

id

name

1‍

张三

2

李四

表2:

class_id

class_name

student_id

1

一班

1

2

二班

2

执行:SELECT * FROM 表1,表2;

结果:

id

name

class_id

class_name

student_id

1

张三

1

一班

1‍

2

李四

1

一班

1

1

张三

2

二班

2

2

李四

2

二班

2

多表联查

筛选想要的数据

SELECT * FROM 表1,表2 WHERE 表1.id = 表2.student_id;

id

name

class_id

class_name

student_id

1

张三

001

一班

1

2

李四

002

二班

2

内连接

代码语言:javascript
复制
/* 等值连接,筛选出主外键对应相等的 */
SELECT * FROM 表1 INNER JOIN 表2 ON 表1.id = 表2.student_id;

/* 多表 */
SELECT * FROM 表1 ,表2 ,表 3
WHERE 表1.xxx = 表2.xxx
AND 表2.xxx = 表3.xxx;
/*------------------------*/
SELECT * FROM 表1 
INNER JOIN 表2 ON 表1.xxx = 表2.xxx
INNER JOIN 表3 ON 表2.xxx = 表3.xxx

/* 非等值连接,筛选连接表时用不等号关联 */
SELECT * FROM 表1 
INNER JOIN 表2 ON 表1.xxx = 表2.xxx
WHERE 表1.xxx > 表2.xxx

/* 
 自连接:当一张表中每行的记录与其他记录可能存在一定的关系
 这个时候我们想要去查询,与指定记录有关系的所有记录。
 就需要自连接,当成两张表然后对应关系连接使用
 */
SELECT * FROM 表 a INNER JOIN 表 b 
ON a.xxx = xxx AND a.yyy = b.xxx;

外连接

  • 左外连接(左连接)
    • 两表满足条件相同的数据查出来,如果左边表当中有不相同的数据,也把左边表当中的数据查出来。
    • 左边表当中的数据全部查出,右边表当中,只查出满足条件的内容
  • 右连接
    • 和左连接定义一样,左边只显示筛选出来的,右边全显示

自然连接

  • 连接查询会产生无用笛卡尔集,我们通常使用主外键关系等式来去除它。而自然连接无需你去给出主外键等式,它会自动找到这一等式
  • 前提是要相等的主外键字段名相同

student_id

name

1

张三

2

李四

3

王五

course

score

student_id

语文

50

1

语文

60

2

语文

70

3

执行:SELECT * FROM student NATURAL JOIN score;

student_id

name

course

score

1

张三

语文

50

2

李四

语文

60

3

王五

语文

70

子查询

什么是子查询

  • 一个select语句中包含另一个完整的select语句。
  • 或两个以上SELECT,那么就是子查询语句了。

子查询出现的位置

  • where后,把select查询出的结果当作另一个select的条件值
  • from后,把查询出的结果当作一个新表;
代码语言:javascript
复制
SELECT * FROM student 
where score > (select score from student where name = "张三");
本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2019-07-26,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 IT那个小笔记 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
数据库
云数据库为企业提供了完善的关系型数据库、非关系型数据库、分析型数据库和数据库生态工具。您可以通过产品选择和组合搭建,轻松实现高可靠、高可用性、高性能等数据库需求。云数据库服务也可大幅减少您的运维工作量,更专注于业务发展,让企业一站式享受数据上云及分布式架构的技术红利!
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档