oracle中多表连接问题

  • A+
所属分类:技术

chatGPT账号

不等连接

不等连接:连接条件不使用等号操作符的连接。很少见。

--创建工资级别表

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)】未经允许不得以任何方式转载,违者必将追究法律责任。

  • 我的微信
  • 这是我的微信扫一扫
  • weinxin
  • 我的电报
  • 这是我的电报扫一扫
  • weinxin
chatGPT账号
路远

发表评论

您必须登录才能发表评论!