12.数据汇总
数据汇总的类型有三类:
- 确定表中的行数;
- 获得行组的和;
- 找出列中的最大值、最小值,平均值;
需要说明的是:
COUNT(*):表示对行数目统计,即使一行全为NULL,也不忽略NULL所在的行。
COUNT(column):对特定列数目统计,在NULL出现时忽略该列。
13.分组数据
-
GROUP BY 通过什么区分组别?
举一个简单例子,有ABCDEF五个供应商,分别各自生产商品,他们生产的商品被储存在表products中,这时候我们需要将这个表中储存的数据进行整理,返回每个供应商生产的产品总数,再将它们放到一起。这就需要使用分组语句GROUP BY。分组语句通过每行元素存储的’‘同一类属性(生产商)’'进行分类。
-
GROUP BY 在遇到NULL值时如何处理?
如果在列中遇到了NULL值时,将有NULL值的行分为一组返回。
-
过滤关键字HAVING和WHERE的区别?
关键字HAVING用来过滤已经分好的分组,例如我们想得到五个供应商中到底有哪几个供应商生产的商品数量大于100件,这时候就可以用HAVING添加更准确的条件过滤分好的组。
HAVING与WHERE关键字都用来过滤,不同点在于HAVING过滤的是分组, WHERE过滤的是行,或者还可以这样理解,WHERE在分组前过滤我们不希望出现的行,而HAVING在分组后过滤我们不希望出现的分组;举一个例子的话应该是这样:我们需要挑选出5个厂商中单价大于100的商品,看看分别有多少个厂商有10个以上单价大于100的商品,这个例子中运用了一次分组(聚合),过滤了两次,第一次对单价进行过滤,第二次对分组过滤。
14.使用子查询
-
如何创造一个子查询?
假设有这样一种情况,我们需要在储存不同信息的多个表之间寻找到我们需要的特定信息是,可以使用子查询,子查询在后面的学习中会发展成联结,这里我们先介绍什么是子查询,我们通过一个例子:有一个叫做orders的表,里面装满了用户的订单信息(orders_num),我们需要寻找1003这个订单的客户姓名信息,而客户的姓名(cust_name)信息储存在customers这个表内。
这时候我们就需要使用子查询
SELECT cust_name, cust_id
FROM customers
WHERE cust_id IN
(SELECT cust_id,
FROM orders
WHERE orders_num = 1003);
- 子查询与联结的关系是?
子查询是一种发展的没有那么抽象的内部联结(内部联结又叫等值联结),所以说子查询的本质就是等值联结。
15.联结表
- 联结产生的原因?
大的来讲是因为MySQL是关系型数据库,数据的储存分散在各个表中,为什么要分散存储数据呢?举一个例子,有位生产商F创造了100件商品,尚品的信息属性中一定存储着与生产商的信息,例如地址、电话、生产商姓名,当这些信息发生了变动时,我们只需要在与生产商有关的表内修改一次就会适配所有这个生产商制造的商品,何乐而不为呢?
总的来说,分解数据为多个表能更有效地储存,更方便的管理,但是这些好处是有代价的,什么代价呢?是掉头发吗?我也不知道,我才刚入门。 - 外键与主键
主键是表内某一列如A列,这一列具有唯一标识,这一列也可以放在其他的表B中,这样B中的A列就称为外键。但是这一列的信息在挪动时不发上变化。仅仅只是出现在不同的表中。
16.创建高级联结
联结可以分为四种:
-
自联结
在查询中出现了两个表,但是这两个表相同,联结这两个相同的表,找到我们需要的数据,那么怎么告诉解释器说明这两个表是存在区别的,否则解释器会分不清楚,这就需要对表命名,名字需要起的不同。 -
外部联结(表1 INNER JOIN 表2 ON)
关联多个不同的表中的行。
LEFT OUTER JOIN
RIGHT OUTER JOIN -
自然联结
自然联结是说,联结两个表时不用指定联结的条件,系统会自发的将姓名相同的列进行比较,返回相同的值,之后删除重复的列,如下例子:
自然联结还可以这样理解:先得出笛卡尔积,之后选择列中元素相同的行,之后删除重复出现的列。 -
等值联结(内部联结)
等值联结(内部联结)是子查询的抽象化,依据不同表中相同的列元素查询 -
笛卡尔积是怎么产生的?
当联结没有指定条件时,例如还是5位生产商ABCDE,需要关联生产商的名称与产品时,没有指定生产商的ID与生产的产品ID相同时,关联的结果会成为‘列表里的产品被生产商ABCDE5位生产商分别生产一遍,糟糕透了’,事实并不是这样的,有些产品供应商根本就生产不了,但是MySQL不会考虑逻辑上的问题,MySQL不会管组合是否会是一个有意义的组合。
17.组合查询
- UNION从不同的表中组合数据
- UNION从相同的表中组合数据
- UNION与WHERE的区别
UNION总是可以完成与多个WHERE相同的工作,UNION可以剔除筛选后的重复元素,但是UNION ALL的声明让UNION独一无二,UNION ALL 声明表示不剔除重复元素。