遵循第三范式,我们需要联合多表查询结果返回给用户,若查询时不指定条件,会以笛卡儿积方式返回表数据,这并不是我们希望的。
SELECT table1.column, table2.column
FROM table1, table2
WHERE table1.column1 = table2.column2;
这已经是最基础的等于连接啦
不等连接
< 或者 > 或者 <> 或者!= 或者 between … and …
外连接:
左外连接,右外连接
左外连接就是按照左边的table来生成查询结果,右表查询不到的就用空来表示,写法为
SELECT table1.column, table2.column
FROM table1, table2
WHERE table1.column = table2.column(+);
可记为:哪边有加号哪边就可以为空
还有另外一种写法:
SELECT e.last_name, e.department_id, d.department_name
FROM employees e
LEFT OUTER JOIN departments d
ON (e.department_id = d.department_id) ;
全连接
select * from t_A a full outer join t_B b on a.id = b.id;
自连接
有时我们需要自表连接来查询数据
我们采用起别名的方式
SELECT table1.column, table2.column
FROM table1, table1 table2
WHERE table1.column1 = table2.column2;
这个真的是超级好用
SELECT [column,] group_function(column), ...
FROM table
[WHERE condition]
[GROUP BY column]
[ORDER BY column];
select后面可以添加分组函数,或者是已经经过分组的条件列
分组函数有:
SUM 求和
AVG 求平均
MAX
MIN
COUNT 求数量
注意:不能在Where 条件中使用分组计算函数表达式,当出现这样的需求的时候,使用Having 子句。
SELECT department_id, AVG(salary) FROM employees
GROUP BY department_id
HAVING AVG(salary) > 8000;
子查询其实就是sql嵌套,举个例子:
SELECT last_name
FROM employees
WHERE salary >
(SELECT salary
FROM employees
WHERE last_name = 'Abel');
注意:单行比较必须对应单行子查询(返回单一结果值的查询); 比如= , >
多行比较必须对应多行子查询(返回一个数据集合的查询);比如 IN , > ANY, > ALL 等