MySQL-多表查询

2023-10-27

1. 简介

含义:又称连接查询,当查询的字段来自于多个表时,就会用到连接查询

2.笛卡尔现象

笛卡尔乘积现象:表1 有m行,表2有n行,结果=m*n行

  • 发生原因:没有有效的连接条件
  • 如何避免:添加有效的连接条件

3.分类

按年代分

  • sql92标准:仅仅支持内连接
  • sql99标准【推荐】:支持内连接+外连接(左外和右外)+交叉连接

按功能分

  • 内连接
    • 等值连接
    • 非等值连接
    • 自连接
  • 外连接
    • 左外连接
    • 右外连接
    • 全外连接
  • 交叉连接

4.sql92标准

4.1 等值连接

  1. 多表等值连接的结果为多表的交集部分
  2. n表连接,至少需要n-1个连接条件
  3. 多表的顺序没有要求
  4. 一般需要为表起别名
  5. 可以搭配前面介绍的所有子句使用,比如排序、分组、筛选

案例1:查询女神名和对应的男神名

SELECT 
	NAME,boyName 
FROM
	boys,beauty
WHERE 
	beauty.boyfriend_id= boys.id;

案例2:查询员工名和对应的部门名

SELECT 
	last_name,department_name
FROM 
	employees,departments
WHERE 
	employees.`department_id`=departments.`department_id`;
4.12 为表起别名
  1. 提高语句的简洁度
  2. 区分多个重名的字段

注意:如果为表起了别名之后,则查询的字段就不能使用原来的表名去限定

案例3:查询员工名、工种号、工种名

SELECT 
	e.last_name,e.job_id,j.job_title
FROM 
	employees  e,jobs j
WHERE 
	e.`job_id`=j.`job_id`;
4.13.两个表的顺序可调换

案例4:查询员工名、工种号、工种名

SELECT 
	e.last_name,e.job_id,j.job_title
FROM 
	jobs j,employees e
WHERE 
	e.`job_id`=j.`job_id`;
4.14 加筛选

案例5:查询有奖金的员工名、部门名

SELECT 
	last_name,department_name,commission_pct
FROM 
	employees e,departments d
WHERE 
	e.`department_id`=d.`department_id`
					AND 
	e.`commission_pct` IS NOT NULL;

案例6:查询城市名中第二个字符为o的部门名和城市名

SELECT 
	department_name,city
FROM 
	departments d,locations l
WHERE 
	d.`location_id` = l.`location_id`
	AND city LIKE '_o%';
4.15 加分组

案例1:查询每个城市的部门个数

SELECT 
	COUNT(*) 个数,city
FROM 
	departments d,locations l
WHERE 
	d.`location_id`=l.`location_id`
GROUP BY city;

#案例2:查询有奖金的每个部门的部门名和部门的领导编号和该部门的最低工资

SELECT 
	department_name,d.`manager_id`,MIN(salary)
FROM 
	departments d,employees e
WHERE 
	d.`department_id`=e.`department_id`
AND 
	commission_pct IS NOT NULL
GROUP BY department_name,d.`manager_id`;
4.16 加排序

案例:查询每个工种的工种名和员工的个数,并且按员工个数降序

SELECT 
	job_title,COUNT(*)
FROM 
	employees e,jobs j
WHERE 
	e.`job_id`=j.`job_id`
GROUP BY job_title
ORDER BY COUNT(*) DESC;
4.17 实现三表连接

案例:查询员工名、部门名和所在的城市

SELECT 
	last_name,department_name,city
FROM 
	employees e,departments d,locations l
WHERE 
	e.`department_id`=d.`department_id`
AND 
d.`location_id`=l.`location_id`
AND 
city LIKE 's%'
ORDER BY department_name DESC;

4.2 非等值连接

含义:连接条件不是使用等号的称为非等值连接

案例1:查询员工的工资和工资级别
分析:员工表 employees与职绩表job_grades没有相同的字段进行连接,唯一有关系的就是工资,那么我们使用非等值连接进行查询。

SELECT 
	salary,grade_level
FROM 
	employees e,job_grades g
WHERE 
	salary BETWEEN g.`lowest_sal` AND g.`highest_sal`

4.3 自连接

含义:自连接可以理解为自己连接自己,在一张表上面所进行的操作;将一张表分成两张结构和数据完全一样的表

案例:查询员工名和上级的名称
分析:由于员工名与上级名都在 employees表中,上级本质上也是员工,所以使用自连接。

