目录
排序
select * from 表名 order by 列1 asc|desc [,列2 asc|desc,...]
升序
将行数据按照列1进行排序,如果某些行列1的值相同时,则按照列2排序,以此类推
默认按照列值从小到大排列(asc)
asc:从小到大排列,即升序
/*查询未删除学生信息,按名称升序*/
select * from students where is_delete=0 order by name;
降序
desc: 从大到小排序,即降序
/*查询未删除男生信息,按学号降序*/
select * from students where gender=1 and is_delete=0 order by id desc;
组合排序
/*显示所有的学生信息,先按照年龄从大到小排序,当年龄相同时,按照身高从高到矮排序*/
select * from students order by age desc,height desc;
聚合函数
总数
count(*) : 表示计算总行数,括号中写星与列名,结果是相同的
/*查询学生总数*/
select count(*) from students;
最大值
max(列) : 表示求此列的最大值
/*查询女生的编号最大值*/
select max(id) from students where gender=2;
最小值
min(列): 表示求此列的最小值
/*查询未删除的学生最小编号*/
select min(id) from students where is_delete=0;
求和
sum(列): 表示求此列的和
/*查询男生的总年龄*/
select sum(age) from students where gender=1;
平均值
avg(列): 表示求此列的平均值
/*查询未删除女生的编号平均值*/
select avg(id) from students where is_delete=0 and gender=2;
/*平均年龄*/
select sum(age)/count(*) from students where gender=1;
分组
group by
group by
的含义:将查询结果按照1个或多个字段进行分组,字段值相同的为一组
group by
可用于单个字段分组,也可用于多个字段分组
/*通过学生性别分组*/
select gender from students group by gender;
+--------+
| gender |
+--------+
| 男 |
| 女 |
+--------+
group by + group_concat()
group_concat(字段名)
可以作为一个输出字段来使用,表示分组之后,根据分组结果,使用
group_concat()
来放置每一组的某字段的值的集合
/*example1*/
select gender,group_concat(name) from students group by gender;
+--------+-----------------------------------------------------------+
| gender | group_concat(name) |
+--------+-----------------------------------------------------------+
| 男 | 张三,李四,王五 |
| 女 | 小花,小丽,小雯 |
+--------+-----------------------------------------------------------+
/*example2*/
select gender,group_concat(id) from students group by gender;
+--------+------------------+
| gender | group_concat(id) |
+--------+------------------+
| 男 | 3,4,8,9,14 |
| 女 | 1,2,5,7,10,12,13 |
+--------+------------------+
group by
+ 集合函数
通过
group_concat()
的启发,我们既然可以统计出每个分组的某字段的值的集合,那么我们也可以通过集合函数来对这个值的集合做一些操作
select gender,group_concat(age) from students group by gender;
+--------+----------------------+
| gender | group_concat(age) |
+--------+----------------------+
| 男 | 29,59,36,27,12 |
| 女 | 18,18,38,18,25,12,34 |
+--------+----------------------+
/*分别统计性别为男/女的人年龄平均值*/
select gender,avg(age) from students group by gender;
+--------+----------+
| gender | avg(age) |
+--------+----------+
| 男 | 32.6000 |
| 女 | 23.2857 |
+--------+----------+
/*分别统计性别为男/女的人的个数*/
select gender,count(*) from students group by gender;
+--------+----------+
| gender | count(*) |
+--------+----------+
| 男 | 5 |
| 女 | 7 |
+--------+----------+
group by + having
having
条件表达式:用来分组查询后指定一些条件来输出查询结果
having
作用和where
一样,但having
只能用于group by
select gender,count(*) from students group by gender having count(*)>2;
+--------+----------+
| gender | count(*) |
+--------+----------+
| 男 | 5 |
| 女 | 7 |
+--------+----------+
group by + with rollup
with rollup
的作用是:在最后新增一行,来记录当前列里所有记录的总和
select gender,count(*) from students group by gender with rollup;
+--------+----------+
| gender | count(*) |
+--------+----------+
| 男 | 5 |
| 女 | 7 |
| NULL | 12 |
+--------+----------+
select gender,group_concat(age) from students group by gender with rollup;
+--------+-------------------------------------------+
| gender | group_concat(age) |
+--------+-------------------------------------------+
| 男 | 29,59,36,27,12 |
| 女 | 18,18,38,18,25,12,34 |
| NULL | 29,59,36,27,12,18,18,38,18,25,12,34 |
+--------+-------------------------------------------+
分页
获取部分行
当数据量过大时,采用limit
select * from 表名 limit start,count
从
start
开始,获取count
条数据
/*查询前3行男生信息*/
select * from students where gender=1 limit 0,3;
连接查询
内连接查询
查询的结果为两个表匹配到的数据
select * from 表1 inner或left或right join 表2 on 表1.列=表2.列
右连接查询
查询的结果为两个表匹配到的数据,右表特有的数据,对于左表中不存在的数据使用
null
填充。
select * from students as s left join classes as c on s.cls_id=c.id;
左连接查询
查询的结果为两个表匹配到的数据,左表特有的数据,对于右表中不存在的数据使用
null
填充
select s.name,c.name from students as s inner join classes as c on s.cls_id=c.id;