GROUP BY子句必须出现在WHERE子句之后,ORDER BY子句之前。

过滤分组:
事实上,目前为止所学过的所有类型的WHERE子句都可以用HAVING来替代。唯一的差别是WHERE过滤行,而HAVING过滤分组。

WHERE在数据分组前进行过滤,HAVING在数据分组后进行过滤。

分组和排序:

SELECT子句的顺序:


员工表:

工资等级表:
部门表:
利用子查询进行过滤:
现在查找职业为CLERK的员工的部门地址:

不是4行,重复的没有算进去。
可见,在WHERE子句中使用子查询能够编写出功能很强并且很灵活的SQL语句。对于能嵌套的子查询的数目没有限制,不过在实际使用时由于性能的限制,不能嵌套太多的子查询。
作为计算字段使用子查询:

外键为某个表中的一列,它包含另一个表的主键值,定义了两个表之间的关系。
创建联结:

自联结:

现在不采用子查询的方式:

自然联结:
无论何时对表进行联结,应该至少有一个列出现在不止一个表中(被联结的列)。标准的联结(前一章中介绍的内部联结)返回所有数据,甚至相同的列多次出现。自然联结排除多次出现,使每个列只返回一次。

外部联结:
左外连接:

右外连接:

使用带聚集函数的联结:


包含获取取消重复的行:
UNION从查询结果集中自动去除了重复的行。这是UNION的默认行为,但是如果需要,可以改变它。事实上,如果想返回所有匹配行,可使用UNION ALL而不是UNION。
对组合查询结果排序:在用UNION组合查询时,只能使用一条ORDER BY子句,它必须出现在最后一条SELECT语句之后。