【MySQL数据库 | 第十三篇】多表查询

这篇具有很好参考价值的文章主要介绍了【MySQL数据库 | 第十三篇】多表查询。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

 前言:

多表查询是指在一个SQL语句中使用多个表进行数据查询和操作。多表查询可以对数据表之间的关系进行查询,例如可以通过连接多个表来获取更完整的数据信息。关于单表查询我们也介绍过,已经整理成文章发布:【MySQL数据库 | 第九篇】DQL操作_我是一盘牛肉的博客-CSDN博客

【MySQL数据库 | 第十三篇】多表查询

目录

 前言:

 多表关系:

1.一对多:

2.多对多:

 3.一对一:

 多表查询:

 多表查询的分类:

连接查询:

        内连接:

         外连接:

         自连接:

联合查询:

子查询:

 总结:


 多表关系:

  • 一对多
  • 多对多
  • 一对一

1.一对多:

实例:部门与员工之间的关系,一个部门对应多个员工,一个员工对应一个部门。

实现:在多的一方建立外键,指向一的一方的主键。

图解:

【MySQL数据库 | 第十三篇】多表查询

2.多对多:

实例:学生与课程之间的关系,一个学生可以选多门课,一们课也可以让多个学生选择。

实现:建立中间第三张表,中间至少包含两个外键,分别关联两方主键

图解:
【MySQL数据库 | 第十三篇】多表查询 实例:

以多对多的关系实现学生与课程之间的关系

学生表:
【MySQL数据库 | 第十三篇】多表查询

 课表:
【MySQL数据库 | 第十三篇】多表查询

 学生课程关系表:
【MySQL数据库 | 第十三篇】多表查询

我们把studentid和courseid都设置称为两个外键,分别连接给课表和学生表。这样我们就得到了一个多对多的关系。

我们可以通过datagrip自带的视图工具来更加直观的图:
【MySQL数据库 | 第十三篇】多表查询

 3.一对一:

实例:用户与用户详情之间的关系

关系:一对一的关系多用于单表的拆分。

实现:在任意一方加入外键,关联另一方的主键,并且设置外键是唯一的。

【MySQL数据库 | 第十三篇】多表查询

 拆分后:

【MySQL数据库 | 第十三篇】多表查询

我们可以在datagrip提供的可视化工具中查看用户基本信息表和用户教育信息表的关系:
【MySQL数据库 | 第十三篇】多表查询


 多表查询:

多表查询是指在一个SQL语句中使用多个表进行数据查询和操作。多表查询可以对数据表之间的关系进行查询,例如可以通过连接多个表来获取更完整的数据信息。

为了方便演示我们先插入两张表:dept表和emp表

dept表:
【MySQL数据库 | 第十三篇】多表查询

 emp表:【MySQL数据库 | 第十三篇】多表查询

 如果只是直接的两张表一起查询:

select *from emp ,dept;

 查询结果:
【MySQL数据库 | 第十三篇】多表查询

 我们发现这样查询太浪费时间了,因为这是把每一个人对这个六个职位都进行一次匹配,这样确实不利于我们直接进行观察,这种(A中的每一个元素都要和B中的元素组合)现象叫做笛卡尔积现象。

而我们在实际多表查询的时候要消除这种多余的笛卡尔积现象,让数据以最直观,最清晰的方式呈现出来。

【MySQL数据库 | 第十三篇】多表查询

 正确的思路应该是我们加上一个判断条件:只有empt表中人员职位id等于dept职位id的时候,再进行输出。
代码:

select * from emp,dept where dept_id=dept.id;

 结果:
【MySQL数据库 | 第十三篇】多表查询

此时我们就成功的消除了多余的笛卡尔积。


 多表查询的分类:

连接查询:

        内连接:

                        相当于查询A,B交集部分数据。

         外连接:

                       左外连接:查询左表的所有数据,以及两张表的交集数据

                       右外连接:查询右表的所有数据,以及两张表的交集数据

         自连接:

                        当前表与自身的连接查询,自连接必须使用表别名

联合查询:

                        把多次查询的结果合并起来,形成一个新的查询结果

子查询:

           一个SQL语句中嵌套另一个SQL语句,嵌套的SQL语句被称作子查询。


内连接:

1.隐式内连接:

SELECT 字段列表 FROM 表1,表2,WHERE 条件;

2.显式内连接:

SELECT 字段列表 FROM 表1 [INNER] JOIN 表2 ON 连接条件;

案例:
1.查询每一个员工的姓名和关联部门的名称(隐式内连接)

select emp.name,dept.name from emp,dept where emp.dept_id=dept.id;

结果:
【MySQL数据库 | 第十三篇】多表查询

 2.查询每一个员工的姓名和关联部门的名称(显式内连接)

select emp.name,dept.name from emp join dept  on emp.dept_id = dept.id;

结果:
【MySQL数据库 | 第十三篇】多表查询

外连接:

左外连接:

select 字段名 from 表1 left [outer] join 表2 on 条件;

右外连接:

select 字段名 from 表1 right [outer] join 表2 on 条件;

