文章目录

  • 数据库中的复杂查询
  • 排序
  • 聚合函数查询
  • 分组查询
  • 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)