Oraclegroupby子句使用和SQL标准语法中的外链接

SQL标准语法中的外链接 Oracle 从9i开始兼容SQL标准1999 SQL标准还有的连接为:交叉连接,自然连接,Using子句,外链接(全外链接,左外连接,右外连接)

SQL 1999 语法 SELECT table1.column, table2.column FROM table1 [CROSS JOIN table2] | [NATURAL JOIN table2] | [JOIN table2 USING (column_name)] | [JOIN table2 ON(table1.column_name = table2.column_name)] | [LEFT|RIGHT|FULL OUTER JOIN table2 ON (table1.column_name = table2.column_name)];


交叉连接:等同于笛卡尔积,很少用到 SELECT e.last_name, d.department_name FROM employees e CROSS JOIN departments d;


自然链接:相当于Oracle的“等于连接”,只不过是让系统自己去找两张表中字段名相同的字段作为 “等于连接”条件;(注意如果两个表中有相同的列名,但字段类型不一样,这会引发一个错误),两张表中的同名字段不能用表的别名引出,感觉这个功能没有什么用 select d.department_name,l.city,
location_id –这个location_id 是相同列名称,不能用具体哪个表的别名引出,直接写就可以了,不会ambiguous from departments d
natural join locations l order by d.department_name; — 效果等同于下面这段加一个where子句Oracle SQL语句,看来Oracle对标准SQL的更改很到位,去除其中冗余的部分。 select d.department_name, l.city,l.location_id from departments d, locations l where d.location_id = l.location_id order by d.department_name;


Using子句:Using子句可以看成是 自然连接的一种补充功能,我们知道自然连接会让系统自动查找两张表中的所有列名相同的字段,并试图建立“等于连接”;但有的时候我们不期望这么做,而只是期望某个特定的列作为“等于连接”的条件,这种情况下可以使用Using 子句来做限制。 SELECT e.employee_id, e.last_name, d.location_id, department_id FROM employees e
JOIN departments d –这里为什么不能写natural关键字 USING (department_id);
内连接:相当于Oracle的“等于链接 , 关键字:INNER JOIN。 SELECT e.employee_id, l.city, d.department_name FROM employees e INNER JOIN departments d ON d.department_id = e.department_id — 这样写把where子句和from子句混淆到一块去了,还是不如Oracle中的语法 INNER JOIN locations l ON d.location_id = l.location_id;


外连接:可细分为左外连接、右外连接、全外连接。


左外连接:相当于oracle的左外链接 SELECT d.department_name, d.department_id,e.last_name FROM departments d, employees e WHERE d.department_id = e.department_id(+); 用SQL标准来写就是 SELECT d.department_name, d.department_id, e.last_name FROM departments d left join employees e — 主表外链接从表 on(d.department_id = e.department_id);


右外连接
–其实左外连接和右外链接目的都是一样的,主要还是区分主表和从表关系就可以了,为了避免混乱可以直接写左外连接,主表放在左边,从表放在右表即可 select e.last_name,e.department_id,d.department_name from departments d right outer join employees e on (d.department_id = e.department_id)

用Oracle的语法写的方式如下 select e.last_name,e.department_id,d.department_name from departments d,employees e where d.department_id(+)=e.department_id


全外链接:这个语法Oracle中应该没有,这时候没有从表和主表,显示效果是两边为空的都要显示出来独占一行 SELECT e.last_name, e.department_id, d.department_name FROM employees e FULL OUTER JOIN departments d ON (e.department_id = d.department_id);

Oracle Group by 子句的使用


SELECT 查询语句中同时选择分组计算函数表达式和其他独立字段时 ,其他独立字段必须出现在Group By子句中,否则不合法。(这一点和MySQL不一样) SELECT department_id, count(last_name) FROM employees GROUP BY department_id;


不能在Where 条件中使用分组计算函数表达式,当出现这样的需求的时候,使用Having 子句。 SELECT department_id, AVG(salary) FROM employees WHERE AVG(salary) > 8000 GROUP BY department_id;

— 正确的写法应该是使用having子句,对分组后的结果进行筛选 SELECT department_id, AVG(salary) FROM employees GROUP BY department_id
HAVING AVG(salary) > 8000;

分组函数可以嵌套。

(0)
上一篇 2022年3月22日
下一篇 2022年3月22日

相关推荐