Mysql必知必会(笔记)【分组函数,子查询, 联结,高级联结,组合查询】

时间:2023-01-31 22:32:18

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子句。