SELECT 
e.employee_id,e.last_name,m.employee_id,m.last_name
FROM 
employees e,employees m
WHERE 
e.`manager_id`=m.`employee_id`;

5.sql99标准

语法
select 查询列表
from 表1 别名 【连接类型】
join 表2 别名
on 连接条件
【where筛选条件】
【group by 分组】
【having 筛选条件】
【order by 排序列表】

分类

  • 内连接:inner
  • 外连接
    • 左外连接 :left 【outer】
    • 右外连接:right 【outer】
    • 全外连接:full【outer】
  • 交叉连接:cross

5.1内连接

语法:

select 
	查询列表
from1 别名
inner join2 别名
on 连接条件
where 筛选条件;

特点

  1. 添加排序、分组、筛选
  2. inner可以省略
  3. 筛选条件放在where后面,连接条件放在on后面,提高分离性,便于阅读
  4. inner join连接和sql92语法的等值连接效果是一样的,都是查询多表的交集
5.11等值连接

案例1.查询员工名、部门名

SELECT 
	last_name,department_name
FROM 
	departments d
INNER JOIN  
	employees e
ON 
	e.`department_id` = d.`department_id`;

案例2.查询名字中包含e的员工名和工种名(添加筛选)

SELECT 
	last_name,job_title
FROM 
	employees e
INNER JOIN 
	jobs j
ON 
	e.`job_id`=  j.`job_id`
WHERE
	e.`last_name` LIKE '%e%';

案例3. 查询部门个数>3的城市名和部门个数,(添加分组+筛选)

#①查询每个城市的部门个数
#②在①结果上筛选满足条件的
SELECT 
	city,COUNT(*) 部门个数
FROM 
	departments d
INNER JOIN 
	locations l
ON 
	d.`location_id`=l.`location_id`
GROUP BY city
HAVING COUNT(*)>3;

案例4.查询哪个部门的员工个数>3的部门名和员工个数,并按个数降序(添加排序)

#1.查询每个部门的员工个数
SELECT 
	COUNT(*),department_name
FROM 
	employees e
INNER JOIN 
	departments d
ON 
	e.`department_id`=d.`department_id`
GROUP BY department_name

在①结果上筛选员工个数>3的记录,并排序

SELECT 
	COUNT(*) 个数,department_name
FROM 
	employees e
INNER JOIN 
	departments d
ON 
	e.`department_id`=d.`department_id`
GROUP BY department_name
HAVING COUNT(*)>3
ORDER BY COUNT(*) DESC;

案例5.查询员工名、部门名、工种名,并按部门名降序(添加三表连接)

SELECT 
	last_name,department_name,job_title
FROM 
	employees e
INNER JOIN 
	departments d ON e.`department_id`=d.`department_id`
INNER JOIN 
	jobs j ON e.`job_id` = j.`job_id`
ORDER BY department_name DESC;
5.12 非等值连接

查询员工的工资级别

SELECT salary,grade_level
FROM employees e
 JOIN job_grades g
 ON e.`salary` BETWEEN g.`lowest_sal` AND g.`highest_sal`;

查询工资级别的个数>20的个数,并且按工资级别降序

SELECT 
	COUNT(*),grade_level
FROM 
	employees e
JOIN 
	job_grades g
ON 
	e.`salary` BETWEEN g.`lowest_sal` AND g.`highest_sal`
GROUP BY grade_level
HAVING COUNT(*)>20
ORDER BY grade_level DESC;
5.13 自连接

案例1:查询员工的名字、上级的名字

 SELECT 
 	e.last_name,m.last_name
 FROM 
 	employees e
JOIN 
	employees m
ON e.`manager_id`= m.`employee_id`;

案例2:查询姓名中包含字符k的员工的名字、上级的名字

SELECT 
	e.last_name,m.last_name
FROM 
	employees e
JOIN 
	employees m
ON 
	e.`manager_id`= m.`employee_id`
WHERE e.`last_name` LIKE '%k%';

5.2外连接

应用场景:用于查询一个表中有,另一个表没有的记录

特点:

  • 外连接的查询结果为主表中的所有记录
    • 如果从表中有和它匹配的,则显示匹配的值
    • 如果从表中没有和它匹配的,则显示null
    • 外连接查询结果=内连接结果+主表中有而从表没有的记录
  • 左外连接,left join左边的是主表
  • 右外连接,right join右边的是主表
  • 左外和右外交换两个表的顺序,可以实现同样的效果
  • 全外连接=内连接的结果+表1中有但表2没有的+表2中有但表1没有的