我们认为表1是左表,表2是右表:
图解:
【MySQL数据库 | 第十三篇】多表查询
 

 案例:
1.查询emp中的所有信息以及其人员对应的部门信息(左外连接)

select emp.* ,d.name from emp left join dept d on d.id = emp.dept_id;

结果
【MySQL数据库 | 第十三篇】多表查询

 2.查询dept表的所有数据和对应的员工名称(右外连接)

select dept.*,e.name from dept right join emp e on dept.id = e.dept_id;

结果:
【MySQL数据库 | 第十三篇】多表查询

自连接:

select 字段列表 from 表A 别名A join 表A 别名B on 条件;

自连接查询可以是内连接查询,也可以是外连接查询。

案例

1.查询员工以及其所属领导的名字(内连接):

select a.name ,b.name from emp a,emp b where a.managerid=b.id;

 结果:(我们可以看出来此处没有老板的金庸并没有显示出来,因为他并不属于两张表的交集)【MySQL数据库 | 第十三篇】多表查询

 2.查询员工以及其所属领导的名字(外连接)即员工没有领导也要包含进来:

select a.name,d.name from emp a left join emp d on a.managerid=d.id;

结果:(此时没有老板的金庸也被打印出来)
【MySQL数据库 | 第十三篇】多表查询

联合查询:

SELECT 字段列表 FROM 表A....
UNION [ALL]
SELECT 字段列表 FROM 表B....

  ALL关键字决定是否去重,如果不想去重就写ALL。 

案例:

1.将薪资大于5000的员工和年龄大于50岁的员工全部查询出来

select name from  emp where emp.salary>5000
union
select name from emp where emp.age>50;

结果:
【MySQL数据库 | 第十三篇】多表查询

 注意点:对于联合查询来讲,合并的两个查询字段必须类型一致,列数一致。

子查询:

SELECT *FROM T1 WHERE COLUMN1 =(SELECT COLUMN1 FROM T2);

根据子查询的种类不同,我们分为

  • 标量子查询(子查询结果为单个值)
  • 列子查询(子查询结果是一列)
  • 行子查询(子查询结果是一行)
  • 表子查询(子查询的结果为多行多列)

红箭头所指的就是子查询

【MySQL数据库 | 第十三篇】多表查询

标量子查询:
                子查询返回的结果是单个值(字符串,日期,数字等)

                常用操作符:=  <>  >  >=   <  <=

以下这些案例中子查询返回的都是一个单个值:id,entrydate,因此叫做标量子查询。

案例:

1.查询‘销售部’的所有员工信息(先查询销售部的编号,再查询谁的岗位编号符合要求)

select * from emp where dept_id=(select id from dept where name ='销售部');

结果:
【MySQL数据库 | 第十三篇】多表查询

 2.查询在'方东白'入职之后的员工信息

select * from emp where entrydate>(select entrydate from emp where name='方东白');

结果:
【MySQL数据库 | 第十三篇】多表查询

 列子查询:
               子查询返回的结果是一列(可以是多行),这种子查询叫做列子查询

               常用操作符:IN  ,  NOT IN  ,   ANY  ,  SOME  ,  ALL         

【MySQL数据库 | 第十三篇】多表查询

 案例:
1.查询 销售部 和 市场部 的所有员工信息

select * from emp where dept_id in (select id from dept where name ='销售部'or  name ='市场部');

结果:
 【MySQL数据库 | 第十三篇】多表查询

 2.查询比财务部所有人工资都高的人员信息

select * from emp where salary>all (select salary from emp where dept_id = (select id from dept where name ='财务部'));

结果:
【MySQL数据库 | 第十三篇】多表查询

 行子查询:
                子查询返回的结果是一行(可以是多列),这种子查询就是行子查询

                常用的操作符:= ,<>  ,IN,NOT IN 

案例:

1.查询与张无忌薪资和领导相同的员工信息

select * from emp where (salary,managerid)=(select salary,managerid from emp where name ='张无忌')

 结果:【MySQL数据库 | 第十三篇】多表查询

 表子查询:

                子查询的返回结果是多行多列,这种子查询结果就叫做表子查询

                最常用的操作符:IN

案例:
1.查询与鹿杖客,宋远桥职位和薪资相同的员工信息:

select * from emp where (job,salary) in (select job,salary from emp where name='鹿杖客' or name ='宋远桥');

结果:
【MySQL数据库 | 第十三篇】多表查询


 总结:

多表查询是指在一个SQL语句中同时操作多个表格,并通过对不同表格之间的关联进行查询,来获得更丰富和更准确的数据。多表查询的常用方式有内连接、左连接、右连接和全连接。多表查询在实际操作中应用广泛,能够满足复杂的数据查询和处理需求,同时也能够提高数据库的查询效率和性能。

今天的内容到这里就结束了,感谢大家的阅读。

如果我的内容对你有帮助,请点赞,评论,收藏。创作不易,大家的支持就是我坚持下去的动力!

【MySQL数据库 | 第十三篇】多表查询文章来源地址https://www.toymoban.com/news/detail-475302.html

