(4)Oracle尚硅谷:多表查询
笛卡尔集的产生条件:(1)省略连接条件 (2)连接条件无效 (3)所有表中的所有行互相连接
所以:为了避免笛卡尔集,where中加入有效连接
内连接:不返回未匹配的行;——等值连接、非等值连接、自连接
外连接:返回未匹配的行;———(+)、left join、right join、fulljoin
1、等值连接
连接n个表,至少需要n-1个条件。
内连接:不返回未匹配的行;
1 --代码示例: 2 select employee_id,e.department_id,department_name 3 from employees e,departments d 4 where e.department_id=d.department_id;
2、非等值连接
1 --代码示例: 2 select employee_id,last_name,salary,grade_level 3 from employees e,job_grades j 4 where e.salary between j.lowest_sal and j.highest_sal;
3、自连接
内连接:不返回未匹配的行;
1 --查询员工姓名及其对应领导的信息: 2 select e.last_name,m.last_name,m.salary,m.email 3 from employees e,employees m 4 where e. manager_id = m.employee_id;
4、外连接(+)
外连接:返回未匹配的行;(+)只能表示left join、right join,不能表示full join = 左右未连接到的记录都存在。
1 --代码示例: 2 select employee_id,e.department_id,department_name 3 from employees e,departments d 4 where e.department_id=d.department_id(+); 5 --记录少的表后加上(+),上例(+)在右表,employees表含有所有记录,同左外连接left join
5、SQL99语法
1 --使用cross join,连接表产生叉集,同笛卡尔集。 2 select last_name,department_name 3 from employees 4 cross join departments; 5 6 --使用natural join, 自动用表相同字段作为连接条件 7 --但2个字段相同时,则默认2个连接条件,不能指定 8 select last_name,department_name 9 from employees 10 natural join departments; 11 12 --使用join……using……,可指定连接条件,同等值连接 13 --但需2个表中字段名称、类型一致,否则不可使用 14 select last_name,department_name 15 from employees 16 join departments 17 using(department_id);
当连接字段列名、类型不一致时,可使用join……on……
左外连接:left join = 左未连接到的记录存在。
右外连接:right join = 右未连接到的记录存在。
满外连接:full join = 左右未连接到的记录都存在。
1 --连接n个表,至少需要n-1个条件。 2 select employee_id,e.department_id,department_name,city 3 from employees e 4 join departments d 5 on e.department_id = m.department_id 6 join location l 7 on d.location_id = m.location_id;