4. SQL — 表的联合

1. 执行外部联合,左右联合

外部联合是表间的联合。


1. 联合两个表(交叉联合):
	两个表进行接合生成新的表.
	
	SELECT * FROM 
	TABLE1,
	TABLE2;
	
2. 将 PARTS 表与 ORDERS 表进行联合:

	SELECT 
	O.ORDEREDON,
	O.NAME,
    O.PARTNUM,
    P.PARTNUM,
    P.DESCRIPTION
	FROM 
	ORDERS O,
	PART P;
	
3. 外部右联合
	SELECT 
	P.PARTNUM,
	P.DESCRIPTION,
	P.PRICE,
 	O.NAME,
 	O.PARTNUM
  	FROM 
  	PART P
 	RIGHT OUTER JOIN ORDERS O 
 	ON 
 	ORDERS.PARTNUM = 54;
 	
分析:
这是一种新型的查询,
这里我们第一次使用了 
RIGHT OUTER JOIN,
它会令 SQL 返回右边表集内的全部记录,
如果当 ORDERS.PARTNUM<>54 则补以空值.


4. 左联合
	SELECT
	P.PARTNUM,
	P.DESCRIPTION, 
	P.PRICE,
	O.NAME,
	O.PARTNUM
	FROM 
	PART P
	LEFT OUTER JOIN 
	ORDERS O 
	ON
    ORDERS.PARTNUM = 54;
    
    
分析:
	使用的是左联合 PART 表决定返回的行数,
     而 PART 表比 ORDERS 表小,
     所以 SQL 把其余的行数都扔掉了.
     
	
2. 执行内部联合,左右联合

内部联合是指与各表内的行与本表内的数据相互进行联合,产生的结果行数取决于参加联合的行数,也就是说内部联合的行数取决于 WHERE 子句的结果。

SELECT 
P.PARTNUM,
P.DESCRIPTION,
P.PRICE,
O.NAME,
O.PARTNUM
FROM 
PART P
JOIN ORDERS O 
ON 
ORDERS.PARTNUM = 54;


3. 进行等值联合

SELECT 
O.ORDEREDON,
O.NAME,
O.PARTNUM,
P.PARTNUM,
P.DESCRIPTION
FROM 
ORDERS O,
PART P 
WHERE 
O.PARTNUM = P.PARTNUM;

分析:
	利用在两个表中都存在的 PARTNUM 列,
	我们得到了存储在 ORDERS 表中的的信息
	以及
	在 PARTS 中的
	与 ORDERS 相关的信息,
	它表明了你已经定出的零件数量,
    这种联合操作称为等值联合.
    因为它只显示第一个表中的数据以及第二个表中的
    存在于第一个表中的数值.
    
    
 SELECT
  O.ORDEREDON,
  O.NAME,
  O.PARTNUM,
  P.PARTNUM,
  P.DESCRIPTION
 FROM 
  ORDERS O,
  PARTP
 WHERE 
  O.PARTNUM = P.PARTNUM
 AND 
  O.PARTNUM = 76;
 
 eg:
 SELECT
 O.ORDEREDON,
 O.NAME,
 O.PARTNUM,
 P.PARTNUM,
 P.DESCRIPTION
FROM 
 ORDERS O,
 PART P
WHERE 
 O.PARTNUM = P.PARTNUM