案例1:查询哪个部门没有员工

 #左外
SELECT 
	d.*,e.employee_id
FROM
	departments d
LEFT OUTER JOIN 
	employees e
ON 
	d.`department_id` = e.`department_id`
WHERE 
	e.`employee_id` IS NULL;
#右外
SELECT 
	d.*,e.employee_id
FROM 
	employees e
RIGHT OUTER JOIN 
	departments d
ON 
	d.`department_id` = e.`department_id`
WHERE 
	e.`employee_id` IS NULL;

全外连接

全外连接=内连接的结果+表1中有但表2没有的+表2中有但表1没有的

 USE girls;
 SELECT 
 	b.*,bo.*
 FROM 
 	beauty b
 FULL OUTER JOIN 
 	boys bo
 ON 
 	b.`boyfriend_id` = bo.id;

交叉连接(笛卡尔乘积)

 SELECT b.*,bo.*
 FROM beauty b
 CROSS JOIN boys bo;

6.sql92和 sql99pk

  • 功能:sql99支持的较多
  • 可读性:sql99实现连接条件和筛选条件的分离,可读性较高
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

MySQL-多表查询 的相关文章

  • 清理码头 - 删除“不必要”的东西

    我习惯用Jetty http jetty codehaus org jetty 作为我的网络容器 我对我做了什么安装步骤得到原始的焦油球并且清理一些目录和文件从中 我在这里想提出的是 您通常从 Jetty 中删除什么以在生产 登台环境中使用
  • Android 2.2 SDK - Droid X 相机活动无法正常完成

    我注意到我在 Droid X 上调用的默认相机活动与我的 Droid 和 Nexus One 上的默认相机活动看起来不同 在 Droid 和 Nexus One 上选择 确定 后 活动将完成 Droid X 有一个 完成 按钮 它将带您返回
  • 添加动态数量的监听器(Spring JMS)

    我需要添加多个侦听器 如中所述application properties文件 就像下面这样 InTopics Sample QUT4 Sample T05 Sample T01 Sample JT7 注意 这个数字可以多一些 也可以少一些
  • 如何在spring mvc中从控制器名称+操作名称获取映射的URL?

    是否有现有的解决方案可以从 Spring MVC3 中的 控制器名称 操作名称 获取映射的 URL 例如 asp net mvc 或 Rails 中的 UrlHelper 我觉得非常有用 thx 也许 你想要这样的东西 in your Co
  • 如何使用 SimpleDateFormat 解析多种格式的日期

    我正在尝试解析文档中的一些日期 用户似乎以类似但不完全相同的格式输入了这些日期 以下是格式 9 09 9 2009 09 2009 9 1 2009 9 1 2009 尝试解析所有这些内容的最佳方法是什么 这些似乎是最常见的 但我想让我困扰
  • 对话框上的 EditText 不返回任何文本

    我太累了 找不到错误 我没有发现任何错误 但我没有从 editText 收到任何文本 请看下面的代码 活动密码 xml
  • 无法使用maven编译java项目

    我正在尝试在 java 16 0 1 上使用 maven 构建 IntelliJ 项目 但它无法编译我的项目 尽管 IntelliJ 能够成功完成 在此之前 我使用maven编译了一个java 15项目 但我决定将所有内容更新到16 0 1
  • 如何从秘密字符串中制作 HMAC_SHA256 密钥以在 jose4j 中与 JWT 一起使用?

    我想生成 JWT 并使用 HMAC SHA256 对其进行签名 对于该任务我必须使用jose4j https bitbucket org b c jose4j wiki Home 我尝试根据秘密生成密钥 SecretKeySpec key
  • 如何在 JSP 中导入类?

    我是一个完全的JSP初学者 我正在尝试使用java util List在 JSP 页面中 我需要做什么才能使用除以下类之外的类java lang 使用以下导入语句进行导入java util List 顺便说一句 要导入多个类 请使用以下格式
  • 使用 RecyclerView 适配器在运行时更改布局屏幕

    我有两个布局文件 如下所示 如果列表中存在数据 则我显示此布局 当列表为空时 我会显示此布局 现在我想在运行时更改布局 当用户从列表中删除最后一项时 我想将布局更改为第二张图片中显示的 空购物车布局 In getItemCount Recy
  • 在java中实现你自己的阻塞队列

    我知道这个问题之前已经被问过并回答过很多次了 但我只是无法根据互联网上找到的示例找出窍门 例如this http tutorials jenkov com java concurrency blocking queues html or t
  • 如何将 Jfreechart(饼图)添加到 netbeans 的面板中

    我正在使用 netbeans gui 编辑器 并且正在尝试添加一个本身位于内部框架中的 Jfreechart 并且这个内部框架我想将其添加到面板中 正如您在此图中看到的那样 抱歉 我无法直接发布图像 因为我新手 http www flick
  • 获取给定类文件的目录路径

    我遇到的代码尝试从类本身的 class 文件所在的同一目录中读取一些配置文件 File configFiles new File this getClass getResource getPath listFiles new Filenam
  • Java 收集返回顶级项目的映射的嵌套流

    我有以下模型 class Item String name List
  • 如何记录来自 Akka (Java) 的所有传入消息

    在 Scala 中 您可以使用 LoggingReceive 包装接收函数 如何通过 Java API 实现相同的目标 def receive LoggingReceive case x do something Scala API 有Lo
  • 如何通过 Inno Setup for NetBeans 使用自定义 .iss 文件

    我将 Inno Setup 5 与 NetBeans 8 一起使用 并且我已经能够创建一个安装程序来安装该应用程序C users username local appname 但是我希望将其安装在C Programfiles 我如何在 Ne
  • 为什么java中的for-each循环中需要声明变量

    for 每个循环的通常形式是这样的 for Foo bar bars bar doThings 但如果我想保留 bar 直到循环结束 我可以not使用 foreach 循环 Foo bar null Syntax error on toke
  • 挂钩 Eclipse 构建过程吗?

    我希望在 Eclipse 中按下构建按钮时能够运行一个简单的 Java 程序 目前 当我单击 构建 时 它会运行一些 JRebel 日志记录代码 我有一个程序可以解析 JRebel 日志文件并将统计信息存储在数据库中 是否可以编写一个插件或
  • Java &= 运算符应用 & 或 && 吗?

    Assuming boolean a false 我想知道是否这样做 a b 相当于 a a b logical AND a is false hence b is not evaluated 或者另一方面 这意味着 a a b Bitwi
  • Android 和 Java 中绘制椭圆的区别

    在Java中由于某种原因Ellipse2D Double使用参数 height width x y 当我创建一个RectF在Android中参数是 left top right bottom 所以我对适应差异有点困惑 如果在 Java 中创

