二、MySQL连接查询学习笔记(多表连接查询:内连接,外连接,交叉连接详解)

MySQL连接查询(多表连接查询:内连接,外连接,交叉连接详解)

6:多表连接查询

笛卡尔乘积:如果连接条件省略或无效则会出现
解决办法:添加上连接条件

连接查询的分类:

1.按年代分类:1)sql 92标准:仅仅支持内连接2)sql 99标准 **(推荐使用)** :支持内连接、外连接(左外 和 右外)、交叉连接
2.按功能分类:1)内连接:等值连接非等值连接自连接2)外连接:左外连接右外连接全外连接3)交叉连接

一、传统模式下的连接 :等值连接——非等值连接

1.等值连接的结果 = 多个表的交集
2.n表连接,至少需要n-1个连接条件
3.多个表不分主次,没有顺序要求
4.一般为表起别名,提高阅读性和性能

二、sql99语法:通过join关键字实现连接

含义:1999年推出的sql语法
支持:
等值连接、非等值连接 (内连接)
外连接
交叉连接语法:

select 字段,…
from 表1
【inner|left outer|right outer|cross】join 表2 on 连接条件
【inner|left outer|right outer|cross】join 表3 on 连接条件
【where 筛选条件】
【group by 分组字段】
【having 分组后的筛选条件】
【order by 排序的字段或表达式】

好处:语句上,连接条件和筛选条件实现了分离,简洁明了!

三、自连接

案例:查询员工名和直接上级的名称

sql99

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

sql92

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

一、等值连接
1)多表等值连接的结果实际上为多个表的交集部分
2)n张表进行连接,则至少需要 n-1 个连接条件
3)多表的顺序没有要求
4) 一般需要为表起别名,因为可能同一个字段名,会在多张查询的表中存在。即可以为表取别名,区分多个重名的字段。为表使用别名后,只能使用别名去"select"!
5) 等值连接可以搭配排序(order by)、分组(group by)、筛选(where/and/like)来使用

# sql 92
# 可以实现三表连接
# 查询员工名、部门名、和所在的城市
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;# 加分组条件
# 查询每个城市的部门个数
SELECT COUNT(*) 个数 , city
FROM departments d , locations l
WHERE d.location_id = l.location_id
GROUP BY city;
# sql 99# 1.等值连接
# 查询员工名、部门名
SELECT last_name,department_name
FROM employees e
INNER JOIN departments d
ON e.department_id = d.department_id;# 查询名字中包含e的员工名和工种名
SELECT last_name , job_title,j.job_id
FROM employees e
INNER JOIN jobs j 
on e.job_id = j.job_id
WHERE e.last_name LIKE '%e%';# 查询部门个数>3的城市名和部门个数,(添加分组+筛选)
SELECT city,COUNT(*) 部门个数
FROM locations l
INNER JOIN departments d
ON l.location_id = d.location_id
GROUP BY city
HAVING 部门个数>3;# 查询部分的员工个数>3的部门名和员工个数,并按员工个数降序排序SELECT COUNT(*) 个数,department_name
FROM departments d
INNER JOIN employees e
ON e.department_id = d.department_id
GROUP BY department_name
HAVING COUNT(*) > 3
ORDER BY COUNT(*) DESC;# 查询员工名、部门名、工种名,并按部门名降序排列(三表连接)
SELECT last_name,department_name,job_title
FROM employees e
INNER JOIN jobs j ON e.job_id = j.job_id
INNER JOIN departments d ON e.department_id = d.department_id
ORDER BY department_name DESC;
sql 99 特点:
1、也可添加排序、分组、筛选
2、inner 可以省略
3、 筛选条件放在where后面,连接条件放在on后面,提高分离性,便于阅读
4、inner join连接 和sql92语法中的等值连接效果相同,都是查询多表的交集

二、非等值连接
表与表之间没有相同项(或有相同但是不能用),但是表之间某个或某些项直接存在着一定的关系。

比如说员工信息表,里面包含员工工资,另外一张工资等级表将工资进行等级划分,而员工的工资就可以根据工资等级表来划分为某个等级。
where 列名 BETWEEN … AND …

# sql 92
# 非等值连接
# 查询员工的工资和工资级别
SELECT salary , grade_level
FROM employees e, job_grades g
WHERE salary BETWEEN g.lowest_sal AND highest_sal
ORDER BY g.grade_level;
# AND g.grade_level = 'A';
# sql 99
# 非等值连接# 查询员工的工资级别
SELECT salary , grade_level
FROM employees e
INNER JOIN job_grades g
ON e.salary BETWEEN g.lowest_sal AND g.highest_sal;# 查询每个工资级别的员工个数>20的个数,并按工资级别降序排列
SELECT salary , grade_level , COUNT(*)
FROM employees e
INNER 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;

三、自连接 :自己连接自己
自连接相当于等值连接,不同的是等值连接的项在不同的表单当中,而自连接的连接项在同一个表单中。单一表单中某项和另外一项存在着关联关系。