AND 
 P.DESCRIPTION = 'ROAD BIKE';
 
 
 
 eg:
 SELECT 
 E.EMPLOYEE_ID, 
 E.LAST_NAME,
 EP.SALARY
 FROM 
 EMPLOYEE_TBL E,
 EMPLOYEE_PAY_TBL EP
 WHERE 
 E.EMPLOYEE_ID = EP.EMPLOYEE_ID
 AND 
 E.LAST_NAME = 'SMITH';
 
 技巧:
 如果你在联合表的时候没有使用 WHERE 子句,
 你执行的其实是笛卡尔联合;
 也就是笛卡尔叉积, 
 这种联合会对 FROM 中指出的表进行完全的组合,
 如果每个表有 200个记录,
 那么所得到的结果将会有 40000,
 200*200 
 所以除非你确实是想对表中的所有记录进行联合,
 否则一定不要忘记使用 WHERE 子句.
 
 
 找出卖 road bikes 共卖出多少钱:
 
 SELECT 
 SUM(O.QUANTITY * P.PRICE) TOTAL 
 FROM 
 ORDERS O, 
 PART P
 WHERE 
 O.PARTNUM = P.PARTNUM 
 AND
 P.DESCRIPTION = 'ROAD BIKE';

生成发票所要的信息:
SELECT 
C.NAME,
C.ADDRESS,
(O.QUANTITY * P.PRICE) TOTAL
FROM 
ORDER O,
PART P,
CUSTOMER C
WHERE 
O.PARTNUM = P.PARTNUM 
AND O.NAME = C.NAME;

else写法增加可读性:
SELECT 
C.NAME,
C.ADDRESS,
(O.QUANTITY * P.PRICE) TOTAL
FROM 
ORDERS O,
PART P,
CUSTOMER C
WHERE 
O.PARTNUM = P.PARTNUM
AND
O.NAME = C.NAME 
ORDER BY C.NAME;

注:
	注意当将三个表进行联合的时候
	(ORDERS,PART,CUSTOMER),
	ORDERS表被使用了两次,
    而其它的表只使用了一次,
    通常,
    根据给定的条件返回行数最少的表,
    会作为驱动表 —— 也就是基表,
    在查询中除基表以外的其它表,
    通常是向基表联合以便更有效地获得数据.
    所以, 
    在本例中 ORDERS 表是基表 
    在大多数的数据库中只有很少的几个基表
    直接或间接地与其它的所有表联合.
	
	
eg:
SELECT 
C.NAME,
C.ADDRESS,
(O.QUANTITY * P.PRICE) TOTAL ,
P.DESCRIPTION
FROM 
ORDERS O,
PART P,
CUSTOMER C
WHERE 
O.PARTNUM = P.PARTNUM
AND 
O.NAME = C.NAME
ORDER BY 
C.NAME;
	
	
4. 进行不等值联合

等值联合是在 WHERE 子句中使用等号,而不等值联合则是在 WHERE 子句中,使用除了等号以外的其它比较运算符。


SELECT 
O.NAME,
O.PARTNUM,
P.PARTNUM,
(O.QUANTITY * P.PRICE) TOTAL
FROM 
ORDERS O,
PART P,
WHERE 
O.PARTNUM > P.PARTNUM;


5. 表的自我联合

需求分析:
这种联合对于检查内部数据的一致性,
如果你的零件生产部门的某人犯了迷糊,
输入了一个已经存在的零件号时,
将会发生什么呢?
这对于每一个人来说都是一个坏消息,
发票会开错,
你的应用程序会崩溃,
会耗掉你许多宝贵的时光.

eg:
SELECT 
F.PARTNUM,
F.DESCRIPTION,
S.PARTNUM,
S.DESCRIPTION
FROM 
PART F,
PART S 
WHERE 
F.PARTNUM = S.PARTNUM
AND 
F.DESCRIPTION <> S.DESCRIPTION;

简炼SQL:
select 
orders.orderedon, 
orders.name, 
part.partnum,
part.price, 
part.description
from 
orders, 
part
where 
orders.partnum = part.partnum 
and 
orders.orderedon
between 
'1-SEP-96' 
and 
'30-SEP-96' 
order by part.partnum;


eg:
select 
orders.orderedon, 
orders.name, 
part.partnum,
part.price, 
part.description
from 
orders
left join on
part 
orders.partnum = part.partnum 
and 
orders.orderedon
between 
'1-SEP-96' 
and 
'30-SEP-96' 
order by part.partnum;



  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值