IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 大数据 -> MySQL第五章(多表查询) -> 正文阅读

[大数据]MySQL第五章(多表查询)

一.多表连接的实现

1.1 多表查询需要有连接条件

SELECT employee_id, department_name
FROM employees, departments
WHERE employees.department_id = departments.department_id 
#其中两个表的department_id就是他们的连接条件

1.2 从sql优化的角度来说,建议多表查询时,每个字段前都指明其所在的表,可以给表起别名, 在SELECT和WHERE中使用别名, 并且使用别名后,在指定的时候不能再使用表原名

SELECT e.employee_id , d.department_name, d.department_id 
FROM employees e, departments d 
WHERE e.department_id = d.department_id 

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

SELECT e.employee_id , d.department_name, l.city 
FROM employees e , departments d, locations l 
WHERE e.department_id = d.department_id AND d.location_id = l.location_id

二.等值连接与非等值连接

上面就是等值连接,接下来我们来看非等值连接
job_grades表

grade_levellowest_salhighest_sal
A10002999
B30005999
C60009999
D1000014999
E1500024999
F2500040000

需求: 要我们查询每个员工的工资水平等级

SELECT e.last_name, e.salary, jg.grade_level 
FROM employees e, job_grades jg 
#WHERE e.salary >= jg.lowest_sal AND e.salary <= jg.highest_sal 
WHERE e.salary BETWEEN jg.lowest_sal AND jg.highest_sal

三.自连接与非自连接

上面为非自连接
自连接就是自己连接自己

#查询员工的顶头上司
SELECT e.employee_id, e.last_name, e2.manager_id, e2.last_name
FROM employees e, employees e2
WHERE e.manager_id = e2.employee_id 

四.内连接与外连接

4.1:
上面都是内连接
内连接就是查询打印出满足条件的行

外连接: 分为左外连接, 右外连接, 满连接
左外连接就是除了打印满足条件行还把左表打印出来
右外连接反之
满外连接就是都打印出来

4.2:
在sql语言中有两套重要标准,分别为SQL92SQL99标准
SQL92: 语法简单,但语句长,可读性差
SQL99: 语法较复杂, 但可读性强

4.3:
由于MySQL不支持92的外连接写法,所以我们直接来看SQL99的写法

1.内连接

JOIN ON

SELECT e.employee_id, d.department_name 
FROM employees e JOIN departments d  
ON e.department_id = d.department_id 

SELECT e.employee_id, d.department_name, l.city 
FROM employees e JOIN departments d  
ON e.department_id = d.department_id
JOIN locations l 
ON d.location_id = l.location_id

2.左外连接

LEFT JOIN ON

SELECT e.employee_id, d.department_name 
FROM employees e LEFT JOIN departments d  
ON e.department_id = d.department_id

3.右外连接

RIGHT JOIN ON

SELECT e.employee_id, d.department_name 
FROM employees e RIGHT JOIN departments d  
ON e.department_id = d.department_id

4.满外连接

满外连接有UNION 和 UNION ALL
UNION: 返回两个查询的结果集的并集, 去除重复记录
UNION ALL: 返回两个查询的结果集的并集, 不去重

注意: 执行UNION ALL语句时所需要的资源比UNION语句少, 如果明确知道合并后的结果数据不存在重复数据, 或者不需要去除重复的数据,则尽量使用UNION ALL语句,以提高数据查询的效率

#就是把左外右外用UNION连接起来
SELECT e.employee_id, d.department_name 
FROM employees e LEFT JOIN departments d  
ON e.department_id = d.department_id 
UNION
SELECT e.employee_id, d.department_name 
FROM employees e RIGHT  JOIN departments d  
ON e.department_id = d.department_id 

五.sql99的新特性

自然连接 NATURAL JOIN
会自动查询两张连接表中相同的字段,进行等值连接

SELECT e.employee_id , e.last_name, d.department_name 
FROM employees e JOIN departments d
ON e.department_id = d.department_id 
AND e.manager_id = d.manager_id 
#相同
SELECT e.employee_id , e.last_name, d.department_name
FROM employees e NATURAL JOIN departments d

缺点: 会强制连接所有相同字段, 不够灵活

注意: 我们要控制连接表的数量,多表连接就相当于嵌套for一样,非常消耗资源,会让sql查询性能大大降低,因此不要连接不必要的表, 需要JOIN的字段,数据类型保持绝对一致

  大数据 最新文章
实现Kafka至少消费一次
亚马逊云科技:还在苦于ETL?Zero ETL的时代
初探MapReduce
【SpringBoot框架篇】32.基于注解+redis实现
Elasticsearch:如何减少 Elasticsearch 集
Go redis操作
Redis面试题
专题五 Redis高并发场景
基于GBase8s和Calcite的多数据源查询
Redis——底层数据结构原理
上一篇文章      下一篇文章      查看所有文章
加:2022-09-21 00:35:41  更:2022-09-21 00:39:12 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/23 10:49:26-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码