Oracle SQL 多表关联查询以及分组计算

Oracle SQL 多表关联查询

遵循第三范式,我们需要联合多表查询结果返回给用户,若查询时不指定条件,会以笛卡儿积方式返回表数据,这并不是我们希望的。

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 等

你可能感兴趣的:(Oracle,SQL)