mysql多表查询-笔记七


Posted in MySQL onApril 05, 2021

一、外键

1、什么是外键

外键是指引用另一个表中的一列或多列,别引用的列应该具有主键约束或唯一性约束。外键用于建立和加强两个表数据之间的连接。未来是初学者更好地理解外键的定义,接下来,通过两张表来讲解什么是外键。

首先需要创建两个表,一个班级表(grade)和一个学生表(student),具体语句如下:

create database chapter05;	//创建数据库
use chapter05;	//进入数据库

create table grade(	//创建数据表grade
id int not null primary key,
name varchar(255)
)
create table student(	//创建数据表studnet
sid int not null primary key,
sname varchar(255),
gid int not null
)

学生表(student)中gid是学生表在的班级id,是引入了班级表(grade)中主键id,那么gid就可以作为表student的外键。被引用的表,即表grade是主键;引用外键的表,即表student是从表,两表是主从关系。表student用gid可以连接表grade中的信息,从而建立了两个表数据之间的连接。

引入外键后,外键列只能插入参照列存在的值,参照列被参照的值不能被删除,这就保证了数据的参照完整性。

2、为表添加外键约束

语法:
alter table 表名 add constraint 外建名 foreign key(外键字段名) references 外表表名(主键字段名);

列如:为表student添加外键约束,具体语句如下:

alter table student add constraint FK_ID foreign key(gid) references grade(id);

在为表添加外键约束时,有些需要注意的地方,如下所示。

(1)建立外键的表必须是InnoDB型,不能是临时表。因为在MySQLzhong中只有InnoDB类型的表才支持外键。

(2)定义外键名时,不能加引号,如constraint "FK_ID"或constraint 'FK_ID’都是错误的。

3、删除外键约束

语法:
alter table 表名 drop foreign key 外建名;
列如:
alter table student drop foreign key FK_ID;

二、操作关联表

1、关联关系

1.1多对一

1.2多对多

1.3一对一

1、添加数据

alter table student add constraint FK_ID foreign key(gid) REFERENCES grade(id);

此时表student和表grade之间是多对一的关系。因为外键只能插入参照列存在的值,所以如果腰围两个表添加数据,就需要为主表grade添加数据,具体语句如下:

insert into grade(id,name) values(1,"软件一班");
insert into grade(id,name) values(2,"软件二班");

然后再能为student表添加数据。

2、删除数据

在某些情况下还需要删除关联表中的数据,列如学校的软件一班取消,就需要在数据库中将该班以及该班的学生一起删除。由于grade表和student表之间具有关联关系。参照列被参照的值是不能被删除的,因此,在删除软件一班时,一定要先删除该班级的所有学生,然后在删除班级。

delete from student where sanme = "王红";

三、连接查询

1、交叉连接

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

在上述语法格式中,CROSS JOIN用于连接两个要查询的表,通过语句可以查询两个表中所有的数据组合。

2、内连接

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

在上述语法格式中,INNER JOIN 用于连接两表,ON来指定连接条件,其中INER可以省略。

3、外连接

语法:
SELECT 所查字段 FROM 表1 LEFT|RIGHT [OUTER] JOIN 表2 ON 表1.关系字段=表2.关系字段 WHERE 条件;

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

使用左连接和右连接查询时,查询结果是不一致的,具体如下。

(1)LEFT JOIN(左连接):返回包括左表中的所有记录和右表中符合连接条件的记录。

(2)RIGHT JOIN(右连接):返回包括右表中的所有记录和左表中符合连接条件的记录。

3.1、LEFT JOIN(左连接)

列如:在department表和employee表之间使用左连接查询,SQL语句如下:

select department.did,department.dname,employee.name FROM department LEFT JOIN employee on department.did=employee.did;

3.2、RIGHT JOIN(右连接)

列如:在department表和employee表之间使用右连接查询,SQL查询如下:

select department.did,department.dname,employee.name FROM department RIGHT JOIN employee ON department.did=employee.did;

4、符合条件连接查询

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

列如:在department表和employee表之间使用内连接查询,并将查询结果按照年龄从大道小进行排序,SQL语句如下:

select employee.name,employee.age,department.dname FROM department JOIN employee ON department.did=employee.did order by age;

四、子查询

1、带IN关键字的子查询

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

列如:查询存在年级为20岁的员工的部门,SQL语句如下:

select * from departmet WHERE did IN(SELECT did FROM employee WHERE age=20);

SELECT语句中还可以使用NOT IN关键字,其作用正好与IN相反。

列如:查询不存在年龄为20岁的员工的部门,SQL语句如下:

SELECT * FROM department WHERE did NOT IN(SELECT did FROM employee WHERE age=20);

2、带EXISTS关键字的子查询

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

列如:查询employee表中是否存在年龄大于21岁的员工,如果存在,则查询department表中的所有记录,SQL语句如下:

SELECT * FROM department WHERE EXISTS(select did from employee where age>21);

3、带ANY关键字的子查询

