关于进行条件筛选的SQL关键字的一点理解

概述

一般能够用于条件筛选的有三种:

  • ON: 联结(join)筛选
  • WHERE: 一般条件筛选
  • HAVING: 分组后的条件筛选

ON

JOIN – ON 语句的执行顺序:

例句:
SELECT * FROM A LEFT JOIN B ON A.ID = B.ID AND A<>0 WHERE A.name = ‘x’

注意在作on 连接后 的and 子句 和where 子句 。 他们有什么不同?
逻辑上解释:(不考虑执行计划中执行步骤和作嵌套连接等具体方式,这里只讨论如何思考逻辑上的步骤) 
执行顺序是: FROM –> JOIN –> ON –>AND–> LEFT–> WHERE –>SELECT

  • A步骤. 先将两张表根据ON 条件 作连接(逻辑上,相等于将两张表笛卡尔集后根据ID相等条件筛选数据,实际情况后面分析) 
  • B步骤. 根据ON 后面,WHERE 之前 的 AND 条件筛选数据
  • C步骤. 跟据LEFT 无论如何,要保证A表的数据完整性。所以在上一步骤产生的结果集中补齐A表因无法比与B表匹配而被AND 条件筛选的掉的数据;
  • D步骤. 再根据WHERE筛选结果集。 

Having

讲到Having一定要先讲讲Group By
GROUP BY 子句 :
创建分组


SELECT               column, SUM(column)
FROM                 table
GROUP BY             column

说明:GROUP BY子句依据column列里的数据对行进行分组,即具有相同的值的行被划为一组。它一般与聚合函数同时使用。当然,这里的SUM()函数也可以是其他聚合函数。所有的组合列(GROUP BY子句中列出的列)必须是来自FROM子句列出的表,不能根据实际值、聚合函数结果或者其他表达式计算的值来对行分组。
GROUP BY子句根据多列组合行


SELECT             DNAME,TSEX, COUNT(*) AS TOTAL_NUM
FROM               TEACHER
GROUP BY           DNAME,TSEX

HAVING子句
GROUP BY子句分组,只是简单地依据所选列的数据进行分组,将该列具有相同值的行划为一组。而实际应用中,往往还需要删除那些不能满足条件的行组,为了实现这个功能,SQL提供了HAVING子句。语法如下。


SELECT           column, SUM(column)
FROM             table
GROUP BY        column
HAVING        SUM(column) condition value

说明:HAVING通常与GROUP BY子句同时使用。当然,语法中的SUM()函数也可以是其他任何聚合函数。DBMS将HAVING子句中的搜索条件应用于GROUP BY子句产生的行组,如果行组不满足搜索条件,就将其从结果表中删除。

Where

HAVING子句和WHERE子句的相似之处在于,它也定义搜索条件。但与WHERE子句不同,HAVING子句与组有关,而不是与单个的行有关。

郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。