1. 数据分组
1.1 创建分组:
select 字段名,count(*) as 别名 from 表名 group by 字段名
Group by子句只是DBMS按字段名排序并分组数据,这就会对每个字段名计算总数。
- Group by子句可以包含任意数目的列,因而可以对分组进行签套,更细致地进行数据分组。
- 如果在Group by子句中嵌套了分组,数据将在最后指定的分组上进行汇总。换句话说,在建立分组时,指定的所有列都一起进行计算(所以不能从个别的列取回数据)。
- Group by子句中列出的每一列都必须是检索列或有效的表达式(但不能是聚集函数)。如果在SELECT中使用表达式,则必须在Group by子句中指定相应的表达式。不能使用别名。
- 大多数SQL实现不允许Group by列带有长度可变的数据类型(如文本或者备注性字段)。
- 除聚集计算语句外,SELEST语句中每一列都必须包含在Group by子句中给出。
- 如果分组列中包含具有NULL值得行,则NULL将作为一个分组返回。如果列中包含多行NULL值,他们将分为一组。
- Group by子句必须出现在WHERE子句之后Order by 语句之前。
1.2 过滤分组:
select 字段名,count(*) as 别名 from 表名 group by 字段名 having 表达式
Having与Where的差别:Where在数据分组前进行过滤,Having在数据分组后进行过滤。使用Having时应该结合 group by子句,而WHERE子句用于标准的行级过滤。
1.3 分组与排序:
属性 | Order by | Group by |
---|---|---|
输出 | 对产生的输出排序 | 对行分组,但输出可能不是分组的顺序 |
范围 | 任一列都可以使用 | 只可能使用选择列或表达式列,而且必须使用每个选择类表达式 |
聚集函数 | 不一定需要 | 如果与聚集函数一起使用列(或表达his),则必须使用 |
1.4 SELECT子句顺序:
子句 | 说明 | 是否必须使用 |
---|---|---|
SELECT | 要返回列或者表达式 | 是 |
FROM | 从中检索数据的表 | 尽在从表选择数据时使用 |
WHERE | 行级过滤 | 否 |
GROUP BY | 分组说明 | 仅在按组计算聚集时使用 |
HAVING | 组级过滤 | 否 |
ORDER BY | 输出排序顺序 | 否 |
2. 子查询
2.1 利用子查询进行过滤:
SQL还允许创建子查询(subquery),即嵌套在其他查询中的查询。
select * from 表名 where 字段名 in (select * from 表名where 表达式)
注:作为子查询的SELECT语句只能查询单个列。企图检索多个列将返回错误。
2.1 作为计算字段使用子查询:
3. 联结
3.1 内联结:
使用的联结称为等值联结(equijoin),它基于两个表之间的相等测试。这种联结也称为内联结(inner join)
select 字段名,字段名,字段名 from 表1,表2 where 表1.字段名 = 表2.字段名
笛卡儿积(cartesian product)
由没有联结条件的表关系返回的结果为笛卡儿积。检索出的行的数目将是第一个表中的行数乘以第二个表中的行数。
select 字段名,字段名,字段名 from 表名 inner join 表名 on 表名.字段名 = 表名.字段名;
3.2 联结多个表:
SQl不限制一条查询语句中可以联结的表的数目。
select 字段名,字段名,字段名 from 表1,表2,表3 where 表1.字段名 = 表2.字段名 and 表1.字段名 = 表2.字段名
4. 高级联结
4.1 使用别名(列名,表别名)
注:表别名只在查询执行中使用。与列别名不一样,表别名不返回到客户端。
4.2 使用不同类型的联结
具有三种联结包括:自联结(self - join),自然联结(natural join )和外联结(outer join)
自联结:
select 别名1.字段名,别名2.字段名 from 表名 as 别名1,表名 as 别名2, where 别名1.字段名 = 别名2.字段名 and 别名2.字段名 = ‘值’
自然联结:
自然联结排除多次出现,使每一列只返回一次。
外联结:
左外联结(left join on),右外联结(right join on),全联结(full join on)
5. 组合查询
多数SQL查询只包含从一个或多个表中返回数据的单条SELECT语句。但是,SQL也允许执行多个查询(多条SELECT语句),并将结果作为一个
查询结果集返回。这些组合查询通常称为并(union)或复合查询(compound query)
5.1 使用UNION
select 查询语句 UNION select查询语句;
注:UNION规则:
- UNION必须由两条或两条以上的SELECT语句组成,语句之间用关键字UNION分隔(因此,如果组合四条SELECT语句,将要使用三个UNION关
键字)。 - UNION中的每个查询必须包含相同的列、表达式或聚集函数(不过,各个列不需要以相同的次序列出)。
- 列数据类型必须兼容:类型不必完全相同,但必须是DBMS可以隐含转换的类型(例如,不同的数值类型或不同的日期类型)。
- 使用UNION时,重复的行会被自动取消。(如果需要返回所有的行可使用UNION ALL)
- SELECT语句的输出用ORDER BY子句排序。在用UNION组合查询时,只能使用一条ORDER BY子句,它必须位于最后一条SELECT语句之后。对于结果
集,不存在用一种方式排序一部分,而又用另一种方式排序另一部分的情况,因此不允许使用多条ORDER BY子句。