随机推荐

  • IDEA中使用vue 报 Namespace 'xxx' is not bound的解决办法

    IDE 问题编辑页中v on指令标红并提示 Namespace v on is not bound 解决办法 file Settings下 点ok后标红提示的问题解决 此方法是 Namespace xxx is not bound 通用解决
  • 阿里云RDS如何进行账号及数据库管理?

    本文说说如何管理RDS实例 进入控制台 选中RDS 在列表中选择我们需要管理的地域 并且找到我们需要管理的实例 首先建立一个数据库 点击数据库管理 点击创建数据库 输入数据库名 确定
  • [工具使用]WhatWeb

    网站指纹识别工具WhatWeb WhatWeb简介 用法 10小点 因为想要面对一个新的开始 一个人必须有梦想 有希望 有对未来的憧憬 如果没有这些 就不叫新的开始 而叫逃亡 玛丽亚 杜埃尼亚斯 WhatWeb简介 web指纹扫描主要用于对
  • modbus tcp报文解析_Modbus协议详解

    Modbus概述 Modbus通信协议由Modicon公司 现已经为施耐德公司并购 成为其旗下的子品牌 于1979年发明的 是全球最早用于工业现场的总线规约 由于其免费公开发行 使用该协议的厂家无需缴纳任何费用 Modbus通信协议采用的是
  • 如何共享服务器主机文件,服务器主机如何做文件共享

    服务器主机如何做文件共享 内容精选 换一换 云堡垒机支持文件传输功能 以及审计传输的文件 Linux主机和Windows主机的文件传输方式有所区别 Linux主机上传 下载文件 可选择Web运维和FTP SFTP客户端运维两种方式 Web运
  • C#学习笔记-C#的类及其成员

    类 是面向对象语言的的一个基本特征 它是一种数据结构 类可以理解为将现实生活中的食物进行抽象的结果 比如创建一个person的类 人有身高体重年龄的基本属性 而类的实例化是指将类具体化 比如刚刚创建的一个person的类 将他实例化之后 就
  • 【Vue】关于CSS样式绑定整理

    因突发奇想设计一款组件 需要根据属性动态绑定样式 故而整理一些Vue的动态绑定样式方法 传参绑定类似 不做过多叙述 仅供参考 方式一 直接在元素上绑定具体样式 方式二 定义属性对象 绑定到style 可以在style中使用定义的变量 方式二
  • Linux格式化命令

    如果我们购买一个新的虚拟主机空间或者要更改操作程序 会经常使用到磁盘格式化来清空以前的数据 磁盘格式化的方法很多 我们常用的是NTFS和linux格式化命令两种方法来格式化磁盘 我们讲解一下linux格式化命令的详情 linux格式化磁盘命
  • 自学中走出的大三学生面临就业选择

    来信 贺老师您好 这是我第二次向您请教问题了 非常感谢您上次给我的建议 注 上次来信见http blog csdn net sxhelijian article details 7760011 如邮件主题所述 我是一个即将大四的学生 我学的
  • Java实体映射工具MapStruct使用详解

    1 序 通常在后端开发中经常不直接返回实体Entity类 经过处理转换返回前端 前端提交过来的对象也需要经过转换Entity实体才做存储 通常使用的BeanUtils copyProperties方法也比较粗暴 不仅效率低下 使用反射 而且
  • 图解线性表顺序存储结构(附完整代码)

    目录 一 前言 二 常用接口的实现 三 完整代码 一 前言 顺序表是线性表采用顺序存储结构在计算机内存中的存储方式 它由多个连续的存储单元构成 每个存储单元存放线性表的一个元素 逻辑上相邻的数据元素在内存中也是相邻的 不需要额外的内存空间来
  • html中下划虚线dash定义长度,【CSS】有没有办法自定义 border 为 dashed 时的虚线间距?...

    CSS 的 border 1px dashed 样式太难看了 虚线非常的宽 dotted 也是一样 间距太窄 有没有办法控制虚线或者点的长度或者间距呢 回答 可以的 用渐变 width 100 height 1px background i
  • xml文件Unable to resolve table ‘xxx‘解决

    xml文件Unable to resolve table xxx 解决 问题 解决 打开IDEA数据库设置 输入所用的数据库名 问题解决
  • 导入数据_导入外部数据的三个技巧

    使用Excel编辑外部数据 如 工作表 文本文件 网页 等 时 为了方便可不必将其复制 粘贴到当前工作表 只需要使用 导入 功能 就能实现外部数据的输入 导入Excel表格数据 如图所示为设计好的 一季度业绩快报 如果想要在其他工作表中引用
  • Fiddler配置显示响应时间和服务器IP

    1 Fiddler如何显示响应时间 1 在Tool bar上面找到Rules gt Customize Rules 或Ctrl R快捷键 2 在class Handlers 里面添加 function BeginRequestTime oS
  • ACE_Message_Block功能和实现浅析

    ACE Message Block实现浅析 1 概述 ACE Message Block是ACE中很重要的一个类 和ACE框架中的重要模式的实现 如ACE Reactor ACE Proactor ACE Stream ACE Task都有
  • S32K SDK使用详解之S32 SDK软件架构详解

    内容提要 引言 1 SDK的MCU平台相关设备驱动解析 SDK gt platform gt devices目录 1 1 子目录common 1 2 子目录S32K1xx 为具体使用的MCU型号 可能为 S32K116 S32K118 S3
  • sql语句中where一定要放在group by 之前

    sql语句中where一定要放在group by 之前 分组查询出来的结果是根据第一个被查询出来的数据结果作为结果的 所以如果在查询的时候需要加入条件 那么就一定要在分组之前把条件加进去 select litigant name count
  • Apache安全漏洞

    Apache安全漏洞 1 Apache中间件介绍 Apache是世界使用排名第一的Web服务器软件 它可以运行在几乎所有广泛使用的计算机平台上 由于其跨平台和安全性被广泛使用 是最流行的Web服务器端软件之一 它快速 可靠并且可通过简单的A
  • MySQL-多表查询

    多表查询 1 简介 2 笛卡尔现象 3 分类 4 sql92标准 4 1 等值连接 4 12 为表起别名 4 13 两个表的顺序可调换 4 14 加筛选 4 15 加分组 4 16 加排序 4 17 实现三表连接 4 2 非等值连接 4 3