SQL查询
执行顺序
where ...
group by ...
select ... 聚合函数 from ...
having ...
order by ...
limit ...
// 以下均已此表为示例 sanguo
/*
+------+-----------+--------+--------+------+---------+
| id | name | gongji | fangyu | sex | country |
+------+-----------+--------+--------+------+---------+
| 1 | 诸葛亮 | 120 | 20 | 男 | 蜀国 |
| 2 | 司马懿 | 119 | 25 | 男 | 魏国 |
| 3 | 关羽 | 188 | 60 | 男 | 蜀国 |
| 4 | 赵云 | 200 | 55 | 男 | 魏国 |
| 5 | 孙权 | 110 | 20 | 男 | 吴国 |
| 6 | 貂蝉 | 666 | 10 | 女 | 魏国 |
| 7 | NULL | 1000 | 99 | 男 | 蜀国 |
| 8 | | 1005 | 88 | 女 | 蜀国 |
+------+-----------+--------+--------+------+---------+
*/
order by
- 给查询结果进行排序
... order by 字段名 ASC/DESC
-
ASC
:升序;DESC
:降序
# 将英雄按防御值从高到低排序
select * from sanguo order by fangyu desc;
# 将蜀国英雄按攻击值从高到低排序
select * from sanguo where country = "蜀国" order by gongji desc;
# 将魏蜀两国英雄中名字为三个字的按防御值升序排列
select * from sanguo where
country in("魏国","蜀国") and
name like "___" order by fangyu asc;
limit
- 显示查询记录的条数
- 永远放在SQL语句的最后面
-
limit n
显示n条记录
-
limit m,n
m从0开始计数,表示从第m+1条记录开始显示,n代表显示几条
- 分页, 每页显示n条记录,显示第m页:
limit (m-1)*n,n
# 在蜀国英雄中,查找防御值倒数第二名至倒数第四名的英雄的记录
select * from sanguo where country = "蜀国" order by fangyu asc limit 1,3;
# 在蜀国英雄中,查找攻击值前3名且名字不为 NULL 的英雄的姓名、攻击值和国家
select * from sanguo where country = "蜀国" and
name is not null order by gongji desc limit 3;
group by
- 给查询的结果进行分组
-
group by
之后的字段必须要为select
之后的字段
- 如果
select
之后的字段和group by
之后的字段不一致,则必须要对select
之后的该字段做聚合处理
# 查询表中一共有几个国家
select country from sanguo group by country;
# 计算每个国家的平均攻击力
select country,avg(gongji) from sanguo group by country;
# 查找所有国家中英雄数量最多的前2名的国家名称和英雄数量
# 先分组,再聚,再排序
select country,count(id) as number from sanguo
group by country order by number desc limit 2;
having
- 对查询的结果进行j进一步筛选
-
having
语句通常与group by
语句联合使用,用来过滤由group by
语句返回的记录集
-
having
语句的存在弥补了where
关键字不能与聚合函数联合使用的不足,having
操作的是聚合函数生成的显示列
-
where
只能操作表中实际存在的字段,having
可以操作聚合函数生成的显示列
# 找出平均攻击力>105的国家的前2名,显示国家名和平均攻击力
select country,avg(gongji) as avggj from sanguo
group by country having avggj > 105 order by avggj desc limit 2;
distinct
- 不显示字段的重复值
-
distinct
处理的是distinct
和from
之间的所有字段,所有字段值必须全部相同才能去重
-
distinct
不能对任何字段做聚合处理
# 表中都有哪些国家
select distinct country from sanguo;
# 计算蜀国一共有多少个英雄
select count(distinct id) from sanguo where country = "蜀国";
查询表记录时做数学运算
# 查询时所有英雄攻击力翻倍
select id,name,gongji*2 from sanguo;
聚合函数
-
avg(字段名)
: 求该字段平均值
-
sum(字段名)
: 求和
-
max(字段名)
: 最大值
-
min(字段名)
: 最小值
-
count(字段名)
: 统计该字段记录的个数
# 攻击力最强值是多少
select max(gongji) from sanguo;
# 统计id,name 两个字段分别有几条记录
select count(id),count(name) from sanguo;
# 计算蜀国英雄的总攻击力
select sum(gongji) from sanguo where country = "蜀国";
# 统计蜀国英雄中攻击值大于200的英雄的数量
select count(*) from sanguo where country = "蜀国" and gongji > 200;
网友评论