1、使用 WHERE 和 HAVING 过滤数据

SELECT cust_name, COUNT(*) AS num
FROM Customers
WHERE cust_email IS NOT NULL
GROUP BY cust_name
HAVING COUNT(*) >= 1;

having vs where :

  • where:过滤过滤指定的行,后面不能加聚合函数(分组函数)。where 在group by 前。
  • having:过滤分组,一般都是和 group by 连用,不能单独使用。having 在 group by 之后。
 
2、知识点:order by 对多列排序的时候,先排序的列放前面,后排序的列放后面。并且,不同的列可以有不同的排序规则。
order by 语句必须放在 where 之后。
 
group by :
  • group by 子句将记录分组到汇总行中。
  • group by 为每个组返回一个记录。
  • group by 通常还涉及聚合countmaxsumavg 等。
  • group by 可以按一列或多列进行分组。
  • group by 按分组字段进行排序后,order by 可以以汇总字段来进行排序。
having
  • having 用于对汇总的 group by 结果进行过滤。
  • having 必须要与 group by 连用。
  • where 和 having 可以在相同的查询中。
having vs where
  • where:过滤过滤指定的行,后面不能加聚合函数(分组函数)。
  • having:过滤分组,必须要与 group by 连用,不能单独使用。
  • 知识点:
    1. count(*),count(列名)都可以,区别在于,count(列名)是统计非 NULL 的行数;
    2. order by 最后执行,所以可以使用列别名;
    3. 分组聚合一定不要忘记加上 group by ,不然只会有一行结果。

子查询 ,如下说明having在select后面吧,当然order by是整个sql最后
select order_num
 from (select order_num, sum(quantity) as sum_num 
 from OrderItems group by order_num having sum_num >= 100 )
 order by order_num;
 

子查询常用在 where 子句和 from 子句后边:

  • 当用于 where 子句时,根据不同的运算符,子查询可以返回单行单列、多行单列、单行多列数据。子查询就是要返回能够作为 WHERE 子句查询条件的值。
  • 当用于 from 子句时,一般返回多行多列数据,相当于返回一张临时表,这样才符合 from 后面是表的规则。这种做法能够实现多表联合查询。
 
5、连接表

ON 和 WHERE 的区别

  • 连接表时,SQL 会根据连接条件生成一张新的临时表。ON 就是连接条件,它决定临时表的生成。
  • WHERE 是在临时表生成以后,再对临时表中的数据进行过滤,生成最终的结果集,这个时候已经没有 JOIN-ON 了。
  • 另外,如果两张表的关联字段名相同,也可以使用 USING子句来代替 ON,举个例子:
连接类型说明
INNER JOIN 内连接 (默认连接方式)只有当两个表都存在满足条件的记录时才会返回行。
LEFT JOIN / LEFT OUTER JOIN 左(外)连接 返回左表中的所有行,即使右表中没有满足条件的行也是如此。
RIGHT JOIN / RIGHT OUTER JOIN 右(外)连接 返回右表中的所有行,即使左表中没有满足条件的行也是如此。
FULL JOIN / FULL OUTER JOIN 全(外)连接 只要其中有一个表存在满足条件的记录,就返回行。
SELF JOIN 将一个表连接到自身,就像该表是两个表一样。为了区分两个表,在 SQL 语句中需要至少重命名一个表。
CROSS JOIN 交叉连接,从两个或者多个连接表中返回记录集的笛卡尔积。
 

UNION 运算符将两个或更多查询的结果组合起来,并生成一个结果集,其中包含来自 UNION 中参与查询的提取行。

UNION 基本规则:

  • 所有查询的列数和列顺序必须相同。
  • 每个查询中涉及表的列的数据类型必须相同或兼容。
  • 通常返回的列名取自第一个查询。

默认地,UNION 操作符选取不同的值。如果允许重复的值,请使用 UNION ALL

UNION 结果集中的列名总是等于 UNION 中第一个 SELECT 语句中的列名。

JOIN vs UNION

  • JOIN 中连接表的列可能不同,但在 UNION 中,所有查询的列数和列顺序必须相同。
  • UNION 将查询之后的行放在一起(垂直放置),但 JOIN 将查询之后的列放在一起(水平放置),即它构成一个笛卡尔积
 
使用 union 组合查询时,只能使用一条 order by 字句,他必须位于最后一条 select 语句之后