首页 > 数据库 >mysql多表查询

mysql多表查询

时间:2023-10-19 16:00:12浏览次数:36  
标签:何先振 多表 连接 查询 mysql 员工 id

第11讲:MySQL的多表查询

原创 何先振 何先振 2023-08-22 08:15 发表于广东 收录于合集#MySQL初级教程24个
以下文章来源于何先振,责编小何

 

图片


多表查询操作的原因

 

表和表有很多对应的关系,比如:员工表都有自己的部门。当我们想查看一个员工的部门的时候, 就需要查询部门表。

图片


 

先查员工表对应的部门id

图片


 

然后通过员工的部门id,查对应的部门才能知道这个部门。如果还想知道这个部门在哪,还需要通过location_id 查对应的locations表。

图片


图片


 

这样一共就要多条sql才能查出来,后台跟数据库的网络传输就需要三次,这样就比较影响效率。

 

为了减少网络传输很多时候我们是可以通过多表查询写一条SQL查出来,这样后台跟数据库的网络传输只需要一次就可以搞定。

 


多表查询的介绍

 

错误的多表查询:笛卡尔积错误

 

员工表有107个员工

图片


 

部门表有27个部门

图片


 

多表连接后,一共出现2889条,此时正好等于27*107,出现了交叉连接。

图片


 

出现这个交叉连接的原因,就是因为我们没有指定连接条件。

 

多表查询的正确方式:

 

需要有连接条件,通过where条件员工表的部门id关联部门表的部门id,此时查出的是106个员工。

 

为什么是106个员工,不是107个员工,因为之前有个员工没有部门id

图片


图片


 

如果查询的语句中出现了多个表中都存在的字段,则必须指明此字段所在的表

图片


图片


 

建议:从sql优化的角度,建议多表查询时,每个字段都指明其所在的表

图片


 

可以给表起别名,在SELECT和WHERE中使用表的别名。

图片


 

如果给表设置了别名,一旦在SELECT和WHERE中使用表名的话,则必须使用表的别名,而不能再使用表的原名。

图片


图片


 

如果有n个表实现多表的查询,则需要至少n-1个连接条件。

 

如图:三个表,两个连接条件,否则就会出现笛卡尔积错误。

图片



多表查询的分类

 

角度1:等值连接 vs 非等值连接

 

非等值连接就是连接条件不是使用等号,非等值连接的例子:

 

工资等级, 不同工资等级在这个范围内的就是这个等级,比如A等级的工资范围为1000-2999

图片


 

查询每个员工的工资等级 第一种使用between

图片


 

查询每个员工的工资等级 第一种使用>= 或者<=

图片


 

角度2:自连接 vs 非自连接

 

自己跟自己连接就是自连接

 

举例:每一个员工,都有一个上级,他的上级也是一个员工id,也就是manager_id

图片


 

如果我们需要查询每个员工的上级是谁,就需要自己跟自己连接,也就是员工表的上级id和员工表的员工id连,就可以查出上级的名字。

图片


 

角度3:内连接 vs 外连接

 

内连接:合并具有同一列的两个以上的表的行,结果集中不包含一个表与另一个表不匹配的行。

 

外连接:

 

定义:合并具有同一列的两个以上的表的行,结果集中除了包含一个表与另一个表匹配的行之外,还查询到了左表或者右表中不匹配的行。

 

分类:左外连接、右外连接、满外连接

 

左外连接:两个表在连接过程中除了返回满足连接条件的行以外,还返回左表中不满足条件的行。

 

右外连接:两个表在连接过程中除了返回满足连接条件的行以外,还返回右表中不满足条件的行。

 

例子:查询所有员工的last_name和deptment_name。

 

分析:这个需要员工表与部门表进行连接,要查询所有员工必须要用外连接。

 

解题:

 

SQL92语法实现外连接:(SQL92内连接就是前面讲内连接的写法)

 

哪个表缺数据,就使用+ ,Mysql不支持SQL92语法中外连接的写法,Oracle支持。

图片


 

SQL99语法使用 JOIN ..... ON 的方式实现多表查询。这种方式也能解决外连接的问题。MySQL是支持此种方式的。

 

SQL99语法如何实现内连接:

 

多表之间取消用逗号,使用JOIN连接,关联条件写在ON后面。也可以不省略INNER,使用INNER JOIN

图片


图片


 

employees表连接两张表

图片


 

SQL99语法如何实现外连接:

 

左外连接:使用LEFT JOIN

图片


 

右外连接:

图片


 

满外连接:MySQL不支持满外连接,Oracle支持。

图片



图片

推荐阅读书籍

