分组查询
分组查询是指使用 GROUP BY 语句对查询信息进行分组,相同数据作为一组。查询列表往往是 分组函数和被分组的字段.其他字段没有意义。
语法:
- select 查询列表 from 表名 where 分组前筛选条件 group by 分组列表 having 分组后筛选条件 order by 排序列表;
执行顺序:
- from子句
- where子句
- group by 子句
- having子句
- select子句
- order by子句
每次执行一个子句都会形成一个虚拟的结果集。
简单的分组
如果我们有更加复杂的分组查询,可以根据筛选来满足我们的条件。分组查询中的筛选分为两类
- 分组前筛选:筛选的是原始表中的数据,意思就是说筛选条件可以使用在原始表中。使用的关键词 where ,出现 位置 group by 的前面。
- 分组后筛选:筛选的是分组后的结果集,意思就是说筛选条件只能使用在分组后的结果集中。使用的关键词 having ,出现 位置 group by 的后面面。
having 与 where 的区别
分组前筛选和分组后筛选一起使用
分组和排序一起使用
按多个字段分组,注意:分组的多个字段一样的才能看做一组。
连接查询
在实际开发中,大部分的情况下都不是从单表中查询数据,一般都是多张表联合查询取出最终的结果这就是连接查询。一般一个业务都会对应多张表,如果一个业务存储在存储在同一张表中,数据会存在大量的重复,导致数据的冗余。
多表查询中一定要为表起别名 继可以提高语句的简洁度,也可以区分多个重名的字段。如果为表起了别名,则查询的字段就不能使用原来的表名去限定,建议使用别名来限制查询字段的来源。
根据语法出现的年代来划分的话,包括:
- SQL92
- SQL99
根据表的连接方式来划分,包括:
- 内连接:
- 等值连接
- 非等值连接
- 自连接
- 外连接:
- 左外连接
- 右外连接
- 全连接
笛卡尔乘积现象
在表的连接查询方面有一种现象被称为:笛卡尔积现象。查看下面的SQL语句:
结果分析:笛卡尔积现象:当两张表进行连接查询的时候,没有任何条件进行限制,最终的查询结果条数是两张表记录条数的乘积。
怎么避免笛卡尔积现象?
当然是加条件进行过滤。避免了笛卡尔积现象,会减少记录的匹配次数吗? 不会,次数还是那么多次数。只不过显示的是有效记录。
连接查询之sql92标准(不推荐使用)
sql92标准的内连接
语法:
select 查询列表 from 表1 别名,表2 别名 where 连接条件 and 筛选条件 group by 分组列表 having 分组后筛选 order by 排序列表
执行顺序:
- from子句
- where子句
- and子句
- group by子句
- having子句
- select子句
- order by子句
内连接之等值连接
特点:
- 多表等值连接的结果为多表的交集部分,最大特点是:条件是等量关系。
- n表连接,至少需要n-1个连接条件
- 多表的顺序没有要求
- 一般需要为表起别名
- 可以搭配前面介绍的所有子句使用,比如排序、分组、筛选
简单使用
可以加筛选
可以加分组 可以加排序 内连接之非等值连接最大的特点是:连接条件中的关系是非等量关系。其他也和等值连接一样,可以加筛选,分组,排序等等.
内连接之自连接
最大的特点是:一张表看做两张表。自己连接自己。其他也和等值连接一样,可以加筛选,分组,排序等等.、连接查询之sql9标准(推荐使用)
SQL99标准的内连接语法:
- SELECT 查询列表 FROM 表名1 别名 【INNER】 JOIN 表名2 别名 ON 连接条件 WHERE 筛选条件 GROUP BY 分组列表 HAVING 分组后筛选 ORDER BY 排序列表;
SQL92和SQL99的区别:
- SQL99,使用JOIN关键字代替了之前的逗号,并且将连接条件和筛选条件进行了分离,提高阅读性!!!
内连接之等值连接
内连接之非等值连接
内连接之自连接
总结内连接查询步骤:
- 确定查询哪些表
- 确定表连接的条件
- 确定筛选的条件
- 确定查询的字段
- 其他根据题意来添加是否分组,排序,等等..
外连接:
- 假设A和B表进行连接,使用外连接的话,AB两张表中有一张表是主表,一张表是副表,主要查询主表中的数据,捎带着查询副表,当副表中的数据没有和主表中的数据匹配上,副表自动模拟出NULL与之匹配。左连接有右连接的写法,右连接也会有对应的左连接的写法。应用场景:一般用于查询主表中有但从表没有的记录
特点:
- 外连接分主从表,两表的顺序不能任意调换
- 左连接的话,left join左边为主表
- 右连接的话,right join右边为主表
内连接:
- 假设A和B表进行连接,使用内连接的话,凡是A表和B表能够匹配上的记录查询出来,这就是内连接。
外连接,内连接区别
- 内连接:AB两张表没有主副之分,两张表是平等的。
- 外连接:AB两张表有主副之分,查询结果为主表中所有的记录,如果从表有匹配项,则显示匹配项;如果从表没有匹配项,则显示null
左外连接(左连接):表示左边的这张表是主表。语法如下:
- SELECT 字段名 FROM 左表 RIGHT [OUTER ]JOIN 右表 ON 条件 是否需要分组,排序,等等根据需求添加。可以理解为:在内连接的基础上保证左表的数据全部显示。
右外连接(右连接):表示右边的这张表是主表。语法如下:
- SELECT 字段名 FROM 左表 RIGHT [OUTER ]JOIN 右表 ON 条件 是否需要分组,排序,等等根据需求添加。可以理解为:在内连接的基础上保证右表的数据全部显示。
多张怎么连接查询
子查询
什么是子查询 :
- 当一个查询语句中又嵌套了另一个完整的select语句,则被嵌套的select语句称为子查询或内查询外面的select语句称为主查询或外查询。
特点:
- 一个查询的结果做为另一个查询的条件
- 有查询的嵌套,内部的查询称为子查询
- 子查询要使用括号
子查询结果的三种情况:
如果子查询要出现在where或having后面 查询的结果必须为单列
- 子查询结果只要是 单行单列 ,在 where或having后面 作为条件,供父查询使用。父查询可以使用 单行操作符:> < >= <= = <>等等操作子查询的结果
- in:判断某字段是否在指定列表内
- any/some:判断某字段的值是否满足其中任意一个
- all:判断某字段的值是否满足里面所有的
如果子查询要出现在select后面。要求:子查询的结果为单行单列(标量子查询)
如果子查询要出现在from后面。 要求:子查询的结果可以为多行多列 。子查询作为表需要取别名,否则这张表没有名称则无法访问表中的字段
如果子查询要出现exists后面 要求:子查询结果必须为单列(相关子查询)。
如果有则返回1,否则返回0