Join操作3大类:外连接、自然连接、内连接

Join操作基本分为3大类:外连接(细分为:左连接、右连接、全连接)、自然连接、内连接
Join操作的共性:第一步均为将所有参与操作的表进行了一个笛卡儿积,然后才依据各连接
条件进行记录的筛选
SQL> select * from employees;
NAME DEPARTMENT_ID SALARY
Getz 10 3000
Davis 20 1500
King 20 2200
Davis 30 5000
Kochhar 5000
SQL> select * from departments;
DEPARTMENT_ID DEPARTMENT_NAME
10 Sales
20 Marketing
30 Accounts
40 Administration
--------------------------------------------------Left outer join--------------------------------------------------
SQL> select * from employees e left outer join departments d on e.department_id=d.department_id;

附加:Oracle9i以前版本中左连接的写法如下:
SQL> select * from employees e ,departments d on e.department_id=d.department_id(+);
-------------------------------------------------Right outer join-------------------------------------------------
SQL> select * from employees right outer join departments using(department_id);

附加:Oracle9i以前版本中左连接的写法如下:
SQL> select * from employees e ,departments d where e.department_id(+)=d.department_id;
--------------------------------------------------Full join--------------------------------------------------
SQL> select * from employees full join departments using(department_id);

说明:[1]外连接必须使用on或using子句提供相应的连接条件
[2]不能为using子句中所列举的列指定表别名,即使在group by和select子句中也是如此
[3]外连接规则:左连右补,右连左补,全连左右合并
如:对表departments表进行右连接时,在两表完成笛卡儿积后再依据连接条件 using(department_id)来筛选两表中department_id值相同的记录,但对DEPARTMENT_ID=40
employees表中没有与之匹配的记录,按常理此DEPARTMENT_ID=40所对应的记录将被抛
弃,但就是为了保全连接表(departments表)中的所有记录就必须在employees表中虚拟出
一条与之匹配的记录来保全连接表的所有记录,当然这条虚拟的记录显示时值全为null

--------------------------------------------------Natural join--------------------------------------------------
SQL> select * from employees natural join departments;

说明:自然连接是通过对参与表关系中所有同名的属性对取等(即相等比较)来完成的,故无须自己添加连接条件
与外连接的区别在于对于无法匹配的记录外连接会虚拟一条与之匹配的记录来保全连接表中的所有记录,但自然连接不会
--------------------------------------------------Inner join--------------------------------------------------
SQL> select * from employees inner join departments using(department_id);

说明:内连接与自然连接基本相同,不同之处在于自然连接只能是同名属性的等值连接,而内连接可以使用using或on子句来指定连接条件

用到的sql语句
--
-- 表的结构 `departments`
--
CREATE TABLE IF NOT EXISTS `departments` (
`department_id` int(3) NOT NULL,
`department_name` char(50) NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
--
-- 转存表中的数据 `departments`
--
INSERT INTO `departments` (`department_id`, `department_name`) VALUES
(10, 'Sales'),
(20, 'Marketing'),
(30, 'Accounts'),
(40, 'administration');
-- --------------------------------------------------------
--
-- 表的结构 `employees`
--
CREATE TABLE IF NOT EXISTS `employees` (
`name` char(20) NOT NULL,
`department_id` int(3) DEFAULT NULL,
`salary` int(5) NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
--
-- 转存表中的数据 `employees`
--
INSERT INTO `employees` (`name`, `department_id`, `salary`) VALUES
('Getz', 10, 3000),
('Davis', 20, 1500),
('King', 20, 2200),
('Davis', 30, 5000),
('Kochhar', NULL, 5000);


转自:http://note.sdo.com/u/469675807/n/r-GYv~jmPr80LX00k004-q
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值