- A+
不等连接:连接条件不使用等号操作符的连接。很少见。
--创建工资级别表
CREATE TABLE JOB_GRADES
( GRADE_LEVEL VARCHAR2(1),
LOWEST_SAL NUMBER,
HIGHEST_SAL NUMBER
);
INSERT INTO job_grades VALUES('A',1000,2999);
INSERT INTO job_grades VALUES('B',3000,5999);
insert into job_grades values('C',6000,9999);
select * from job_grades;
--查询雇员的姓名。薪水和工资级别
SELECT e.last_name,e.salary,j.grade_level
FROM employees e
JOIN job_grades j
on (e.salary between j.lowest_sal and j.highest_sal);
自连接查询self join
--一种特殊的内连接:一张表连接到它自己进行查询。
--技巧:给同一张表分别取2个不同的别名,看做是两张表,然后进行连接
--查询雇员的姓名及其经理的名字
SELECT worker.last_name,manager.last_name
FROM employees worker
JOIN employees manager
on (worker.manager_id = manager.employee_id);
内连接
外连接 ----
--除了从两张表中返回所有满足连接条件的行之外,还从某张表中返回所有不满足连接条件的行。
--1)左外连接left join
--除了从两张表中返回所有满足连接条件的行之外,还从左表中返回所有不满足连接条件的行。
--左表:写在left join左边的表
--查询每个雇员的姓名、部门号和部门名称,要求没有部门的雇员也要显示
SELECT e.last_name,e.department_id,d.department_name
FROM employees e
left JOIN departments d
on (e.department_id = d.department_id);
--2)右外连接right join
--除了从两张表中返回所有满足连接条件的行之外,还从右表中返回所有不满足连接条件的行。
--右表:写在right join右边的表
--查询每个雇员的姓名、部门号和部门名称,要求没有雇员的部门也要显示
SELECT e.last_name,e.department_id,d.department_name
FROM employees e
right JOIN departments d
on (e.department_id = d.department_id);
--3)全外连接full join
--除了从两张表中返回所有满足连接条件的行之外,还从左表及右表中返回所有不满足连接条件的行。
--查询每个雇员的姓名、部门号和部门名称,要求没有部门的雇员、以及没有雇员的部门也要显示
SELECT e.last_name,e.department_id,d.department_name
FROM employees e
full JOIN departments d
on (e.department_id = d.department_id);
--实际中常用左外连接
交叉连接cross join
--又叫做笛卡尔积连接:如果连接查询没有连接条件,那么第一张表中的任何1行都可以和
--第二张表中的任何一行做连接,产生的结果集中的总行数等于两张表中总行数的乘积,
--叫做笛卡尔积。
--应该要避免产生笛卡尔积,特别是对大表。
--如果想专门生成笛卡尔积进行测试,可以使用cross join子句
SELECT *
FROM employees
cross join departments;
本文由 路远 首发于【路远网(http://www.luyuan.io)】未经允许不得以任何方式转载,违者必将追究法律责任。
- 我的微信
- 这是我的微信扫一扫
- 我的电报
- 这是我的电报扫一扫