单表查询

分组操作

group by 指的是:将所有记录按照某个相同字段进行归类

用法 :select 聚合函数(count),选取的字段 from 表名 group by 分组的字段;

注意点:

  • group by是分组的关键字

  • group by 必须和聚合函数一起使用

例子:

--以性别为例, 进行分组, 统计一下男生和女生的人数是多少个
select count(id), gender from students group by gender;
+-----------+--------+
| count(id) | gender |
+-----------+--------+
|         2 | 男     |
|         3 | 女     |
|         1 | 中性   |
+-----------+--------+


--对班级进行分组,统计出每个班级年龄最大的那个人

select cls_id,max(age),group_concat(name) from students group by cls_id;
+--------+----------+----------------------+
| cls_id | max(age) | group_concat(name)   |
+--------+----------+----------------------+
|      1 |       30 | 张飞,关羽,小鬼       |
|      2 |       18 | 小乔,孙尚香          |
|      3 |       20 | 甄姬                 |
+--------+----------+----------------------+

常用的聚合函数

#求最大年龄   
mysql> select  MAX(age)   from  student_detail;

#求最小年龄
mysql> select  MIN(age) from student_detail;

#求和
mysql> select  SUM(age)  from  student_detail;

#求平均数
mysql> select  AVG(age)   from  student_detail;

#四舍五入
mysql> select  ROUND(AVG(age))   from   student_details;

#统计
mysql> select count(s_id)   from  student;

having 二次删选

表示对group by之后的数据,进行再一次的二次筛选

-- 查询平均年龄超过20岁的性别,以及姓名
select gender,group_concat(name) from students group by gender having avg(age)>20;
+--------+--------------------+
| gender | group_concat(name) |
+--------+--------------------+
| 男     | 张飞,关羽          |
+--------+--------------------+

排序

order by 字段名 asc(升序) desc(降序)

升序asc可省略

-- 查询年龄在18到30岁之间的男性,按照年龄从小到大排序
select * from students where age between 18 and 30 and gender='男' order by age asc;
+----+--------+------+--------+--------+--------+
| id | name   | age  | height | gender | cls_id |
+----+--------+------+--------+--------+--------+
|  5 | 关羽   |   28 | 190.00 | 男     |      1 |
|  4 | 张飞   |   30 | 190.00 | 男     |      1 |
+----+--------+------+--------+--------+--------+

可以多个排序:order by age desc, id asc

表示:先对age降序,如果年龄相同,就按id升序

select * from students order by age desc,id asc;
+----+-----------+------+--------+--------+--------+
| id | name      | age  | height | gender | cls_id |
+----+-----------+------+--------+--------+--------+
|  4 | 张飞      |   30 | 190.00 | 男     |      1 |
|  5 | 关羽      |   28 | 190.00 | 男     |      1 |
|  3 | 甄姬      |   20 | 170.00 | 女     |      3 |
|  1 | 小乔      |   18 | 180.00 | 女     |      2 |
|  2 | 孙尚香    |   18 | 180.00 | 女     |      2 |
|  6 | 小鬼      |   16 | 178.00 | 中性   |      1 |
+----+-----------+------+--------+--------+--------+

分页查询

用法:limit offset, size

offset: 行数据索引

size: 取多少条数据

select * from students limit 3,5;
+----+--------+------+--------+--------+--------+
| id | name   | age  | height | gender | cls_id |
+----+--------+------+--------+--------+--------+
|  4 | 张飞   |   30 | 190.00 | 男     |      1 |
|  5 | 关羽   |   28 | 190.00 | 男     |      1 |
|  6 | 小鬼   |   16 | 178.00 | 中性   |      1 |
+----+--------+------+--------+--------+--------+



--limit  可以把offset省略,默认从第一行取
select * from students limit 5;
+----+-----------+------+--------+--------+--------+
| id | name      | age  | height | gender | cls_id |
+----+-----------+------+--------+--------+--------+
|  1 | 小乔      |   18 | 180.00 | 女     |      2 |
|  2 | 孙尚香    |   18 | 180.00 | 女     |      2 |
|  3 | 甄姬      |   20 | 170.00 | 女     |      3 |
|  4 | 张飞      |   30 | 190.00 | 男     |      1 |
|  5 | 关羽      |   28 | 190.00 | 男     |      1 |
+----+-----------+------+--------+--------+--------+

总结:

查询的使用顺序:

select * from 表名 where 条件 group by 条件 having 条件 order by 条件 limit 条件

必须严格按照这样的顺序写!!!!!

posted @ 2019-10-30 22:34  SetCreed  阅读(232)  评论(0编辑  收藏  举报