码迷,mamicode.com
首页 > 数据库 > 详细

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

时间:2015-05-18 01:11:40      阅读:168      评论:0      收藏:0      [点我收藏+]

标签:sql   having   groupby   join-on   焦刚   

概述

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

  • 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子句与组有关,而不是与单个的行有关。

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

标签:sql   having   groupby   join-on   焦刚   

原文地址:http://blog.csdn.net/yuyuanhuang/article/details/45802617

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!