1. -- 统计个数
  2. SELECT count(*) FROM fanmaostu WHERE classname = "fanmao54";
  3. -- 查看班级名称,不要有重复的数据
  4. select distinct (classname) from fanmaostu
  5. order by classname;

image.png
image.png

group by 分组

按照什么字段分组,那么使用对应的字段。
分组一般用于统计居多。
image.png
表中有不同年龄,不同的班级。

可以分别 按照班级进行分组

-- 查询每个班有多少人
select classname as 班级,count(classname) as 人数 from fanmaostu
GROUP BY classname;

image.png


-- 每个年龄有多少人
select age,count(age) from fanmaostu 
group by age;

image.png

进行分组查询的时候,也可以使用order by 进行数据排序;

-- 班级人数按照最多到最小的顺序排序;
select classname as 班级,count(classname) as 人数 from fanmaostu
GROUP BY classname    -- 按照 classname 进行分组
ORDER BY count(classname)  DESC;  -- 排序 按照什么排序,order by 后跟对应的字段名;

image.png

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;

image.png

-- 每个班级的平均年龄; avg 
select classname,avg(age) from fanmaostu
group by classname;

image.png

多表查询

现在有两个表
水果表 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 供应商所在的城市

image.pngimage.png

在进行多表查询的时候,查询时要注意之间的关系
基本语句

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

image.png
这种写法与上面使用的 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 = "拼多多"

image.png


-- 查询所有的测试部门的 人员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;