扒扒数据库长长知识(下载资源组合看)之 06 (多表查询)

本文深入讲解了SQL中的连接技巧,包括等值连接、不等值连接、外连接及自连接等,通过具体实例展示了如何使用这些连接技巧来解决实际问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >



select ...
from table1, table2
where ....
order by ....
group by ....
having ...










笛卡尔积基本原理
两个表如果笛卡尔积运算
1 行数 两个表相乘
2 列数  两个表相加..




 1  select count(e.EMPNO)
 2      from  emp e, dept d
 3*     where e.deptno = d.deptno
SQL> /

COUNT(E.EMPNO)
--------------
           14

SQL> ed
已写入 file afiedt.buf

 1  select count(e.EMPNO)
 2*     from  emp e, dept d
 3  /

COUNT(E.EMPNO)
--------------
           56


 








等值连接
eg:查询员工信息,员工号,姓名,月薪,部门名称


  select e.empno, e.ename, e.sal, d.dname
  from emp e, dept d
  where e.deptno = d.deptno

 
 
     EMPNO ENAME             SAL DNAME
---------- ---------- ---------- --------------
      7369 SMITH             800 RESEARCH
      7499 ALLEN            1600 SALES
      7521 WARD             1250 SALES
      7566 JONES            2975 RESEARCH
      7654 MARTIN           1250 SALES
      7698 BLAKE            2850 SALES
      7782 CLARK            2450 ACCOUNTING
      7788 SCOTT            3000 RESEARCH
      7839 KING             5000 ACCOUNTING
      7844 TURNER           1500 SALES
      7876 ADAMS            1100 RESEARCH
      7900 JAMES             950 SALES
      7902 FORD             3000 RESEARCH
      7934 MILLER           1300 ACCOUNTING






不等值连接

eg:查询员工信息,员工号,姓名,月薪, 薪水级别
select e.empno, e.ename, e.sal, s.grade
from emp e, salgrade s
where e.sal>=s.losal and e.sal<=s.hisal

 1  select e.empno, e.ename, e.sal, s.grade
 2     from emp e, salgrade s
 3*    where e.sal>=s.losal and e.sal<=s.hisal
SQL> /

    EMPNO ENAME             SAL      GRADE
---------- ---------- ---------- ----------
     7369 SMITH             800          1
     7900 JAMES             950          1
     7876 ADAMS            1100          1
     7521 WARD             1250          2
     7654 MARTIN           1250          2
     7934 MILLER           1300          2
     7844 TURNER           1500          3
     7499 ALLEN            1600          3
     7782 CLARK            2450          4
     7698 BLAKE            2850          4
     7566 JONES            2975          4
     7788 SCOTT            3000          4
     7902 FORD             3000          4
     7839 KING             5000          5


外连接


eg:按部门统计员工人数: 部门号 部门名称 各部门人数
---思路1:  求各个部门的人数...要把各个部门数据划分开.....要分组.....
2:各部门人数 员工表 
=====>因为 部门人数 是由员工表确定的...所以还要检索员工表...
所以需要多表查询



select d.deptno, d.dname, count(e.empno)
from dept d, emp e
where d.deptno = e.deptno (+)
group by d.deptno,  d.dname




   DEPTNO DNAME          COUNT(E.EMPNO)
---------- -------------- --------------
       10 ACCOUNTING                  3
       20 RESEARCH                    5
       30 SALES                       6


---我们的期望 想把40号部门给统计出来...
----40号部门没有被统计出来的原因: 员工表中没有40号部门的员工...d.deptno = e.deptno (d.40 = e.40)
------本质:等值条件不满足...
========>外连接技术出现的原因
+左外连接: +号在..=号的右边,左外连接....
+右外连接: +号在..=号的左边,左外连接....
我想把部门表的所有列都显示出来, 就需要找到部门表..在对方写(+)




 1  select d.deptno, d.dname, count(e.empno)
 2                     from dept d, emp e
 3                     where d.deptno = e.deptno(+)
 4*                    group by d.deptno,  d.dname
SQL> /

   DEPTNO DNAME          COUNT(E.EMPNO)
---------- -------------- --------------
       10 ACCOUNTING                  3
       40 OPERATIONS                  0
       20 RESEARCH                    5
       30 SALES                       6








自连接 
-- 查询员工信息 ,老板信息
显示:   ****的老板是****

---思路1: 员工信息 查员工表
查老板信息,还要查员工表...

---思路2 员工表的老板 是  老板表的员工

select e.ename, b.ename
from emp e, emp b
where e.mgr = b.empno



select e.ename || '的老板是' || b.ename
from emp e, emp b
where e.mgr = b.empno (+)



E.ENAME||'的老板是'||B.ENAME
----------------------------
SMITH的老板是FORD
ALLEN的老板是BLAKE
WARD的老板是BLAKE
JONES的老板是KING
MARTIN的老板是BLAKE
BLAKE的老板是KING
CLARK的老板是KING
SCOTT的老板是JONES
KING的老板是
TURNER的老板是BLAKE
ADAMS的老板是SCOTT
JAMES的老板是BLAKE
FORD的老板是JONES
MILLER的老板是CLARK

已选择14行。


select e.ename || '的老板是' || nvl (b.ename, '他自己')
from emp e, emp b
where e.mgr = b.empno (+)


E.ENAME||'的老板是'||NVL(B.E
----------------------------
SMITH的老板是FORD
ALLEN的老板是BLAKE
WARD的老板是BLAKE
JONES的老板是KING
MARTIN的老板是BLAKE
BLAKE的老板是KING
CLARK的老板是KING
SCOTT的老板是JONES
KING的老板是他自己
TURNER的老板是BLAKE
ADAMS的老板是SCOTT
JAMES的老板是BLAKE
FORD的老板是JONES
MILLER的老板是CLARK

已选择14行。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值