MySQL之多表操作【绽放吧!数据库】

举报
运气男孩 发表于 2021/08/20 00:55:57 2021/08/20
【摘要】 前言:上篇已经针对数据库的单表查询进行了详细的介绍:MySQL之增删改查,然而实际开发中业务逻辑较为复杂,需要对多张表进行操作,例如:一个班的学生、成绩、专业。这里创建好cjgl数据库,包含了xs、cj、kc三张表,已经向其中添加了若干数据。在操作多表之前,需要了解什么是外键和表与表之间存在什么关系。外键定义:外键是指引用另一个表中的一列或多列,被引用的列应该具有主键约束或唯一性约束,外键用...

前言:上篇已经针对数据库的单表查询进行了详细的介绍:MySQL之增删改查,然而实际开发中业务逻辑较为复杂,需要对多张表进行操作,例如:一个班的学生、成绩、专业。这里创建好cjgl数据库,包含了xs、cj、kc三张表,已经向其中添加了若干数据。在操作多表之前,需要了解什么是外键和表与表之间存在什么关系。

外键

定义:外键是指引用另一个表中的一列或多列,被引用的列应该具有主键约束或唯一性约束,外键用于建立和加强两个表数据之间的连接。在已经建立的xs表和cj表中,xs表中的学号就是cj表中的学号,那么学号就可以作为xs表的外键。其中,被引用的表cj就是主表,引用外键的表,即xs表就是从表,两个表示主从关系。

表的关系

1.多对一

 数据表中最常见的一种关系,比如学生与班级的关系,一个班级可以有多个学生,但是一个学生不能属于多个班级。在多对一的关系中,应该将外键建在多的一方。

2.多对多

比如学生与课程的关系,一个学生可以选择多门课程,一门课程也供多个学生选择

3.一对一

比如一个人只有一张身份证,而一张身份证也只对应一个人。

了解完外键和表的关系,下面开始运用多表之间的一系列操作:

多表联合查询

在了解多表联合查询之前,我们需要了解笛卡尔乘积,它的乘积公式 : A表中数据条数   *  B表中数据条数  = 笛卡尔乘积

多表查询的语法一般是:

select  字段1,字段2... from 表1,表2... [where 条件]

例如:我想查询xs表和kc表中的全部数据

SELECT * FROM xs,kc where xs.学号=kc.学号;

注意: 如果不加条件直接进行查询,则会出现以下效果,这种结果我们称之为 笛卡尔乘积。

多表连接查询

语法

SELECT 字段列表    FROM 表1  INNER|LEFT|RIGHT JOIN  表2    ON 表1.字段 = 表2.字段;

 内连接

 内连接(Inner Join)又称简单连接或自然连接,是一种常见的连接查询。内连接使用比较运算符对两个表中的数据进行比较,并列出与连接条件匹配的数据行,组成新的记录。换句话说,内连接只显示符合条件的数据。

语法:

SELECT 查询字段 FROM 表1 [ INNER ] JOIN 表2 ON 表1.关系字段=表2.关系字段

举个栗子:在xs表和cj表之间使用内连接查询。

SELECT * FROM xs JOIN cj ON xs.学号=cj.学号;

大家可能会发现, 内连接查询与多表联合查询的效果是一样的.

自连接

如果在一个连接查询中涉及的两个表其实是同一个表,这种查询称为自连接查询,例如要查询王红所在的部门有多少个人,就可以用自连接查询,这里就不举例了,稍微提一下。

外连接

外连接分为左连接和右连接,当返回的查询结果不仅需要包含符合条件的数据,还需要包含其中一个表或者两个表的所有数据的时候,需要用到外连接查询。

语法:SELECT 所查字段 FROM 表1 LEFT | RIGHT [ OUTER ] JOIN 表2

   ON 表1.关系字段=表2.关系字段 

   WHERE 条件

①LEFT JOIN ——左连接:返回包括左表中的所有记录和右表中符合条件的记录

举例:SELECT * FROM cj LEFT  JOIN kc ON cj.课程号=kc.课程号

cj表中的数据全部都显示,而 kc表中的数据符合条件的才会显示,不符合条件的会以 null 进行填充.

RIGHT JOIN ——右连接:与左连接相反,返回包括右表中的所有记录和左表中符合条件的记录。

举例:SELECT * FROM cj RIGHT  JOIN kc ON cj.课程号=kc.课程号

效果:kc表中的数据全部都显示,而 cj表中的数据符合条件的才会显示,不符合条件的会以 null 进行填充.

子查询

子查询是指一个查询语句嵌套在另一个查询语句内部的查询。在执行时,首先执行子查询中的语句,然后将返回的结果作为外层查询的过滤条件。

子查询中可以包含:IN、NOT IN、ANY、ALL、EXISTS 和 NOT EXISTS等关键字. 还可以包含比较运算符:= 、 !=、> 、<等.

1.带 IN 关键字的子查询

查询姓名为王元的的课程

SELECT * FROM kc where 课程号 in (SELECT 课程号 from cj where 学号 in (SELECT 学号 from xs WHERE 姓名='王元'))

2. 带 EXISTS 关键字的子查询

 EXISTS 关键字后面的参数可以是任意一个子查询,这个子查询不产生任何数据,只返回 TRUE 或 FALSE,当返回 TRUE 时,外层查询才会执行。

举例:查询cj表中是否存成绩大于80的学生,若存在则查询cj表中所有记录。

SELECT * FROM xs WHERE EXISTS(SELECT 学号 from cj WHERE 成绩>80)

3.带 ANY 关键字的子查询

ANY 关键字表示只要满足内层子查询中的任意一个条件,就返回一个结果作为外层查询条件。

4.  带 ALL 关键字的子查询

ALL关键字类似于ANY ,只是ALL关键字的子查询返回的结果需要同时满足所有内查询条件。

由于后面几个子查询类似,稍微变化即可,就不一一举例了,大家可以自行动手跑一跑,实现想查询的数据。多表查询就简单的提了一下,如有错误,欢迎指正,下次再会。

【绽放吧!数据库】有奖征文火热进行中:https://bbs.huaweicloud.com/blogs/285617

【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

举报
请填写举报理由
0/200