Tiny_Lu
不忘初心

Day 35 MySQL基础(三)

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

posted @ 2019-10-30 19:53  二二二二白、  阅读(86)  评论(0编辑  收藏  举报