到了这里,关于【MySQL数据库 | 第十三篇】多表查询的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【JaveWeb教程】(22) MySQL数据库开发之多表查询:内连接、外连接、子查询 详细代码示例讲解(最全面)

    1.1.1 数据准备 SQL脚本: 1.1.2 介绍 多表查询:查询时从多张表中获取所需数据 单表查询的SQL语句:select 字段列表 from 表名; 那么要执行多表查询,只需要使用逗号分隔多张表即可,如: select 字段列表 from 表1, 表2; 查询用户表和部门表中的数据: 此时,我们看到查询结果中包

    2024年01月22日
    浏览(58)
  • 数据库多表查询

    1、创建表格 2、插入数据 3.查询student表的所有记录 4.查询student表的第2条到4条记录 5.从student表查询所有学生的学号(id)、姓名(name)和院系(department)的信息 6.从student表中查询计算机系和英语系的学生的信息 7.从student表中查询年龄18~22岁的学生信息 由于表中没有年龄1

    2024年01月16日
    浏览(53)
  • 数据库基础——7.多表查询

    这篇文章来讲一下数据库中的多表查询 目录 1. 一个案例引发的多表连接 1.1 案例说明 1.2 笛卡尔积(或交叉连接)的理解 1.3 案例分析与问题解决 2. 多表查询分类讲解 2.1 等值连接 vs 非等值连接 2.1.1等值连接 2.1.2 非等值连接 2.2 自连接 vs 非自连接  2.3 内连接 vs 外连接  3.实

    2024年02月06日
    浏览(47)
  • 数据库多表查询作业

    创建数据库 插入数据 1.查询student表的所有记录 2.查询student表的第2条到4条记录 3.从student表查询所有学生的学号(id)、姓名 (name)和院系(department)的信息 4.从student表中查询计算机系和英语系的学生的信息 5.从student表中查询年龄18~22岁的学生信息 6.从student表中查询每个院

    2024年02月16日
    浏览(47)
  • 数据库 SQL高级查询语句:聚合查询,多表查询,连接查询

    创建Students和Courses表 直接查询 设置别名查询 设置条件查询 使用COUNT(*) 和 COUNT(StudentID)是一样的效果,因为StudentID是主键,每行记录的主键都不同。另外我们在聚合查询中还是能使用WHERE子句的,比如我们要 查找年龄大于20岁的学生数量 ,可使用以下SQL语句: 函数 说明 SUM

    2024年02月09日
    浏览(127)
  • 数据库多表查询练习题

    二、多表查询 1. 创建 student 和 score 表 CREATE TABLE student ( id INT ( 10 ) NOT NULL UNIQUE PRIMARY KEY , name VARCHAR ( 20 ) NOT NULL , sex VARCHAR ( 4 ) , birth YEAR , department VARCHAR ( 20 ) , address VARCHAR ( 50 ) ); 创建 score 表。 SQL 代码如下: CREATE TABLE score ( id INT ( 10 ) NOT NULL UNIQUE PRIMARY KEY AUTO_INCREMENT , stu_

    2024年01月17日
    浏览(65)
  • [SQL Server]数据库入门之多表查询

    🎬 博客主页:博主链接 🎥 本文由 M malloc 原创,首发于 CSDN🙉 🎄 学习专栏推荐:LeetCode刷题集! 🏅 欢迎点赞 👍 收藏 ⭐留言 📝 如有错误敬请指正! 📆 未来很长,值得我们全力奔赴更美好的生活✨ ------------------❤️分割线❤️------------------------- —————————

    2024年02月08日
    浏览(57)
  • 【软考数据库】第十三章 云计算与大数据处理

    目录 13.1 云计算 13.1.1 云计算的关键特征 13.1.2 云计算分类 13.1.3 云关键技术 13.1.4 云计算的安全 13.1.5 云安全实施的步骤 13.2 大数据  前言: 笔记来自《文老师软考数据库》教材精讲,精讲视频在b站,某宝都可以找到,个人感觉通俗易懂。 13.1.1 云计算的关键特征 云计算是与

    2024年01月23日
    浏览(47)
  • 数据库——DAY4(练习-在表中查找数据-多表查询)

    一、实验要求(多表查询) 素材: 1.创建student和score表 CREATE TABLE student ( id INT(10) NOT NULL UNIQUE PRIMARY KEY , name VARCHAR(20) NOT NULL , sex VARCHAR(4) , birth YEAR, department VARCHAR(20) , address VARCHAR(50) ); 创建score表。 SQL代码如下: CREATE TABLE score ( id INT(10) NOT NULL UNIQUE PRIMARY KEY AUTO_INCREMENT , stu

    2024年01月18日
    浏览(44)
  • 数据库系统头歌实验二 SQL的多表查询

    第一关:等值连接:求S表和J表城市相同的等值连接(列顺序还是按照S、J表) 工程项目表J由工程项目代码(JNO)、工程项目名(JNAME)、工程项目所在城市(CITY)组成。 供应商表S由供应商代码(SNO)、供应商姓名(SNAME)、供应商状态(STATUS)、供应商所在城市(CITY)组成. S表如下图

    2024年02月07日
    浏览(55)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包