4. SQL — 表的联合
Posted 江湖@小小白
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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;
以上是关于4. SQL — 表的联合的主要内容,如果未能解决你的问题,请参考以下文章