ANY关键字表示满足其中任意一个条件,它允许创建一个表达式对子查询的返回值列表进行比较,只要满足内层子查询中的任意一个比较条件,就返回一个结果作为外层查询条件。

列如:使用带ANY关键字的子查询,查询满足条件的部门,SQL语句如下:

SELECT * FROM department WHERE did>any(select did from employee);

4、带ALL关键字的子查询

ALL关键字与ANY有点类似,只不过带ALL关键字的子查询返回结果须要同时满足所有内层查询条件。

列如:使用带ALL关键字的子查询,查询满足条件的部门,SQL语句如下:

SELECT * FROM department WHERE did>all(select did from employee);

5、带比较运算符的子查询

在前面讲解的ANY关键字和ALL关键字的子查询中使用了">“比较运算符,子查询中还可以使用其他比较运算符,入“<”、">="、"="、"!="等。

列如:使用带比较运算符的子查询,查询赵四是哪个部门的员工,SQL语句如下:

SELECT * FROM department WHERE did=(select did from employee where name="赵四");
MySQL 相关文章推荐
MySQL的join buffer原理
Apr 29 MySQL
详解MySQL的Seconds_Behind_Master
May 18 MySQL
MySQL时间盲注的五种延时方法实现
May 18 MySQL
Mysql官方性能测试工具mysqlslap的使用简介
May 21 MySQL
Node-Red实现MySQL数据库连接的方法
Aug 07 MySQL
MySQL令人大跌眼镜的隐式转换
Aug 23 MySQL
mysql配置SSL证书登录的实现
Sep 04 MySQL
关于k8s环境部署mysql主从的问题
Mar 13 MySQL
MySQL 自动填充 create_time 和 update_time
May 20 MySQL
jdbc中自带MySQL 连接池实践示例
Jul 23 MySQL
MySQL性能指标TPS+QPS+IOPS压测
Aug 05 MySQL
Mysql如何查看是否使用到索引
Dec 24 MySQL
mysql部分操作
Apr 05 #MySQL
left join、inner join、right join的区别
数据库的高级查询六:表连接查询:外连接(左外连接,右外连接,UNION关键字,连接中ON与WHERE的不同)
mysql字符串截取函数小结
MySQL索引篇之千万级数据实战测试
MySQL表的增删改查(基础)
Apr 05 #MySQL
MySQL入门命令之函数-单行函数-流程控制函数
Apr 05 #MySQL
You might like
PHP中IP地址与整型数字互相转换详解
2014/08/20 PHP
php使用ob_flush不能每隔一秒输出原理分析
2015/06/02 PHP
PHP使用CURL模拟登录的方法
2015/07/08 PHP
Smarty环境配置与使用入门教程
2016/05/11 PHP
php实现不通过扩展名准确判断文件类型的方法【finfo_file方法与二进制流】
2017/04/18 PHP
php多文件打包下载的实例代码
2017/07/12 PHP
PHP Primary script unknown 解决方法总结
2019/08/22 PHP
JSON.stringify 语法实例讲解
2012/03/14 Javascript
javascript学习笔记(二) js一些基本概念
2012/06/18 Javascript
商城常用滚动的焦点图效果代码简单实用
2013/03/28 Javascript
JavaScript实现点击按钮后变灰避免多次重复提交
2013/07/15 Javascript
JavaScript字符串对象charAt方法入门实例(用于取得指定位置的字符)
2014/10/17 Javascript
js表单中选择框值的获取及表单的序列化
2015/12/17 Javascript
jQuery AJAX timeout 超时问题详解
2016/06/21 Javascript
AngularJs 国际化(I18n/L10n)详解
2016/09/01 Javascript
小程序测试后台服务的方法(ngrok)
2019/03/08 Javascript
Vue 3.x+axios跨域方案的踩坑指南
2019/07/04 Javascript
vue项目强制清除页面缓存的例子
2019/11/06 Javascript
vue使用echarts实现水平柱形图实例
2020/09/09 Javascript
Python外星人入侵游戏编程完整版
2020/03/30 Python
python中requests小技巧
2017/05/10 Python
python3 使用openpyxl将mysql数据写入xlsx的操作
2020/05/15 Python
python代数式括号有效性检验示例代码
2020/10/04 Python
利用python+ffmpeg合并B站视频及格式转换的实例代码
2020/11/24 Python
印度首个本地在线平台:nearbuy
2019/03/28 全球购物
新闻专业个人自我评价
2013/09/21 职场文书
大学军训感言
2014/01/10 职场文书
物理专业本科生自荐信
2014/01/30 职场文书
人力资源经理的岗位职责范本
2014/02/28 职场文书
机关搬迁方案
2014/05/18 职场文书
抗洪救灾先进集体事迹材料
2014/05/26 职场文书
2014年党员自我评价材料
2014/09/22 职场文书
酒店宣传语大全
2015/07/13 职场文书
社会实践心得体会范文
2016/01/14 职场文书
webpack的移动端适配方案小结
2021/07/25 Javascript
vue3引入highlight.js进行代码高亮的方法实例
2022/04/08 Vue.js