欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

单表查询

程序员文章站 2022-05-09 12:05:32
[TOC] 分组操作 group by 指的是:将所有记录按照某个相同字段进行归类 用法 :select 聚合函数(count),选取的字段 from 表名 group by 分组的字段; 注意点: group by : 是分组的关键字 group by 必须和聚合函数一起使用 例子: 常用的聚合函 ......

目录

分组操作

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 条件

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