多表操作

Posted 232124jxp

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了多表操作相关的知识,希望对你有一定的参考价值。

外键

  1. 什么是外键

外键是指引用另一个表中的一列或多列,被引用的列应该具有主键约束或唯一性约束,并且用于建立和加强两个表数据之间的链接。

技术图片

/*被引用的表(即表grade)是主表,引用外键的表(即表student)是从表,两个表是主从关系。*/

  1. 为表添加外键约束

语法格式:ALTER TABLE 表名 ADD CONSTRAINT FK_ID FOREIGN KEY(外键字段名)REFERENCES外表表名(主键字段名);

/*注意的是,建立外键的表必须是InnoDB型,不能是临时表;定义外键名时,不能加引号*/

  1. 添加外键约束的参数说明

mysql可以在建立外键时添加ON DELETE或ON UPDATE子句来告诉数据库,具体语法格式如下:

ALTER TABLE 表名 ADD CONSTRAINT 外键名 FOREIGN KEY(外键字段名)REFERENCES外表表名(主键字段名); [ON DELETE|CASCADE|SET NULL|NO ACTION|RESTRICT]

[ON UPDATE|CASCADE|SET NULL|NO ACTION|RESTRICT]

语句中各参数的具体说明:

参数名称

功能描述

CASCADE

删除包含与已删除键值有参照关系的所有记录

SET NULL

修改包含与已删除键值有参照关系的所有记录,使用NULL值替换(不能用于已标记为NOT NULL的字段)

NO ACTION

不进行任何操作

RESTRICT

拒绝主表删除或修改外键关联列(在不定义ON DELETE和ON UPDATE子句时,这是默认设置,也是最安全的设置)

  1. 删除外键约束

语法格式:ALTER TABLE 表名 DROP FOREIGN KEY FK_ID 外键名;

?

操作关联表

  1. 关联关系

1.多对一

多对一是数据表中最常见的一种关系,比如员工与部门之间的关系。在多对一的表关系中,应该将外键建在多的一方,否则会造成数据的冗余。

2.多对多

多对多也是数据表中的一种关系,比如学生与课程之间的关系。

通常情况下,为了实现这种关系需要定义一张中间表(称为连接表),需要注意的是,连接表的两个外键都是可以重复的,但是两个外键之间的关系是不能重复的,所以这两个外键又是连接表的联合主键

3.一对一

一对一关系在数据库中不常见,例如人与身份证之间就是一对一的关系。在实际开发中,可以用于分割、隔离、保存临时的数据。

  1. 添加数据

为表student和表grade中添加外键约束来建立两个表的关联关系。执行结果如下:

技术图片

查看表结构

技术图片

因为外键列只能插入参照列存在的值,所以如果要为两个表添加数据,就需要先为主表grade添加数据,并且由于student表的外键与grade表的主键关联,所以要为student表添加数据时执行结果如下:

技术图片

?

1.在grade表中查询班级名称为"软件一班"的id,执行结果如下:

技术图片

2.在student表中,查询软件一班的学生,执行结果如下:

技术图片

  1. 删除数据

由于grade表和student表之间具有关联关系,参照列被参照的值是不能被删除的

1.将软件一班的所有学生全部删除,并使用SELECT语句查询,执行结果如下:

技术图片

从查询结果看出,student表中已经没有任何学生的记录了。

2.在grade表中,将软件一班删除,并使用SELECT语句查询,执行结果如下:

技术图片

从查询结果看出,软件一班被成功的删除了。

如果我们直接删除表grade中的"软件二班",看看会出现什么情况,具体语句如下:

技术图片

?

连接查询

  1. 交叉连接

交叉连接返回的结果是被连接的两个表中所有数据行的笛卡尔积(返回第一个表中符合查询条件的数据行数乘以第二个表中符合查询条件的数据行数)

语法格式:SELECT * FROM表1CROSS JOIN表2;

/* CROSS JOIN用于连接两个要查询的表,通过该语句可以查询两个表中所有的数据组合*/

首先创建两个表

技术图片

技术图片

在两个表中分别插入相关数据,具体语句如下:

技术图片

使用交叉连接查询部门表和员工表,执行结果如下:

技术图片

二、内连接

内连接(INNER JOIN)又称简单连接或自然连接,是一种常见的连接查询。

语法格式:SELECT 查询字段 FROM 表1 [INNER] JOIN 表2 ON 表1.关系字段 = 表2.关系字段/* INNER JOIN用于连接两个表,ON来指定连接条件,其中INNER可以省略*/

在两表之间使用内连接查询,执行结果如下:

技术图片

在两表之间使用WHERE,执行结果如下:

技术图片

在两表之间使用自连接查询,执行结果如下:

技术图片

  1. 外连接

外连接分为左连接和右连接。

外连接的语法格式:SELECT所查字段FROM表1LEFT|RIGHT[OUTER]JOIN表2 ON 表1.关系字段 =表2.关系字段 WHERE 条件

外连接的语法格式和内连接类似,LEFT JOIN、RIGHT JOIN关键字,其中关键字左边的表被称为左表,关键字右边的表被称为右表。

1.LEFT JOIN(左连接)

左连接的结果包括LEFT JOIN子句中指定的左表的所有记录和所有满足连接条件的记录。如果左表的某条记录在右表中不存在,则在右表中显示为空。

在两表之间使用左连接查询,SQL语句如下:

技术图片

2、RIGHT JOIN(右连接)

右连接与左连接正好相反,执行结果如下:

技术图片

  1. 复合条件连接查询

复合条件连接查询就是在连接查询的过程中,通过添加过滤条件来限制查询结果,使查询结果更加精确。

在两表之间使用复合条件查询和内连接查询并将查询结果按照年龄的升序排序,执行结果如下:

技术图片

?

带IN关键字的子查询子查询

  1. ?

使用IN关键字进行子查询时,内层查询语句仅仅返回一个数据列,这个数据列中的值将供外层查询语句进行比较操作。

1.查询存在年龄为20岁的员工的部门,执行结果如下:

技术图片

2.查询不存在年龄为20岁的员工的部门,执行结果如下:

技术图片

  1. 带EXISTS关键字的子查询

EXISTS关键字后面的参数可以是任意一个子查询(作用相当于测试)它不产生任何数据,只返回TRUE或FALSE,当返回值为TRUE时,外层查询才会执行。

查询employee表中是否存在年龄大于21岁的员工,执行结果如下:

技术图片

/*注意的是,EXISTS关键字比IN关键字的运行效率高,所以在大数据量时,使用EXISTS关键字*/

三、带ANY关键字的子查询

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

执行结果如下:

技术图片

  1. 带ALL关键字的子查询

与ANY有点类似,但子查询返回的结果需同时满足所有内层查询条件。

执行结果如下:

技术图片

带比较运算符的子查询

查询赵四是哪个部门的员工,执行结果如下:

技术图片

以上是关于多表操作的主要内容,如果未能解决你的问题,请参考以下文章

多表查询_左连接多表操作_子查询

Oracle笔记 多表查询

day17 dbutils 和 jdbc 多表操作

单表多表操作 联表查询

django-模型层(model)-多表相关操作(图书管理练习)

多表操作