比如说员工信息表中,普通员工A的领导是B,而B本身也是员工,因此也包含着员工信息表中。所以A的manager_id就是B的employee_id

# sql 92
# 自连接
# 查询员工名 和 上级的名称
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;
# sql 99
# 自连接# 查询员工的名字、上级的名字
SELECT e.last_name , m.last_name 
FROM employees e
INNER JOIN employees m
ON e.employee_id = m.manager_id;# 查询包含字符k的员工名字、上级的名字
SELECT e.last_name , m.last_name 
FROM employees e
INNER JOIN employees m
ON e.employee_id = m.manager_id
WHERE e.last_name LIKE '%k%';

二、外连接

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

特点:
1)外连接的查询结果为主表中的所有记录。如果从表中有和它匹配的(也就是连接条件成立),则显示匹配的值。如果从表中没有和它匹配的,则显示null。
外连接查询的结果 = 内连接查询的结果 + 主表中有而从表中没有的记录
2)左外连接,left join 左边的是主表
右外连接,right join 右边的是主表

# sql 99
# 外连接# 查询男朋友 不在男神表中的 女神名
USE girls;
SELECT * FROM boys;# 左外连接
SELECT b.name , bo.*
FROM beauty b
LEFT OUTER JOIN boys bo
ON b.boyfriend_id = bo.id
WHERE bo.id IS NULL;# 右外连接
SELECT b.name , bo.*
FROM boys bo
RIGHT OUTER JOIN beauty b
ON b.boyfriend_id = bo.id
WHERE bo.id IS NULL;  # 查询哪个部门没有员工
# 左外
USE myemployees
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;

3)左外和右外交换两个表的顺序时,可以实现同样的效果
4) 全外连接 = 内连接的结果 + 表1中有但表2中没有的结果 + 表2中有但表1中没有的结果

# 全外
use girls
SELECT b.* ,BOTH.*
FROM beauty b
FULL OUTER JOIN boys bo 
ON b.boyfirend_id = bo.id;

5)交叉连接(笛卡尔积)

# 交叉连接(笛卡尔积)
USE girls
SELECT b.* ,bo.*
FROM beauty b
CROSS JOIN boys bo;

常见连接类型总结:
在这里插入图片描述
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/471374.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

android 本机号码一键登录,什么是本机号码一键登录?APP本机号码一键登录如何实现?...

三大运营商推出一键登录的服务后,由于其便捷性和安全性都好于传统短信验证码,越来越多的APP注册登录环节都在使用本机号码一键登录验证方式。本文主要介绍了本机号码一键登录特点以及实现方法。一、什么是本机号码一键登录?平时我们填手机号接…

LeetCode 2116. 判断一个括号字符串是否有效(栈)

文章目录1. 题目2. 解题1. 题目 一个括号字符串是只由 ( 和 ) 组成的 非空 字符串。 如果一个字符串满足下面 任意 一个条件,那么它就是有效的: 字符串为 ().它可以表示为 AB(A 与 B 连接),其中A 和 B 都是有效括号字…

NavigationController

前面的一篇文章《iOS开发16:使用Navigation Controller切换视图》中的小例子在运行时,屏幕上方出现的工具栏就是Navigation Bar,而所谓UINavigationItem就可以理解为Navigation Bar中的内容,通过编辑UINavigationItem,…

android studio windows,AndroidStudio的使用(Windows)

演示模式View---Enter presentation mode演示代码快捷提示commondshfita最近修改的文件ctrlshfite代码书签在一行代码处使用F11也可以在navigate--bootmarkPaste_Image.png回退到上一个浏览的地方ctrlaltleft/right快速进入方法内ctrlb查看方法的参数定义commondpPaste_Image.p…

LeetCode 2119. 反转两次的数字

文章目录1. 题目2. 解题1. 题目 反转 一个整数意味着倒置它的所有位。 例如,反转 2021 得到 1202 。反转 12300 得到 321 ,不保留前导零 。 给你一个整数 num ,反转 num 得到 reversed1 ,接着反转 reversed1 得到 reversed2 。 …

三、MySQL子查询学习笔记(标量子查询、列子查询、行子查询、表子查询 详解)

三、MySQL子查询学习笔记 7:子查询 含义: 一条查询语句中又嵌套了另一条完整的select语句,其中被嵌套的select语句,称为子查询或内查询;在外面的查询语句,称为主查询或外查询 分类: 一、按子查…

LeetCode 2120. 执行所有后缀指令(模拟)

