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 之后。3、分组数据
group by
:group by
子句将记录分组到汇总行中。group by
为每个组返回一个记录。group by
通常还涉及聚合count
,max
,sum
,avg
等。group by
可以按一列或多列进行分组。group by
按分组字段进行排序后,order by
可以以汇总字段来进行排序。
having
:having
用于对汇总的group by
结果进行过滤。having
必须要与group by
连用。where
和having
可以在相同的查询中。
having
vs where
:where
:过滤过滤指定的行,后面不能加聚合函数(分组函数)。having
:过滤分组,必须要与group by
连用,不能单独使用。- 知识点:
count(*)
,count(列名)
都可以,区别在于,count(列名)
是统计非 NULL 的行数;order by
最后执行,所以可以使用列别名;- 分组聚合一定不要忘记加上
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;
4、使用子查询
子查询常用在 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 | 交叉连接,从两个或者多个连接表中返回记录集的笛卡尔积。 |
6、组合查询
UNION
运算符将两个或更多查询的结果组合起来,并生成一个结果集,其中包含来自 UNION
中参与查询的提取行。
UNION
基本规则:
- 所有查询的列数和列顺序必须相同。
- 每个查询中涉及表的列的数据类型必须相同或兼容。
- 通常返回的列名取自第一个查询。
默认地,UNION
操作符选取不同的值。如果允许重复的值,请使用 UNION ALL
UNION
结果集中的列名总是等于 UNION
中第一个 SELECT
语句中的列名。
JOIN
vs UNION
:
JOIN
中连接表的列可能不同,但在UNION
中,所有查询的列数和列顺序必须相同。UNION
将查询之后的行放在一起(垂直放置),但JOIN
将查询之后的列放在一起(水平放置),即它构成一个笛卡尔积
使用
union
组合查询时,只能使用一条 order by
字句,他必须位于最后一条 select
语句之后