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 相关文章推荐
详解GaussDB for MySQL性能优化
May 18 MySQL
修改MySQL的默认密码的四种小方法
May 26 MySQL
MySQL如何使用使用Xtrabackup进行备份和恢复
Jun 21 MySQL
如何搭建 MySQL 高可用高性能集群
Jun 21 MySQL
SQL实现LeetCode(175.联合两表)
Aug 04 MySQL
MySQL令人大跌眼镜的隐式转换
Aug 23 MySQL
如何避免mysql启动时错误及sock文件作用分析
Jan 22 MySQL
MySQL七大JOIN的具体使用
Feb 28 MySQL
MySQL限制查询和数据排序介绍
Mar 25 MySQL
MySQL创建管理RANGE分区
Apr 13 MySQL
MySQL示例讲解数据库约束以及表的设计
Jun 16 MySQL
Mysql中的触发器定义及语法介绍
Jun 25 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制作图型计数器的例子
2006/10/09 PHP
第十一节--重载
2006/11/16 PHP
PHP面向对象程序设计之命名空间与自动加载类详解
2016/12/02 PHP
PHP实现json_decode不转义中文的方法
2017/05/20 PHP
自动刷新网页,自动刷新当前页面,JS调用
2013/06/24 Javascript
一个简单的Node.js异步操作管理器分享
2014/04/29 Javascript
Jquery 获取指定标签的对象及属性的设置与移除
2014/05/29 Javascript
node.js中的fs.writeFileSync方法使用说明
2014/12/14 Javascript
js+html5获取用户地理位置信息并在Google地图上显示的方法
2015/06/05 Javascript
AngularJS ng-change 指令的详解及简单实例
2016/07/30 Javascript
在iframe中使bootstrap的模态框在父页面弹出问题
2017/08/07 Javascript
javascript之分片上传,断点续传的实际项目实现详解
2019/09/05 Javascript
[02:08]2018年度CS GO枪械皮肤设计大赛优秀作者-完美盛典
2018/12/16 DOTA
[01:14:19]NAVI vs Mineski 2019国际邀请赛淘汰赛 败者组BO1 8.20.mp4
2020/07/19 DOTA
详细解析Python中的变量的数据类型
2015/05/13 Python
Python字符和字符值(ASCII或Unicode码值)转换方法
2015/05/21 Python
Python IDE PyCharm的基本快捷键和配置简介
2015/11/04 Python
Python实现好友全头像的拼接实例(推荐)
2017/06/24 Python
Pandas 合并多个Dataframe(merge,concat)的方法
2018/06/08 Python
python3.X 抓取火车票信息【修正版】
2018/06/19 Python
django 捕获异常和日志系统过程详解
2019/07/18 Python
使用numpngw和matplotlib生成png动画的示例代码
2021/01/24 Python
css3隔行变换色实现示例
2014/02/19 HTML / CSS
HTML5、Select下拉框右边加图标的实现代码(增进用户体验)
2017/10/16 HTML / CSS
西班牙自行车和跑步商店:Alltricks
2018/07/07 全球购物
怀旧香味蜡烛:Homesick
2019/11/02 全球购物
创业计划书如何编写
2014/02/06 职场文书
小学生演讲稿大全
2014/04/25 职场文书
美容院合作经营协议书
2014/10/10 职场文书
党性分析自查总结
2014/10/14 职场文书
群众路线教育实践活动调研报告
2014/11/03 职场文书
爱的承诺书
2015/01/20 职场文书
元旦晚会开场白
2015/05/29 职场文书
python本地文件服务器实例教程
2021/05/02 Python
python_tkinter弹出对话框创建
2022/03/20 Python
Python爬虫 简单介绍一下Xpath及使用
2022/04/26 Python