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 语句之后