《SQL经典实例》——读书笔记三

第三章:多表查询

3.1 叠加两个行集

你想返回保存在多个表中的数据,理论上需要将一个结果集叠加在另一个之上。这些表可
以没有相同的键,但它们的列的数据类型必须相同。例如,你想显示 EMP 表里部门编号为10 的员工的名字和部门编号,以及 DEPT 表中各个部门的名称和编号。

SELECT ename as ENAME_AND_DNAME,deptno
FROM emp
WHERE deptno=10
UNION ALL
SELECT '-----------',NULL
UNION ALL
SELECT dname,deptno
FROM dept

使用集合运算 UNION ALL 合并多个表中的行,UNION ALL 将多个表中的行并入一个结果集。对于所有的集合运算来说,SELECT 列表里的所有项目必须保持数目相同,且数据类型匹配。尤其需要注意的是,如果有重复项,UNION ALL 也将一并纳入。如果你希望过滤掉重复项,
可以使用 UNION 运算符。

3.2 合并相关行

你想根据一个共同的列或者具有相同值的列做连接查询,并返回多个表中的行。例如,你
想显示部门编号为 10 的全部员工的名字及其部门所在地,但这些数据分别存储在两个表
里。

SELECT e.ename,d.loc
FROM emp as e,dept as d
WHERE e.deptno=d.DEPTNO
AND e.deptno =10

它是内连接中的相等连接。连接查询是一种把来自两个表的行合并起来的操作。对于相等连接而言,其连接条件依赖于某
个相等条件
另一种写法是利用显式的 JOIN 子句(INNER 关键字是可选项)。

SELECT e.ename,d.loc
FROM emp as e INNER JOIN dept as d 
 ON e.deptno=d.DEPTNO
WHERE e.deptno=10

3.3 查找两个表中相同的行

你想找出两个表中相同的行,但需要连接多列。例如,考虑如下所示的视图 V。

create view V
as
select ename,job,sal
 from emp
 where job = 'CLERK'
select * from V
ENAME JOB SAL
---------- --------- ----------
SMITH CLERK 800
ADAMS CLERK 1100
JAMES CLERK 950
MILLER CLERK 1300

视图 V 只包含职位是 CLERK 的员工,但并没有显示 EMP 表中所有可能的列。你想从 EMP 表获取与视图 V 相匹配的全部员工的 EMPNO、ENAME、JOB、SAL 和 DEPTNO。

select e.empno,e.ename,e.job,e.sal,e.deptno
from emp as e,V
where e.ename=V.ename
AND e.job=V.job
AND e.sal=V.sal

除此之外,也可以使用 JOIN 子句执行同样的连接查询。

select e.empno,e.ename,e.job,e.sal,e.deptno
from emp as e inner join V
on (
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值