设为首页 收藏本站
查看: 1084|回复: 0

[经验分享] mysql单表查询之多条件查询

[复制链接]
累计签到:2 天
连续签到:1 天
发表于 2016-1-18 10:41:04 | 显示全部楼层 |阅读模式
分组查询

mysql> select countrycode as total fromCity where id<10;
+-------+
| total |
+-------+
| AFG  |
| AFG  |
| AFG  |
| AFG  |
| NLD  |
| NLD  |
| NLD  |
| NLD  |
| NLD  |
+-------+
9 rows in set (0.00 sec)

mysql> select countrycode,count(*) astotal from City where id<10 group by countrycode;
+-------------+-------+
| countrycode | total |
+-------------+-------+
| AFG         |    4 |
| NLD         |    5 |
+-------------+-------+
2 rows in set (0.00 sec)

把相同的字段进行分组,并对分组内的数据进行统计。



使用having过滤分组

Having用于分组之后过滤数据,where用于分组之前选择数据。

mysql> select countrycode,count(*) astotal from City where id<101 group by countrycode;
+-------------+-------+
| countrycode | total |
+-------------+-------+
| AFG         |    4 |
| AGO         |    5 |
| AIA         |    2 |
| ALB         |    1 |
| AND         |    1 |
| ANT         |    1 |
| ARE         |    5 |
| ARG         |   32 |
| ASM         |    2 |
| ATG         |    1 |
| DZA         |   18 |
| NLD         |   28 |
+-------------+-------+
12 rows in set (0.01 sec)

mysql> select countrycode,count(*) astotal from City where id<101 group by countrycode having count(*)>10;
+-------------+-------+
| countrycode | total |
+-------------+-------+
| ARG         |   32 |
| DZA         |   18 |
| NLD         |   28 |
+-------------+-------+
3 rows in set (0.00 sec)

先选择数据,然后分组,然后having过滤数据。


在group by后求和
mysql> select countrycode,count(*) astotal from City where id<10 group by countrycode with rollup;
+-------------+-------+
| countrycode | total |
+-------------+-------+
| AFG         |    4 |
| NLD         |    5 |
| NULL        |    9 |
+-------------+-------+
3 rows in set (0.00 sec)

在最后增加一行显示求和结果。


多字段分组

先按照第一个字段进行分组,按照分组内容进行第二个字段的分组。

mysql> select countrycode,district fromCity where id<10;
+-------------+---------------+
| countrycode | district      |
+-------------+---------------+
| AFG         | Kabol         |
| AFG         | Qandahar      |
| AFG         | Herat         |
| AFG         | Balkh         |
| NLD         | Noord-Holland |
| NLD         | Zuid-Holland  |
| NLD         | Zuid-Holland  |
| NLD         | Utrecht       |
| NLD         | Noord-Brabant |
+-------------+---------------+
9 rows in set (0.00 sec)

mysql> select countrycode,district fromCity where id<10 group by countrycode,district;
+-------------+---------------+
| countrycode | district      |
+-------------+---------------+
| AFG         | Balkh         |
| AFG         | Herat         |
| AFG        | Kabol         |
| AFG         | Qandahar      |
| NLD         | Noord-Brabant |
| NLD         | Noord-Holland |
| NLD         | Utrecht       |
| NLD         | Zuid-Holland  |
+-------------+---------------+
8 rows in set (0.00 sec)

注:这里有一个知识点,5.7里sql_mode=only_full_group_by是默认打开的,不允许下面这样查询。
select * from City where id<10 group by countrycode,district;  列名countrycode,district需要在select后写明。除了countrycode,district,多余的列名出现会报错。

mysql5.6开启方法
mysql> setsql_mode=concat('ONLY_FULL_GROUP_BY,', @@sql_mode );
Query OK, 0 rows affected (0.00 sec)


限制查询结果行数量

mysql> select * from City limit 3;
+----+----------+-------------+----------+------------+
| ID | Name     | CountryCode | District | Population |
+----+----------+-------------+----------+------------+
|  1| Kabul    | AFG         | Kabol    |   1780000 |
|  2| Qandahar | AFG         | Qandahar |     237500 |
|  3| Herat    | AFG         | Herat    |    186800 |
+----+----------+-------------+----------+------------+
3 rows in set (0.00 sec)

前3行

mysql> select * from City limit 10,10;
+----+-------------------+-------------+---------------+------------+
| ID | Name              | CountryCode | District      | Population |
+----+-------------------+-------------+---------------+------------+
| 11 | Groningen         | NLD         | Groningen     |    172701 |
| 12 | Breda             | NLD         | Noord-Brabant |     160398 |
| 13 | Apeldoorn         | NLD         | Gelderland    |    153491 |
| 14 | Nijmegen          | NLD         | Gelderland    |    152463 |
| 15 | Enschede          | NLD         | Overijssel    |    149544 |
| 16 | Haarlem           | NLD         | Noord-Holland |     148772 |
| 17 | Almere            | NLD         | Flevoland     |    142465 |
| 18 | Arnhem            | NLD         | Gelderland    |    138020 |
| 19 | Zaanstad          | NLD         | Noord-Holland |     135621 |
| 20 | 麓s-Hertogenbosch  | NLD        | Noord-Brabant |     129170 |
+----+-------------------+-------------+---------------+------------+
10 rows in set (0.00 sec)

从10开始往后的10行。


运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.iyunv.com/thread-165980-1-1.html 上篇帖子: percona-toolkit工具检查mysql复制一致性及修复不一致性 下篇帖子: MySQL配置文件my.cnf详解 mysql
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表