MySQL之多表操作【绽放吧!数据库】
前言:上篇已经针对数据库的单表查询进行了详细的介绍: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
- 点赞
- 收藏
- 关注作者
评论(0)