MySQL基础(二)
分组数据
创建分组
分组是在select语句的group by子句中建立的.
select vend_id, count(*) as num_prods
from products
group by vend_id
上面的select指定了两个列,vend_id包含产品供应商的id,num_prods为计算字段(用count(*)函数建立).group by子句指示MySQL按vend_id排序并分组数据.这导致对每个vend_id而不是整个表计算num_prods一次.
再具体使用group by子句之前,需要知道一些重要的规定:
- group by子句可以包含任意数目的列.这使得能对分组进行嵌套,为数据分组提供更细致的控制
- 如果在group by中嵌套了分组,数据将在最后规定的分组上进行汇总.换句话说,在建立分组时,指定的所有列都一起计算(所以不能从个别的列取回数据)
- group by子句中列出的每个列都必须是检索列或有效的表达式(但不能是聚集函数).如果在select中使用表达式,则必须在group by子句中指定相同的表达式
- 除聚集计算语句外,select语句中的每个列都必须在group by子句中给出
- 如果分组列中有null值,则null将作为一个分组返回.如果列中有多行null,它们将分为一组
- group by子句必须出现在where子句后,order by子句前
过滤分组
除了能使用group by子句进行分组外,MySQL还允许过滤分组,规定包括哪些分组,排除哪些分组.
我们已经看到了where子句的作用.但是,在这个例子中where不能完成任务,因为where过滤指定的是行而不是分组.事实上,where没有分组的概念
MySQL提供了另外的子句,那就是having子句.having非常类似于where.事实上,目前为止所学过的所有类型的where子句都可以用having来替代.唯一的差别是where过滤行,而having过滤分组.
下面看一个例子:
select vend_id, count(*) as num_prods
from products
group by vend_id
having count(*) > 2
排序
order by 字段名
默认按正序排序,可以在最后加上desc则按倒序排列
可以同时对多个列进行不同的排序
limit
select语句返回所有匹配的行,它们可能是指定表中的每个行.为了返回第一行或前几行,可以使用limit子句
select prod_name from products limit 5
我们还可以指定要检索的开始行和行数
select prod_name from products limit 5, 5
limit 5, 5表示MySQL返回从行5开始的5行.第一个数为开始的位置,第二个数为要检索的行数.
注意: 第一行的索引为0.如limit 1, 1表示第二行的数据
外键
FOREIGN KEY - 保证一个表中的数据匹配另一个表中的值的参照完整性
使用的原因:
a. 减少占用的空间
b. 只需要修改department表中一次, 其余的表中的数据就会相应的修改
表连接
inner join
left join
right join
full join