day05_DQL查询表中的数据(分组查询丶连接查询)③

分组查询

分组查询是指使用 GROUP BY 语句对查询信息进行分组,相同数据作为一组。查询列表往往是  分组函数和被分组的字段.其他字段没有意义。

语法:

  • select 查询列表  from 表名  where 分组前筛选条件  group by 分组列表  having 分组后筛选条件   order by 排序列表;

执行顺序:

  1. from子句
  2. where子句
  3. group by 子句
  4. having子句
  5. select子句
  6. order by子句

每次执行一个子句都会形成一个虚拟的结果集。

简单的分组

day05_DQL查询表中的数据(分组查询丶连接查询)③

如果我们有更加复杂的分组查询,可以根据筛选来满足我们的条件。分组查询中的筛选分为两类

  • 分组前筛选:筛选的是原始表中的数据,意思就是说筛选条件可以使用在原始表中。使用的关键词 where ,出现 位置  group by 的前面。

day05_DQL查询表中的数据(分组查询丶连接查询)③

  • 分组后筛选:筛选的是分组后的结果集,意思就是说筛选条件只能使用在分组后的结果集中。使用的关键词 having ,出现 位置  group by 的后面面。

day05_DQL查询表中的数据(分组查询丶连接查询)③

having 与 where 的区别

day05_DQL查询表中的数据(分组查询丶连接查询)③

分组前筛选和分组后筛选一起使用

day05_DQL查询表中的数据(分组查询丶连接查询)③

分组和排序一起使用

day05_DQL查询表中的数据(分组查询丶连接查询)③

按多个字段分组,注意:分组的多个字段一样的才能看做一组。

day05_DQL查询表中的数据(分组查询丶连接查询)③

连接查询

在实际开发中,大部分的情况下都不是从单表中查询数据,一般都是多张表联合查询取出最终的结果这就是连接查询。一般一个业务都会对应多张表,如果一个业务存储在存储在同一张表中,数据会存在大量的重复,导致数据的冗余。

多表查询中一定要为表起别名 继可以提高语句的简洁度,也可以区分多个重名的字段。如果为表起了别名,则查询的字段就不能使用原来的表名去限定,建议使用别名来限制查询字段的来源。

根据语法出现的年代来划分的话,包括:

  • SQL92
  • SQL99

根据表的连接方式来划分,包括:

  • 内连接:
    • 等值连接
    • 非等值连接
    • 自连接
  • 外连接:
    • 左外连接
    • 右外连接
  • 全连接

笛卡尔乘积现象

在表的连接查询方面有一种现象被称为:笛卡尔积现象。查看下面的SQL语句:

day05_DQL查询表中的数据(分组查询丶连接查询)③

结果分析:  

day05_DQL查询表中的数据(分组查询丶连接查询)③

笛卡尔积现象:当两张表进行连接查询的时候,没有任何条件进行限制,最终的查询结果条数是两张表记录条数的乘积。

怎么避免笛卡尔积现象?

当然是加条件进行过滤。避免了笛卡尔积现象,会减少记录的匹配次数吗? 不会,次数还是那么多次数。只不过显示的是有效记录。

连接查询之sql92标准(不推荐使用)

sql92标准的内连接

语法:

select 查询列表    from    表1 别名,表2 别名    where 连接条件  and 筛选条件   group by 分组列表   having 分组后筛选   order by 排序列表

执行顺序:

  1. from子句
  2. where子句
  3. and子句
  4. group by子句
  5. having子句
  6. select子句
  7. order by子句

内连接之等值连接

特点:

  • 多表等值连接的结果为多表的交集部分,最大特点是:条件是等量关系。
  • n表连接,至少需要n-1个连接条件
  • 多表的顺序没有要求
  • 一般需要为表起别名
  • 可以搭配前面介绍的所有子句使用,比如排序、分组、筛选

简单使用

day05_DQL查询表中的数据(分组查询丶连接查询)③

可以加筛选

day05_DQL查询表中的数据(分组查询丶连接查询)③

可以加分组  

day05_DQL查询表中的数据(分组查询丶连接查询)③

可以加排序   day05_DQL查询表中的数据(分组查询丶连接查询)③   内连接之非等值连接  

最大的特点是:连接条件中的关系是非等量关系。其他也和等值连接一样,可以加筛选,分组,排序等等.

内连接之自连接

最大的特点是:一张表看做两张表。自己连接自己。其他也和等值连接一样,可以加筛选,分组,排序等等.、  

连接查询之sql9标准(推荐使用)

