首页 > 数据库 > Oracle > 实例解析外连接 内连接 自连接 全连接
1. 首先看两个测试表的结构
1)HR@ENMOEDU> desc employees #表1
Name Null? Type
----------------------------------------- -------- ----------------------------
EMPLOYEE_ID NOT NULL NUMBER(6)
FIRST_NAME VARCHAR2(20)
LAST_NAME NOT NULL VARCHAR2(25)
EMAIL NOT NULL VARCHAR2(25)
PHONE_NUMBER VARCHAR2(20)
HIRE_DATE NOT NULL DATE
JOB_ID NOT NULL VARCHAR2(10)
SALARY NUMBER(8,2)
COMMISSION_PCT NUMBER(2,2)
MANAGER_ID NUMBER(6)
DEPARTMENT_ID NUMBER(4)
2)HR@ENMOEDU> desc departments #表2
Name Null? Type
----------------------------------------- -------- ----------------------------
DEPARTMENT_ID NOT NULL NUMBER(4)
DEPARTMENT_NAME NOT NULL VARCHAR2(30)
MANAGER_ID NUMBER(6)
LOCATION_ID NUMBER(4)
1利用上面两个表做连接 连接条件是 DEPARTMENT_ID 可以这样理解连接 你想在一个结果中同时显示EMPLOYEE_ID,LAST_NAME,DEPARTMENT_NAME 你会发现 上面两个表都不同时存在上述三个字段,这时你只有做连接了
1)内连接:如图所示
如果你想得到这样的结果:显示员工姓名,员工编号,部门名字 表1的DEPARTMENT_ID等于表2的DEPARTMENT_ID等于n ,则输出DEPARTMENT_ID=n对应的EMPLOYEE_ID,LAST_NAME,DEPARTMENT_NAME。否则不返回结果。这时候你就用内连接, 格式为:表1 join 表2 on 表1.DEPARTMENT_ID=表2.DEPARTMENT_ID
所以应该这样来完成任务:HR@ENMOEDU> select a.employee_id,a.last_name,b.department_name from employees a join departments b on a.department_id=b.department_id;
EMPLOYEE_ID LAST_NAME DEPARTMENT_NAME
----------- ------------------------- ------------------------------
200 Whalen Administration
201 Hartstein Marketing
202 Fay Marketing
114 Raphaely Purchasing
119 Colmenares Purchasing
115 Khoo Purchasing
116 Baida Purchasing
117 Tobias Purchasing
2)外连接:如图
如果你想要得到 所有的 表1中的 员工姓名,员工编号 连接条件还是department_id ,就算是条件不符合 也要把表1中的想显示的数据也显示出来 这样你就应该用外连接,若表2中没有符合条件的则补空 你就应该用外连接,(一个都不能少)
左外连接:A left join B 右外连接:A right join B 可以这样 记忆 左外连接中写在左边的表是那个内容多的(也就是A表一个都不能少的) 右外连接中写在右边的表内容多(也就是B表一个都不能少) 这样你就会发现 A left join B 结果就等于 B right join A
看例子:左连接 表a内容多 b 有补空
HR@ENMOEDU> select a.employee_id,a.last_name,b.department_name from employees a left join departments b on a.department_id=b.department_id;
EMPLOYEE_ID LAST_NAME DEPARTMENT_NAME
----------- ------------------------- ------------------------------
112 Urman Finance
111 Sciarra Finance
110 Chen Finance
109 Faviet Finance
108 Greenberg Finance
206 Gietz Accounting
205 Higgins Accounting
178 Grant
右连接:HR@ENMOEDU> select a.employee_id,a.last_name,b.department_name from employees a right join departments b on a.department_id=b.department_id;
EMPLOYEE_ID LAST_NAME DEPARTMENT_NAME
----------- ------------------------- ------------------------------
108 Greenberg Finance
111 Sciarra Finance
112 Urman Finance
113 Popp Finance
109 Faviet Finance
206 Gietz Accounting
205 Higgins Accounting
Treasury
Corporate Tax
Control And Credit
Shareholder Services
全外连接:就是俩表都一个也不能少
HR@ENMOEDU> select a.employee_id,a.last_name,b.department_name from employees a full join departments b on a.department_id=b.department_id;
EMPLOYEE_ID LAST_NAME DEPARTMENT_NAME
----------- ------------------------- ------------------------------
168 Ozer Sales
169 Bloom Sales
170 Fox Sales
171 Smith Sales
172 Bates Sales
173 Kumar Sales
174 Abel Sales
175 Hutton Sales
176 Taylor Sales
177 Livingston Sales
178 Grant #右补空
190 Gates Shipping
191 Perkins Shipping
192 Bell Shipping
193 Everett Shipping
194 McCain Shipping
195 Jones Shipping
196 Walsh Shipping
197 Feeney Shipping
NOC #坐补空
Manufacturing
Government Sales
3)自连接:其实是内连接的一种特殊情况,只不过要连接的俩个表 是同一个表,比如说 你要得到比其经理来的早的员工的标号。那就只能用自连接了
思路 把一个employees 表看成员工表a 再把另一个 employees 表看成经理表b 连接条件是员工表的经理编号=经理表员工编号 具体看下边:
HR@ENMOEDU> select a.EMPLOYEE_ID from employees a join employees b on a.MANAGER_ID=b.EMPLOYEE_ID where a.hire_date
EMPLOYEE_ID
-----------
122
114
102
108
205
204
203
200
105
109
185
总结:仔细思考一下 发现能用子查询得到的结果,都可以用连接来做,但反过来就不一定了,例如自连接中的例子,你要想用子查询 那就复杂了 本人暂时没办法用子查询得到结果。
来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/29654823/viewspace-1244016/ ,如需转载,请注明出处,否则将追究法律责任。