文章目录
- 数据库中的复杂查询
- 排序
- 聚合函数查询
- 分组查询
- Having和Where的区别
- limit语句
数据库中的复杂查询
排序
排序查询数据库中的数据,使用ORDER BY
字句
ASC:升序
DESC:降序
如果不指定,默认是升序ASC
单列排序
select*from 表1 where 字段=xxx order by 字段名 [asc/desc];
组合排序:
先按照第一个字段进行排序,如果相同,再按照第二个字段排序,以此类推
SELECT 字段 FROM 表名 WHERE 字段=值 order by 字段1[ASC/DESC] , 字段2 [ASC/DESC]
mysql> select*from hero where age<35 order by age ASC,life DESC;
+------+--------+------+------+--------+----------+------+-------+--------+----------------+-----------+
| id | name | age | sex | attack | location | life | magic | is_hot | grounding_date | max_score |
+------+--------+------+------+--------+----------+------+-------+--------+----------------+-----------+
| 2 | 阿珂 | 19 | 女 | 470 | 刺客 | 1500 | 1100 | 0 | 2019-06-11 | 15.6 |
| 12 | 土行孙 | 22 | 男 | 195 | 刺客 | 1400 | 1700 | 1 | 2013-02-16 | 12.4 |
| 8 | 孙尚香 | 24 | 女 | 260 | 射手 | 1300 | 900 | 0 | 2020-03-12 | 9.2 |
| 6 | 虞姬 | 25 | 女 | 370 | 射手 | 1600 | 1200 | 1 | 2013-02-24 | 11.2 |
| 5 | 甄姬 | 27 | 女 | 210 | 法师 | 1400 | 1900 | 0 | 2018-06-06 | 13.1 |
| 10 | 孙悟空 | 32 | 男 | 460 | 战士 | 2900 | 1300 | 0 | 2013-02-11 | 17.2 |
+------+--------+------+------+--------+----------+------+-------+--------+----------------+-----------+
6 rows in set (0.00 sec)
聚合函数查询
纵向查询,对某一列的值进行计算,然后返回结果值,在计算时会自动忽略空值
五个聚合函数:COUNT
:统计某一列的记录数字,记录为NULL
不统计SUM
:某一列数值类型的数值和MAX
:某一列的最大值(数值类型)MIN
:某一列的最小值(数值类型)AVG
:某一列的平均值(数值类型)
SELECT COUNT(*) FROM 表名;
mysql> select sum(age) from hero where attack>1000 and attack <500;
+----------+
| sum(age) |
+----------+
| NULL |
+----------+
1 row in set (0.00 sec)
mysql> select sum(age) from hero where attack<=500;
+----------+
| sum(age) |
+----------+
| 449 |
+----------+
1 row in set (0.00 sec)
mysql> select avg(age) from hero where attack <=500;
+----------+
| avg(age) |
+----------+
| 34.5385 |
+----------+
1 row in set (0.01 sec)
分组查询
使用GROUP BY
语句 对查询信息进行分组,相同数据作为一组
分组时,将分组字段中相同内容作为一组,比如根据性别划分,性别相同的放到一组,不同的放到另外一组
单纯的分组只会返回每组数据的第一条,这样几条数据没有意义,一般分组时都会搭配聚合函数进行使用,可以得到这组数据的信息
mysql> select sum(life) FROM hero GROUP BY sex;
+-----------+
| sum(life) |
+-----------+
| 22580 |
| 5800 |
+-----------+
2 rows in set (0.00 sec)
以上分组很容易看不出数据是哪一组的,所以在使用时最好将对应的分组字段也查询出来
mysql> select sum(life),sex from hero group by sex;
+-----------+------+
| sum(life) | sex |
+-----------+------+
| 22580 | 男 |
| 5800 | 女 |
+-----------+------+
2 rows in set (0.00 sec)
比如查询一组数据中年龄小于30,按性别分组,并统计每组的人数
mysql> select sex, count(*) from hero where age<30 group by sex;
+------+----------+
| sex | count(*) |
+------+----------+
| 女 | 4 |
| 男 | 1 |
+------+----------+
2 rows in set (0.00 sec)
分组之后想要再设置查询条件需要使用having字句
分组后总数目大于2的组 使用having
mysql> select sex,count(*) from hero where age<30 group by sex having count(*)>2;
+------+----------+
| sex | count(*) |
+------+----------+
| 女 | 4 |
+------+----------+
1 row in set (0.00 sec)
Having和Where的区别
-
HAVING
是在分组后对数据进行过滤,可以使用聚合函数 -
WHERE
是在分组前对数据进行处理,不可以使用聚合函数
limit语句
LIMIT
语句的作用是限制查询记录的条数,通常放在SQL语句的最后
LIMIT
语句最常用的场景就是分页,如百度搜索结果的分页,每一页有一定数量的搜索结果,如淘宝商品分页,每一页有一定数量的商品等等类似的场景
语法格式:
LIMIT offset,length;
Limit length;
//offset 是偏移量,可以认为是跳过的记录数量,默认是0
//length 是指需要显式的总记录数
如果第一个参数为0,即从第一条数据开始显式,那么可以省略不写
select*from 表 limit 0,5;
select*from 表 limit 5;
举例:
查询某张表,从第三条开始显式数据,显式6条
mysql> select*from hero limit 3,6;
+------+----------+------+------+--------+----------+------+-------+--------+----------------+-----------+
| id | name | age | sex | attack | location | life | magic | is_hot | grounding_date | max_score |
+------+----------+------+------+--------+----------+------+-------+--------+----------------+-----------+
| 4 | 吕布 | 40 | 男 | 500 | 战士 | 2700 | 1000 | 1 | 2015-04-22 | 12.2 |
| 5 | 甄姬 | 27 | 女 | 210 | 法师 | 1400 | 1900 | 0 | 2018-06-06 | 13.1 |
| 6 | 虞姬 | 25 | 女 | 370 | 射手 | 1600 | 1200 | 1 | 2013-02-24 | 11.2 |
| 7 | 德玛西亚 | 35 | 男 | 220 | 战士 | 3900 | 1500 | 1 | 2011-02-14 | 11.2 |
| 8 | 孙尚香 | 24 | 女 | 260 | 射手 | 1300 | 900 | 0 | 2020-03-12 | 9.2 |
| 9 | 孙策 | 39 | 男 | 280 | 战士 | 3200 | 1100 | 1 | 2016-07-14 | 16.7 |
+------+----------+------+------+--------+----------+------+-------+--------+----------------+-----------+
6 rows in set (0.00 sec)