何先振 振天教育专注互联网技术! 152篇原创内容 公众号 点击上方"何先振"关注并选择设为星标各类IT技术文章不会错过! 何先振

赞赏二维码喜欢作者

收录于合集 #MySQL初级教程  24个 上一篇第10讲:MySQL的排序和分页下一篇第12讲:UNION和UNION ALL的使用、七种JOIN的实现、SQL99的新特性 以上内容包含广告 阅读 120 何先振   ​     关注后可发消息         复制搜一搜分享收藏划线    

人划线

标签:何先振,多表,连接,查询,mysql,员工,id
From: https://www.cnblogs.com/cherishthepresent/p/17774923.html

相关文章

  • PostgreSQL查询约束和创建删除约束
    查询约束SELECTtc.constraint_name,tc.table_name,kcu.column_name,ccu.table_nameASforeign_table_name,ccu.column_nameASforeign_column_name,tc.is_deferrable,tc.initially_deferredFROMinformation_schema.table_constraintsAStc......
  • MySQL 8.0.34 MGR部署教程
    基于MySQL8.0.34MGR部署一、环境概述OSIPHostnameMySQLVersionDBPortMGRPortRedhat7.9172.20.10.3s18.0.34330633061Redhat7.9172.20.10.4s28.0.34330633061Redhat7.9172.20.10.5s38.0.34330633061    二、在各个节点安装M......
  • MySql执行异常处理、MySql事务回滚和提交,判断有异常则回滚。
    示例DELIMITER$$DROPPROCEDUREIFEXISTSsp_test1$$CREATEPROCEDUREsp_test1()top:BEGIN--错误标记,当sql执行出错的时候,设置标记等于1。DECLARE_errINTDEFAULT0;--错误标记处理,放到最后再声明,要放到游标后面。--不然会报错:Variableorcondit......
  • flex and bison usage in mysql
    queryparsinginmysqlmysqlsourcecodeversion:8.0.34(fromMYSQL_VERSIONfile)Thisanarticlefromquestionstounderstandings.whichfiledoesmysqlusetodefinesqlgrammar?sql/sql_yacc.yywhatisthenameyyparsereplacedwithinmysql?Sear......
  • 你也许不再需要使用 CSS Media Queries(媒体查询)了
    你也许不再需要使用CSSMediaQueries(媒体查询)了最近,CSS引入了一项新功能:ContainerQueries。它可以替代MediaQueries并实现MediaQueries无法胜任的任务。超越MediaQueries的功能让我们想象一个场景:在网页上有两列卡片。我们希望在卡片宽度较窄时,卡片内部呈上下布局......
  • 【SQL】where查询条件中的1=1 及<>的含义
    1=1 表示永远为真,不起约束作用查询所有,不会报错SELECTt.*,t.rowidFROMtable_nametWHERE1=1;Tips:查询table_name表中的所有数据 1<>1代表false, 返回空结果集SELECTt.*,t.rowidFROMtable_nametWHERE1<>1; Tips:table_name表中有无数据,均......
  • MyBatis Plus 达梦数据库 分页查询异常问题
    MyBatisPlus达梦数据库分页查询异常问题 一、问题背景根据博客《SpringBootMyBatisPlus整合达梦数据库》中提到分页查询问题,如果没有配置 MybatisPlusConfig.java文件,会出现如下现象:数据表PRODUCTION.PRODUCT_CATEGORY中的数据如下: 调用如下查询接口:http:/......
  • mysql三种方案优化 2000w 数据大表
    摘录自当我们业务数据库表中的数据越来越多,如果你也和我遇到了以下类似场景,那让我们一起来解决这个问题数据的插入,查询时长较长后续业务需求的扩展在表中新增字段影响较大表中的数据并不是所有的都为有效数据需求只查询时间区间内的评估表数据体量我们可以从表容量/磁......
  • mysql 日期时间值中获取年、月、日等部分日期或时间值
    在MySQL中,可以使用一系列内置函数来从日期时间值中获取年、月、日等部分日期或时间值。以下是一些常用的函数:YEAR():用于从日期时间值中提取年份。例如,SELECTYEAR('2023-06-12')将返回2023。MONTH():用于从日期时间值中提取月份。例如,SELECTMONTH('2023-06-12')将返回6。DAY():......
  • mysql-备份还原
    mysqldump备份与恢复#导出的备份文件就是数据库脚本文件mysqldump-uroot-p[密码]--databases库名1[库名2]…>/备份路径/备份文件名.sql例:mysqldump-uroot-p123456--databasesschool>/opt/school.sqlmysqldump-uroot-p123456--databasesmysqlschool>/op......