数据库的查询和分组
单表的查询分组
/*
分组
SELECT
分组字段名(group by 后面跟的分组字段) #where后面from前面的是表中会出现的
brande_id ,GROUP_CONCAT (price)
FROM 表名
WHERE 筛选条件
GROUP BY 分组的列名
HAVING 分组之后的筛选条件
order by 排序 desc降序 asc是升序 不写默认升序
where 引导的筛选条件在原始的表中已经可以实现
having 引导的筛选条件是已经分组完成之后才可以做的
即 where是原始表中有的字段名可以直接用的筛选条件,having是原始表中没有的要进行计算的如avg(price)>5
*/
上表中只有select…from是必须的其余按情况而定
group_concat的作用
如果不加group_concat (字节名)
SELECT goods.`name` ,goods.`id`FROM goods GROUP BY goods.`name`;
如果加了group_concat(字节名)
SELECT goods.`name` ,GROUP_CONCAT(goods.`id`)FROM goods GROUP BY goods.`name`;
加了GROUP_CONCAT,它会把相同名字的id放在一个格子里,不加的话一个格子只有一个id
两张表的查询和分组
利用99语法
sql99语法
内连接
/*
select 查询字段
from 表名1
inner join 表名2
on 连接条件
where 筛选条件
group by 分组
having 分组后筛选
order by 排序 desc 降序,asc升序, 不加的话默认升序
*/
练习
#查询商品的个数大于3种的品牌的个数,并显示品牌的名字
SELECT goods.`brande_id`,GROUP_CONCAT(goods.`name`)
FROM goods
INNER JOIN brande
ON goods.`brande_id`=brande.`id`
GROUP BY goods.`brande_id`
HAVING COUNT(*)>3;
where和having的区别
where是筛选前的约束条件
having是筛选后的约束条件
一般来说:
where的约束条件是可以直接在表的字段名里找到的,例如where id>6
having的约束条件是需要计算等手段不能直接在字段名中找到,例如having avg(price)>6
以上表中有id,而表中没有avg(price)