SQL99标准的内连接语法:

  • SELECT 查询列表   FROM 表名1 别名 【INNER】 JOIN  表名2 别名  ON 连接条件  WHERE 筛选条件  GROUP BY 分组列表  HAVING 分组后筛选  ORDER BY 排序列表;

SQL92和SQL99的区别:

  • SQL99,使用JOIN关键字代替了之前的逗号,并且将连接条件和筛选条件进行了分离,提高阅读性!!!

内连接之等值连接

day05_DQL查询表中的数据(分组查询丶连接查询)③

内连接之非等值连接

day05_DQL查询表中的数据(分组查询丶连接查询)③

内连接之自连接

day05_DQL查询表中的数据(分组查询丶连接查询)③

总结内连接查询步骤

  1. 确定查询哪些表
  2. 确定表连接的条件
  3. 确定筛选的条件
  4. 确定查询的字段
  5. 其他根据题意来添加是否分组,排序,等等..

外连接:

  • 假设A和B表进行连接,使用外连接的话,AB两张表中有一张表是主表,一张表是副表,主要查询主表中的数据,捎带着查询副表,当副表中的数据没有和主表中的数据匹配上,副表自动模拟出NULL与之匹配。左连接有右连接的写法,右连接也会有对应的左连接的写法。应用场景:一般用于查询主表中有但从表没有的记录

特点:

  • 外连接分主从表,两表的顺序不能任意调换
  • 左连接的话,left join左边为主表
  • 右连接的话,right join右边为主表

内连接:

  • 假设A和B表进行连接,使用内连接的话,凡是A表和B表能够匹配上的记录查询出来,这就是内连接。

外连接,内连接区别

  • 内连接:AB两张表没有主副之分,两张表是平等的。
  • 外连接:AB两张表有主副之分,查询结果为主表中所有的记录,如果从表有匹配项,则显示匹配项;如果从表没有匹配项,则显示null

左外连接(左连接):表示左边的这张表是主表。语法如下:

  • SELECT 字段名 FROM 左表 RIGHT [OUTER ]JOIN 右表 ON 条件 是否需要分组,排序,等等根据需求添加。可以理解为:在内连接的基础上保证左表的数据全部显示。

day05_DQL查询表中的数据(分组查询丶连接查询)③

右外连接(右连接):表示右边的这张表是主表。语法如下:

  • SELECT 字段名 FROM 左表 RIGHT [OUTER ]JOIN 右表 ON 条件 是否需要分组,排序,等等根据需求添加。可以理解为:在内连接的基础上保证右表的数据全部显示。

day05_DQL查询表中的数据(分组查询丶连接查询)③

多张怎么连接查询

day05_DQL查询表中的数据(分组查询丶连接查询)③

子查询

什么是子查询 :

  • 当一个查询语句中又嵌套了另一个完整的select语句,则被嵌套的select语句称为子查询或内查询外面的select语句称为主查询或外查询。

特点:

  • 一个查询的结果做为另一个查询的条件
  • 有查询的嵌套,内部的查询称为子查询
  • 子查询要使用括号

子查询结果的三种情况:

day05_DQL查询表中的数据(分组查询丶连接查询)③

如果子查询要出现在where或having后面 查询的结果必须为单列

  • 子查询结果只要是 单行单列 ,在 where或having后面 作为条件,供父查询使用。父查询可以使用   单行操作符:> < >= <= = <>等等操作子查询的结果

day05_DQL查询表中的数据(分组查询丶连接查询)③

子查询结果只要是 多行单列 ,在 where或having后面 作为条件,供父查询使用。父查询可以使用  多行操作符:any/some  all in   操作子查询的结果
  • in:判断某字段是否在指定列表内  
  • any/some:判断某字段的值是否满足其中任意一个
  • all:判断某字段的值是否满足里面所有的

day05_DQL查询表中的数据(分组查询丶连接查询)③

 

如果子查询要出现在select后面。要求:子查询的结果为单行单列(标量子查询)

day05_DQL查询表中的数据(分组查询丶连接查询)③

如果子查询要出现在from后面。  要求:子查询的结果可以为多行多列  。子查询作为表需要取别名,否则这张表没有名称则无法访问表中的字段

day05_DQL查询表中的数据(分组查询丶连接查询)③

如果子查询要出现exists后面 要求:子查询结果必须为单列(相关子查询)。

day05_DQL查询表中的数据(分组查询丶连接查询)③

如果有则返回1,否则返回0

上一篇:Day05-三大特性-继承


下一篇:day05