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】selecthaving和where的区别(详解) -> 正文阅读

[大数据]【MySQL】selecthaving和where的区别(详解)

含义上来说,其实having和where的意思是相同的。
但是,having处理的是聚合后的表。
而where处理的是聚合前的表。
下面我们来举个例子。
首先我们创建了一张表:

mysql> select * from salary;
+----+------+-------------------+------------+
| id | name | pay_for_per_month | position   |
+----+------+-------------------+------------+
|  1 | z1   |             10000 | JAVA研发   |
|  2 | z2   |             11000 | JAVA研发   |
|  3 | z3   |             17000 | JAVA研发   |
|  4 | z4   |             18000 | c++研发    |
|  5 | z5   |              8000 | c++研发    |
|  6 | z6   |              6000 | 嵌入式开发 |
|  7 | z7   |              8000 | 嵌入式开发 |
|  8 | z8   |              9000 | 嵌入式开发 |
|  9 | z9   |             12000 | 算法工程师 |
| 10 | z10  |             15000 | 算法工程师 |
| 11 | z11  |             23000 | 算法工程师 |
| 12 | z12  |             33000 | 架构师     |
| 13 | z13  |             53000 | 架构师     |
| 14 | z14  |            153000 | 架构师     |
+----+------+-------------------+------------+
14 rows in set (0.00 sec)

然后我们来看一下having的用法:

mysql> select position,max(pay_for_per_month) from salary group by position;
+------------+------------------------+
| position   | max(pay_for_per_month) |
+------------+------------------------+
| JAVA研发   |                  17000 |
| c++研发    |                  18000 |
| 嵌入式开发 |                   9000 |
| 算法工程师 |                  23000 |
| 架构师     |                 153000 |
+------------+------------------------+
5 rows in set (0.00 sec)

mysql> select position,count(pay_for_per_month) from salary group by position;
+------------+--------------------------+
| position   | count(pay_for_per_month) |
+------------+--------------------------+
| JAVA研发   |                        3 |
| c++研发    |                        2 |
| 嵌入式开发 |                        3 |
| 算法工程师 |                        3 |
| 架构师     |                        3 |
+------------+--------------------------+
5 rows in set (0.00 sec)

mysql> select position,max(pay_for_per_month) from salary group by position having pay_for_per_month>10000;
ERROR 1054 (42S22): Unknown column 'pay_for_per_month' in 'having clause'
mysql> select position,max(pay_for_per_month) from salary group by position having pay_for_per_month>10000;
ERROR 1054 (42S22): Unknown column 'pay_for_per_month' in 'having clause'
mysql> select position,max(pay_for_per_month) from salary group by position having max(pay_for_per_month)>10000;
+------------+------------------------+
| position   | max(pay_for_per_month) |
+------------+------------------------+
| JAVA研发   |                  17000 |
| c++研发    |                  18000 |
| 算法工程师 |                  23000 |
| 架构师     |                 153000 |
+------------+------------------------+
4 rows in set (0.00 sec)

mysql> select position,count(pay_for_per_month) from salary group by position having count(id)>3;
Empty set (0.00 sec)

mysql> select position,count(pay_for_per_month) from salary group by position having count(id)>2;
+------------+--------------------------+
| position   | count(pay_for_per_month) |
+------------+--------------------------+
| JAVA研发   |                        3 |
| 嵌入式开发 |                        3 |
| 算法工程师 |                        3 |
| 架构师     |                        3 |
+------------+--------------------------+
4 rows in set (0.00 sec)

select position,pay_for_per_month from salary group by position having count(id)>2;
+------------+-------------------+
| position   | pay_for_per_month |
+------------+-------------------+
| JAVA研发   |             10000 |
| 嵌入式开发 |              6000 |
| 算法工程师 |             12000 |
| 架构师     |             33000 |
+------------+-------------------+
4 rows in set (0.00 sec)

我们可以看到having后面必须跟聚合函数的内容。


下面我们来看一下where的用法

mysql> select position,pay_for_per_month from salary where position like '架构师';
+----------+-------------------+
| position | pay_for_per_month |
+----------+-------------------+
| 架构师   |             33000 |
| 架构师   |             53000 |
| 架构师   |            153000 |
+----------+-------------------+
3 rows in set (0.00 sec)

mysql> select position,pay_for_per_month from salary where position !='架构师';
+------------+-------------------+
| position   | pay_for_per_month |
+------------+-------------------+
| JAVA研发   |             10000 |
| JAVA研发   |             11000 |
| JAVA研发   |             17000 |
| c++研发    |             18000 |
| c++研发    |              8000 |
| 嵌入式开发 |              6000 |
| 嵌入式开发 |              8000 |
| 嵌入式开发 |              9000 |
| 算法工程师 |             12000 |
| 算法工程师 |             15000 |
| 算法工程师 |             23000 |
+------------+-------------------+
11 rows in set (0.00 sec)

mysql> select position,pay_for_per_month from salary group by position having count(id)>2;
+------------+-------------------+
| position   | pay_for_per_month |
+------------+-------------------+
| JAVA研发   |             10000 |
| 嵌入式开发 |              6000 |
| 算法工程师 |             12000 |
| 架构师     |             33000 |
+------------+-------------------+
4 rows in set (0.00 sec)

mysql> select position,max(pay_for_per_month) from salary where position !='架构师';
+----------+------------------------+
| position | max(pay_for_per_month) |
+----------+------------------------+
| JAVA研发 |                  23000 |
+----------+------------------------+
1 row in set (0.00 sec)

mysql> select position,max(pay_for_per_month) from salary group by position where position !='架构 师';
ERROR 1064 (42000): You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'where position !='架构师'' at line 1

mysql> select position,pay_for_per_month from salary group by position where position like '架构师';
ERROR 1064 (42000): You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'where position like '架构师'' at line 1

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

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