-- 统计个数
SELECT count(*) FROM fanmaostu WHERE classname = "fanmao54";
-- 查看班级名称,不要有重复的数据
select distinct (classname) from fanmaostu
order by classname;
group by 分组
按照什么字段分组,那么使用对应的字段。
分组一般用于统计居多。
表中有不同年龄,不同的班级。
可以分别 按照班级进行分组
-- 查询每个班有多少人
select classname as 班级,count(classname) as 人数 from fanmaostu
GROUP BY classname;
-- 每个年龄有多少人
select age,count(age) from fanmaostu
group by age;
进行分组查询的时候,也可以使用order by 进行数据排序;
-- 班级人数按照最多到最小的顺序排序;
select classname as 班级,count(classname) as 人数 from fanmaostu
GROUP BY classname -- 按照 classname 进行分组
ORDER BY count(classname) DESC; -- 排序 按照什么排序,order by 后跟对应的字段名;
having 分组中的条件过滤
使用 group by 可以进行分组,那么分组之后如果对分组后的数据进行条件过滤,使用 having 语句进行过滤(类似where)
-- 查询 班级人数为14 的班级有哪些?
SELECT classname,count(classname) FROM fanmaostu -- 查询班级名,人数
GROUP BY classname -- GROUP BY 分组
HAVING count(*) = 14 -- having 为group by 的条件查询 人数为14
having 作为group by 的查询条件过滤,支持
= | 等于 | |
---|---|---|
> | 大于 | |
>= | 大于登录 | |
< | 小于 | |
<= | 小于等于 | |
!= 或者 <> | 不等于 | |
BETWEEN … AND | 区间 | |
in | 在 … 范围 |
-- 人数最多的班 是哪几个?
-- 1. 先找人数最多的数量是多少?
select classname, count(classname) from fanmaostu
GROUP BY classname
order by count(classname) DESC
LIMIT 1
-- 2 查询 班级人数为14 的班级有哪些?
SELECT classname,count(classname) FROM fanmaostu
GROUP BY classname -- GROUP BY 分组
HAVING count(classname) = 14
-- 3. 将两部合并到 一起
SELECT classname,count(classname) FROM fanmaostu
GROUP BY classname -- GROUP BY 分组
HAVING count(classname) = ( -- 子查询
select count(classname) from fanmaostu
GROUP BY classname
order by count(classname) DESC
LIMIT 1
)
综合查询
查询的顺序为
-- select * from table
-- where
-- group by
-- having
-- order by
-- limit
-- 年龄在 20-30
-- 每个班级中的人数
-- 按照 人数 降序 排序
select classname,count(classname) from fanmaostu
WHERE age BETWEEN 20 and 30 -- 过滤 20-30的人
GROUP BY classname -- 分组
order by count(classname) desc;
-- 每个班级的平均年龄; avg
select classname,avg(age) from fanmaostu
group by classname;
多表查询
现在有两个表
水果表 fruites;
供应商表 supplies;
fruites:
字段名 | 类型 | 是否为Null | key | 备注 |
---|---|---|---|---|
f_id | varchar(10) | No | 主键 | 水果id |
s_id | varchar(10) | No | 供应商id | |
f_name | varchar(10) | No | 水果名字 | |
f_price | decimal(8,2) | No | 水果价格 |
supplies
字段名 | 类型 | 是否为Null | key | 备注 |
---|---|---|---|---|
s_id | varchar(10) | No | 主键 | 供应商的id |
s_name | varchar(255) | No | 供应商的名字 | |
s_city | varchar(255) | NO | 供应商所在的城市 |
在进行多表查询的时候,查询时要注意之间的关系
基本语句
select 列名, 列名 from 表1,表2
where 表1.列名 = 表2.列名
inner join on 内连接
-- 内连接
select s_name,s_city,f_name,f_price from fruites
INNER JOIN supplies -- 连接表
ON fruites.s_id = supplies.s_id; -- 条件
这种写法与上面使用的 where 条件查询结果一样。
使用 where 子句定义的连接条件比较 简单明了,
inner join 连接语法能够确保不会忘记连接条件。
在实现业务上,使用两种语法都可以。
-- 供应商名字为拼多多的 水果id,水果名字,水果价格,供应商名字,供应商城市;
SELECT f_id,f_name,f_price,s_name,s_city from fruites,supplies
WHERE fruites.s_id = supplies.s_id
AND s_name = "拼多多"
-- 供应商名字为拼多多的 水果id,水果名字,水果价格,供应商名字,供应商城市
SELECT f_id,f_name,f_price,s_name,s_city from fruites
INNER JOIN supplies
ON fruites.s_id = supplies.s_id
and s_name = "拼多多"
-- 查询所有的测试部门的 人员id,姓名,所属部门
SELECT e_id,e_name,d_name from emps,deps
WHERE emps.d_id = deps.d_id
AND d_name = "测试";
--
select e_id,e_name,d_name from emps
INNER JOIN deps
ON deps.d_id = emps.d_id
AND d_name = "测试";
-- 查询 测试部门有多少人
SELECT d_name,COUNT(d_name) from deps,emps
WHERE emps.d_id = deps.d_id
AND d_name="测试"
GROUP BY d_name;
--
SELECT d_name,count(d_name) from deps
INNER JOIN emps
ON emps.d_id = deps.d_id
AND d_name = "测试"
GROUP BY d_name;
-- 查询 各部门有多少人
SELECT d_name,COUNT(d_name) from deps,emps
WHERE emps.d_id = deps.d_id
GROUP BY d_name;
--
SELECT d_name,COUNT(d_name) from deps,emps
WHERE emps.d_id = deps.d_id
GROUP BY d_name;