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学习笔记-02 -> 正文阅读

[大数据]MySQL学习笔记-02

2多表查询分类

1.等值连接VS非等值连接

就是把两个表对应的两个列,假设对应的值相等,那么就把这两个表连接成一个表

?

?

2.自连接和非自连接

?

3.内连接vs外连接

内连接就好像是取交集

外连接分为左外连接和右外连接,

左外连接就是交集+左边不满足的集合。同理右外连接就是?交集+右边不满足的集合

?我们使用SQL99语法实现:

?

?例子2:当需要两个条件满足时,必须居住城市和工作地点都应该一样,那么才能进行合并连接

?左外连接:

左表中的数据全部显现出来,但是右表中数据只显示与左表相匹配的数据,与左表不匹配的数据我们置为NULL

?我们可以这样想,左外连接=交集+左边不满足的集合

那么就好像这里是把左边的垫高了一层

右外连接:

右表中的数据全部显现出来,但是左表中数据只显示与左表相匹配的数据,与右表不匹配的数据我们置为NULL

?

同理左外连接,相当于右边被垫高了

右外连接=交集+不满足条件的右边集合

UNION

?UNION 操作符

7种SQL JOINS的实现【重点】

#左上角:左外连接
SELECT employee_id,last_name,department_name
FROM employees e LEFT JOIN departments d
ON e.`department_id`=d.`department_id`;
#右上角:右外连接
SELECT employee_id,last_name,department_name
FROM employees e RIGHT JOIN departments d
ON e.`department_id`=d.`department_id`;
#中图
SELECT employee_id,last_name,department_name
FROM employees e JOIN departments d
ON e.`department_id`=d.`department_id`;
#左中图:A集合-AB交集
SELECT employee_id,last_name,department_name
FROM employees e LEFT JOIN departments d
ON e.`department_id`=d.`department_id`;
WHERE d.'department_id' IS NULL;
#右中图:B集合-AB交集
SELECT employee_id,last_name,department_name
FROM employees e RIGHT JOIN departments d
ON e.`department_id`=d.`department_id`;
WHERE e.department_id IS NULL;
#左下图,满外连接 左上图+右上图
SELECT employee_id,last_name,department_name
FROM employees e LEFT JOIN departments d
ON e.`department_id`=d.`department_id`;
UNION ALL
SELECT employee_id,last_name,department_name
FROM employees e RIGHT JOIN departments d
ON e.`department_id`=d.`department_id`;
#右下图,左中图+右中图
SELECT employee_id,last_name,department_name
FROM employees e JOIN departments d
ON e.`department_id`=d.`department_id`;
WHERE d.'department_id' IS NULL;
UNION ALL
SELECT employee_id,last_name,department_name
FROM employees e JOIN departments d
ON e.`department_id`=d.`department_id`;
WHERE e.department_id IS NULL;

#左中图:A集合-AB交集
SELECT employee_id,last_name,department_name
FROM employees e LEFT JOIN departments d
ON e.`department_id`=d.`department_id`;

以上三句表示的意思就是左外连接
WHERE d.'department_id' IS NULL;

但是加上第四句之后,就变成如图所示的图片了;

解析:首先看概念,左外连接表示的就是,左表中的数据全部应当展现出来,但是右表中的数据只会展现出和左表对应的数据,右表中不匹配的数据我们使用NULL进行代替

那么这个时候,我们找左下图这个情况的时候,就是当右表为NULL时对应的数据

聚合函数

组函数是什么?

组函数又叫做聚集函数(aggregation function),它在一个行的集合(一组行)上进行操作,对每个组给一个结果。每个组函数接受一个参数。参数expr通常是列或表达式。默认情况下,组函数忽略列值为null的行,不把它们拿来参与计算

COUNT 细节

?

这里COUNT(1)==COUNT(2)==表中数据的总数量(例子中数量为107)

1.COUNT(字段)返回的是字段不为空的记录总数

?2.但是COUNT(*)是返回的总数,无论是NULL还是非NULL?

?

对于字段来说,加减运算是没有任何的实际意义的,但是可以比较大小是有意义的

SUM ,AVG,COUNT等方法都是自动进行过滤NULL值的

?练习:对于查询公司中的平均中奖率进行编码实现

?SUM,AVG,等等的方法都是自动进行过滤了NULL值 ,因此我们不可以直接进行AVG(commission_pct),他会过滤掉NULL的情况

但是下面两种正确的情况分析一下:

SELECT SUM(commission_pct) / COUNT(IFNULL(commission_pct,0)),

我们知道SUM等方法自动过滤NULL值,

所以分子只进行计算了非NULL的值的总和,又因为NULL的值还是没有,与最终想要的结果意义不大。

分母:我们采用的是IFNULL判别,如果为NULL,那么就是COUNT(0),我们前面知道这个值就是1,当查询下一行的时候再进行判断,如果不为NULL,那么就返回commission_pct的值。

AVG(IFNULL(commission_pct,0))

这种方法差不多意思,分析即可

如果需要统计表的记录数,使用COUNT(*),COUNT(1),COUNT(具体字段)哪个效率更高?

因情况而定,

如果使用的是MyISAM存储引擎,则三者的效率相同,都是O(1)。因为这种引擎内部有一计数器在维护着行数。

如果使用的是InnoDB存储引擎,则三者效率:COUNT(*)=COUNT(1)>COUNT(字段)。因为对于这种引擎我们知道真的要一行行去数,所以前两者的效率为O(n)。但是要优于COUNT(字段)的效率

GROUP BY 细节