文章目录1. 题目2. 解题1. 题目 现有一个 n x n 大小的网格,左上角单元格坐标 (0, 0) ,右下角单元格坐标 (n - 1, n - 1) 。 给你整数 n 和一个整数数组 startPos ,其中 startPos [startrow, startcol] 表示机器人最开始在坐标为 (startrow…

android代理生命周期,了解 Activity 生命周期

当用户浏览、退出和返回到您的应用时,您应用中的在生命周期回调方法中,您可以声明用户离开和再次进入 Activity 时 Activity 的行为方式。例如,如果您正构建流媒体视频播放器,当用户切换至另一应用时,您可能要暂停视频…

LeetCode 2121. 相同元素的间隔之和(前缀和)

文章目录1. 题目2. 解题1. 题目 给你一个下标从 0 开始、由 n 个整数组成的数组 arr 。 arr 中两个元素的 间隔 定义为它们下标之间的 绝对差 。更正式地,arr[i] 和 arr[j] 之间的间隔是 |i - j| 。 返回一个长度为 n 的数组 intervals ,其中 interva…

在android添加数据采集,一种基于Android系统的地理信息数据采集方法与流程

本方法属于采集地理信息数据的发明,是一种基于android操作系统和gis地理信息系统进行户外地理信息数据采集的方法。背景技术:众所周知地理信息数据采集在很多行业中都有应用,比如说农业中的土地普查、城市管理中的地下管线普查、工业中的地质…

LeetCode 2124. 检查是否所有 A 都在 B 之前

文章目录1. 题目2. 解题1. 题目 给你一个 仅 由字符 a 和 b 组成的字符串 s 。 如果字符串中 每个 ‘a’ 都出现在 每个 ‘b’ 之前,返回 true ;否则,返回 false 。 示例 1: 输入:s "aaabbb" 输出&#x…

设计模式—桥接模式

前言 这里以电视遥控器为例子引出桥接模式,首先每个牌子的电视都有一个遥控器,可以设计吧遥控器作为一个抽象类,抽象类中提供遥控器的所有实现,其他具体电视品牌的遥控器都继承这个抽象类 这样的实现使得每个不同型号的电视都有自…

LeetCode 2125. 银行中的激光束数量

文章目录1. 题目2. 解题1. 题目 银行内部的防盗安全装置已经激活。 给你一个下标从 0 开始的二进制字符串数组 bank ,表示银行的平面图,这是一个大小为 m x n 的二维矩阵。 bank[i] 表示第 i 行的设备分布,由若干 ‘0’ 和若干 ‘1’ 组成。…

LeetCode 2126. 摧毁小行星(贪心)

文章目录1. 题目2. 解题1. 题目 给你一个整数 mass ,它表示一颗行星的初始质量。 再给你一个整数数组 asteroids ,其中 asteroids[i] 是第 i 颗小行星的质量。 你可以按 任意顺序 重新安排小行星的顺序,然后让行星跟它们发生碰撞。如果行星…

bzoj:2018 [Usaco2009 Nov]农场技艺大赛

Description Input 第1行:10个空格分开的整数: N, a, b, c, d, e, f, g, h, M Output 第1行:满足总重量最轻,且用度之和最大的N头奶牛的总体重模M后的余数。 Sample Input 2 0 1 5 55555555 0 1 0 55555555 55555555Sample Output 51HINT 样例…

LeetCode 2129. 将标题首字母大写

文章目录1. 题目2. 解题1. 题目 给你一个字符串 title ,它由单个空格连接一个或多个单词组成,每个单词都只包含英文字母。请你按以下规则将每个单词的首字母 大写 : 如果单词的长度为 1 或者 2 ,所有字母变成小写。否则&#xf…

LeetCode 2130. 链表最大孪生和(链表快慢指针+反转链表+双指针)

文章目录1. 题目2. 解题1. 题目 在一个大小为 n 且 n 为 偶数 的链表中&#xff0c;对于 0 < i < (n / 2) - 1 的 i &#xff0c;第 i 个节点&#xff08;下标从 0 开始&#xff09;的孪生节点为第 (n-1-i) 个节点 。 比方说&#xff0c;n 4 那么节点 0 是节点 3 的孪…

Splay初步【bzoj1503】

做了一道水题&#xff0c;把bzoj1503用Splay重新写了一下。 1 #include <bits/stdc.h>2 #define rep(i, a, b) for (int i a; i < b; i)3 #define REP(i, a, b) for (int i a; i < b; i)4 #define drep(i, a, b) for (int i a; i > b; i--)5 #define mp make…

原生html5时间组件,JFinal遇到了原生Html5时间组件格式转换问题怎么处理?

今天JBolt种子用户群里有人提问&#xff0c;JFinal针对原生Html5的日期时间选择组件的格式转换支持有问题&#xff0c;报错。于是我在JBolt的Demo中加入了这些去测试一下&#xff0c;这里使用的都是原生Html组件。Input type“text”默认就是一个简单的单行文本输入框。如果修改…

LeetCode 2131. 连接两字母单词得到的最长回文串

文章目录1. 题目2. 解题1. 题目 给你一个字符串数组 words 。words 中每个元素都是一个包含 两个 小写英文字母的单词。 请你从 words 中选择一些元素并按 任意顺序 连接它们&#xff0c;并得到一个 尽可能长的回文串 。每个元素 至多 只能使用一次。 请你返回你能得到的最长…