栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

【MySQL】select,having和where的区别(详解)

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

【MySQL】select,having和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

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/750048.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号