1.这个表示只有当department_id相等的时候,才可以分为一组

GROUP BY department_id

2.只有当job_id和department_id都相等的时候,我们才可以把它们分为一组

GROUP BY job_id,department_id;

重点规则:


#错误的!
SELECT department_id,job_id,AVG(salary)
FROM employees
GROUP BY department_id;

结论:

1.SELECT中出现的非组函数的字段必须声明在GROUP BY中,反之,GROUP BY中声明的字段可以不出现在SELECT中?。原因就是为了可视化强,否则就会不规则,我们需要遵循这一点的要求

2.顺序:

GROUP BY 声明在FROM后面、WHERE后面,ORDER BY 前面、LIMIT前面

WHITH ROLLUP和ORDER BY相互排斥

HAVING

分析1:不包含聚合函数的过滤条件我们不可以放在HAVING中,

首先我们要明白一点,先执行GROUP BY分组然后才会执行HAVING函数

如果有10万个数据,假设我们直接上去进行GROUP BY分组的话,那么任务量巨大

但是当我们把不包含聚合函数的过滤条件放到where中优先执行,那么把这10万条数据进行优先过滤一次,那么当我们进行分组的时候就任务量相对减少了

分析2:包含聚合函数的过滤条件我们要放在HAVING函数中,不能在where中使用

首先我们知道,聚合函数条件的执行必须先分组

那么假设放在where中,我们还没有进行GROUP分组呢,怎么进行包含聚合函数的条件

因为HAVING一定是执行包含聚合函数条件的函数

并且是使用了GROUP BY函数之后才进行使用的,

WHEREHAVING的对比

区别 1
WHERE 可以直接使用表中的字段作为筛选条件,但不能使用分组中的计算函数作为筛选条件;
HAVING 必须要与 GROUP BY 配合使用,可以把分组计算的函数和分组字段作为筛选条件。
这决定了,在需要对数据进行分组统计的时候, HAVING 可以完成 WHERE 不能完成的任务。这是因为,
在查询语法结构中, WHERE GROUP BY 之前,所以无法对分组结果进行筛选。 HAVING GROUP BY
后,可以使用分组字段和分组中的计算函数,对分组的结果集进行筛选,这个功能是 WHERE 无法完成
的。另外, WHERE 排除的记录不再包括在分组中。
区别 2
如果需要通过连接从关联表中获取需要的数据, WHERE 是先筛选后连接,而 HAVING 是先连接
后筛选。
这一点,就决定了在关联查询中, WHERE HAVING 更高效。因为 WHERE 可以先筛选,用一
个筛选后的较小数据集和关联表进行连接,这样占用的资源比较少,执行效率也比较高。 HAVING 则需要
先把结果集准备好,也就是用未被筛选的数据集进行关联,然后对这个大的数据集进行筛选,这样占用
的资源就比较多,执行效率也较低。

where和having总结:

1.
where:先筛选数据再进行关联,执行效率高。缺点在于不能用分组中的计算函数进行筛选
having:优点在于可以使用分组中的计算函数进行筛选。缺点在于只能到最后的结果集才可以进行筛选,效率太低
2.
当过滤条件中有聚合函数的时候,则此过滤条件必须声明在HAVING中
当过滤条件中无聚合函数的时候,我们建议(必须)声明在where中,
因为where执行效率高于HAVING
3.从适用范围来看,HAVING范围更广一些。

开发中的选择:

WHERE HAVING 也不是互相排斥的,我们可以在一个查询里面同时使用 WHERE HAVING 。包含分组
统计函数的条件用 HAVING ,普通条件用 WHERE 。这样,我们就既利用了 WHERE 条件的高效快速,又发
挥了 HAVING 可以使用包含分组统计函数的查询条件的优点。当数据量特别大的时候,运行效率会有很
大的差别。

SELECT的执行过程

#sql99语法:
SELECT ....,....,....(存在聚合函数)
FROM ... (LEFT / RIGHT)JOIN ....ON 多表的连接条件 
(LEFT / RIGHT)JOIN ... ON ....
WHERE 不包含聚合函数的过滤条件
GROUP BY ...,....
HAVING 包含聚合函数的过滤条件
ORDER BY ....,...(ASC / DESC )
LIMIT ...,....
#4.2 SQL语句的执行过程:
#FROM ...,...-> ON -> (LEFT/RIGNT  JOIN) -> WHERE -> GROUP BY -> 
HAVING -> SELECT -> DISTINCT ->ORDER BY -> LIMIT

其中:
1)from:从哪些表中筛选
2)on:关联多表查询时,去除笛卡尔积
3)where:从表中筛选的条件
4)group by:分组依据
5)having:在统计结果中再次筛选
6)order by:排序
7)limit:分页

8)DISTINCT:去重

?结论:当我们执行这些SELECT语句的时候,每一个步骤都会产生一个虚拟表。我们把每一个步骤产生的虚拟表作为输入传入到下一个步骤。这些步骤隐含在 SQL 的执行过程中,对于我们来说是不可见的。

  大数据 最新文章
实现Kafka至少消费一次
亚马逊云科技:还在苦于ETL?Zero ETL的时代
初探MapReduce
【SpringBoot框架篇】32.基于注解+redis实现
Elasticsearch:如何减少 Elasticsearch 集
Go redis操作
Redis面试题
专题五 Redis高并发场景
基于GBase8s和Calcite的多数据源查询
Redis——底层数据结构原理
上一篇文章      下一篇文章      查看所有文章
加:2022-01-30 18:59:54  更:2022-01-30 19:01:43 
 
开发: 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/24 12:28:25-

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