二、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,一经查实,立即删除!

相关文章

二维数组和指针数组

#include "stdafx.h" #include <iostream> using namespace std; int _tmain(int argc, _TCHAR* argv[]) { int arr1[3]; int arr2[3]; int arr3[3]; int * ptr; // ptr1是一个指向 int [3] 的指针&#xff0c;即ptr的类型和&arr1的类型是一样的&#x…

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

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

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

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

NavigationController

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

android studio windows,AndroidStudio的使用(Windows)

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

一、MySQL查询学习笔记(基础查询、条件查询、排序查询、常见函数、分组查询 详解)

DQL语言的学习 一、基础查询 语法&#xff1a; **SELECT 要查询的东西 【FROM 表名】;**类似于Java中 :System.out.println(要打印的东西); 特点&#xff1a; ①通过select查询完的结果 &#xff0c;是一个虚拟的表格&#xff0c;不是真实存在 ② 要查询的东西 可以是常量值、…

LeetCode 2119. 反转两次的数字

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

JVM系列五:JVM监测工具[整理中]

转自本站&#xff1a;http://www.cnblogs.com/redcreen/archive/2011/05/09/2040977.html 前几篇篇文章介绍了介绍了JVM的参数设置并给出了一些生产环境的JVM参数配置参考方案。正如之前文章中提到的JVM参数的设置需要根据应用的特性来进行设置&#xff0c;每个参数的设置都需要…

红米k30 android版本,Redmi K30 Pro 推送 MIUI 12.2.1 稳定版:为安卓跨版本升级

今日&#xff0c;Redmi K30 Pro 推送了 MIUI 12.2.1 稳定版内测更新。新系统基于 Android 11 深度定制&#xff0c;更新了 2020 年 10 月谷歌安全补丁。需要注意的是&#xff0c;本次更新为安卓跨版本升级&#xff0c;为降低升级风险&#xff0c;建议提前备份个人数据。同时&am…

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

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

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

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

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

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

Module System of Swift (简析 Swift 的模块系统)

原文地址: http://andelf.github.io/blog/2014/06/19/modules-for-swift/ Swift 中模块是什么&#xff1f;当写下 Swift 中一句 import Cocoa 的时候到底整了个什么玩意&#xff1f;官方 ibook 很含糊只是提了半页不到。 本文解决如下问题 介绍 Swift 中两种可 import 的模块如…

四、MySQL分页查询 + 子查询复习 学习笔记 (复习连接查询相关内容 详解)

8&#xff1a;分页查询 应用场景&#xff1a;当要显示的数据&#xff0c;一页显示不全&#xff0c;需要分页提交sql请求 语法&#xff1a; SELECT 查询列表 FROM 表名 【JOIN type JOIN 表2 ON 连接条件 WHERE 筛选条件 GROUP BY 分组字段 HAVING 分组后的筛选 ORDER BY 排序的…

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

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

jquery中怎么删除ul中的整个li包括节点

1.$(ul li).remove(); 2.$(ul li).each(function(){ $(this).remove(); }); 3.$("ul").find("li").remove(); 4.$(ul).children().filter(li).remove();转载于:https://www.cnblogs.com/zhujiabin/p/5008006.html

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

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

五、MySQL联合查询学习笔记 + 查询总结(详解)

9、 联合查询 union 联合 合并&#xff1a;将多条查询语句的结果合并成一个结果 语法&#xff1a; 查询语句1 UNION 查询语句2 UNION … 应用场景&#xff1a;要查询的结果来自多个表&#xff0c;且多个表之间没有直接的连接关系&#xff0c;但查询的信息相同 特点&#xff…

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

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

设计模式—桥接模式

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