SQL語句複習【專題四】

SQL語句複習【專題四】sql

多表查詢 sql 92
多表查詢 sql9二、sql99 標準
--查詢全部員工的姓名,部門編號,部門名稱
select * from emp
select * from dept
--笛卡爾集
select * from emp, dept
--消除笛卡爾集中的冗餘的數據
select *
from emp, dept
where emp.deptno=dept.deptno--表的鏈接查詢條件spa

等值鏈接查詢
--查詢全部員工的姓名,部門編號,部門名稱
注意:若是多個表間存在相同的字段的名稱,那麼必須指明顯示的字段屬於哪一張表。
select ename, emp.deptno,dname
from emp, dept
where emp.deptno=dept.deptno效率

給表起別名:注意:給表起別名不能使用 as 。一旦給表起了別名,那麼本來的表的名稱就不能再使用。
select ename, e.deptno,dname
from emp e, dept d
where e.deptno=d.deptnoselect

select ename, e.deptno,dname
from emp e, dept d
where e.deptno <> 10 and e.deptno=d.deptno語法

sql 92中,表的鏈接條件: 在where 中書寫 錶鏈接的條件。where 中既能夠寫行過濾,也要寫 錶鏈接。
--非等值鏈接
--查詢全部員工的姓名,職位,薪水,薪水等級 emp 和 salgrade 兩個表的多表查詢
select *
from emp e, salgrade s
--非等值鏈接
select e.ename, e.job, e.sal ,s.grade
from emp e, salgrade s
where e.sal >=s.losal and e.sal <= s.hisal
--儘可能將全部的顯式的字段,都使用表名引用 ,能夠提升訪問的效率。引用

自鏈接
--查詢 員工的編號,名字,員工的上級的編號,上級的名字
select * from emp
將一張表 看做兩張表。
--一張員工表 emp。想象成一張做爲領導的上級的表。
select e1.empno,e1.ename,e1.mgr,e2.ename
from emp e1, emp e2
where e1.mgr=e2.empno數據

外鏈接 【左右外鏈接】
左外鏈接
--查看不知足條件的記錄
--查詢 員工的編號,名字,員工的上級的編號,上級的名字,包含沒有上級的員工
select e1.empno,e1.ename,e1.mgr,e2.ename
from emp e1, emp e2
where e1.mgr=e2.empno(+)--左外鏈接,就是將左表的不知足條件的內容也顯示出來。查詢

右外鏈接
--查詢 員工的編號,名字,員工的上級的編號,上級的名字,包含沒有下級的員工的信息
select e1.empno,e1.ename,e1.mgr,e2.ename
from emp e1, emp e2
where e1.mgr(+)=e2.empno--右外鏈接,就是將右表的不知足條件的內容也顯示出來。join

--查詢部門的全部信息,以及每一個部門的平均工資,包含沒有員工的部門
select d.*,avg(sal)
from emp e, dept d
where e.deptno(+)=d.deptno--右外鏈接
group by d.deptno,d.dname,d.locoss

三表鏈接
--查詢20號部門的員工的編號,姓名,薪水,部門名稱,薪水等級。
select d.deptno, e.empno,e.ename,e.sal,d.dname,s.grade
from emp e, dept d, salgrade s
where d.deptno=20 and e.deptno=d.deptno and e.sal >=s.losal and e.sal<= s.hisal

n張表,至少須要幾個鏈接條件? 須要n-1 個鏈接條件

sql 92:鏈接條件和 行過濾條件都在where子句中 書寫。
sql 99:表的鏈接條件 和 行過濾條件分開了。where 只作行過濾。表的鏈接條件在其餘的地方進行。
--交叉鏈接 cross join 和笛卡爾集是同樣的
--sql92
select *
from emp e, dept d
--sql 99
select *
from emp e cross join dept d

--查詢全部員工的姓名,部門編號,部門名稱
--sql92
select e.ename,e.deptno,d.dname
from emp e, dept d
where e.deptno=d.deptno

天然鏈接 natural join 等值鏈接:
鏈接條件被隱式指定,自動使用兩個進行天然鏈接的表中的相同的字段進行等值鏈接。做爲鏈接條件的列,不能指定該列的表的限定。語法的要求。
優勢:不須要指明鏈接條件,條件是隱式指定的。
缺點:不能指定鏈接條件,若是多個表中有多個相同的字段,那麼會自動使用多個字段進行等值鏈接,不夠靈活。只能作等值鏈接。
select e.ename,deptno,d.dname
from emp e
natural join dept d

Using 子句:只能作等值鏈接。須要鏈接的表中存在相同的字段,能夠顯式指定多表之間的等值鏈接條件,能夠指定多個字段進行等值鏈接。
--sql 99
select e.ename,deptno,d.dname
from emp e
inner join dept d--內鏈接 inner 能夠省略
Using(deptno)

select e.ename,deptno,d.dname
from emp e
join dept d--內鏈接 inner 能夠省略
Using(deptno)

on 子句鏈接:既能夠等值鏈接也能夠不等值鏈接
--查詢30部分的員工的編號,姓名,部門名稱
--sql 92
select d.deptno, e.empno,e.ename,d.dname
from emp e, dept d
where d.deptno=30 and e.deptno=d.deptno
--sql 99
select d.deptno, e.empno,e.ename,d.dname
from emp e join dept d
on e.deptno=d.deptno---等值鏈接
where d.deptno=30

--查詢10部門員工的姓名,薪水等級---不等值鏈接
--sql 92
select e.deptno,e.ename, s.grade
from emp e, salgrade s
where e.deptno=10 and e.sal >= s.losal and e.sal <= s.hisal
--sql 99
select e.deptno,e.ename, s.grade
from emp e join salgrade s
on e.sal >= s.losal and e.sal<=s.hisal
where e.deptno=10

自鏈接
--查詢 員工的編號,名字,員工的上級的編號,上級的名字
--sql 92
select e1.empno,e1.ename,e1.mgr,e2.ename
from emp e1, emp e2
where e1.mgr=e2.empno
--sql99
select e1.empno,e1.ename,e1.mgr,e2.ename
from emp e1 join emp e2
on e1.mgr=e2.empno

外鏈接
1)左外鏈接 left [outer] join 左邊的表的不滿鏈接條件的信息所有顯式
2)右外鏈接 right [outer] join 右邊的表的不滿鏈接條件的信息所有顯式
3)全外鏈接 full [outer] join 左邊和右邊的表的不滿鏈接條件的信息所有顯式
--sql 99 左外 包含沒有上級的員工的信息
--sql 92
select e1.empno,e1.ename,e1.mgr,e2.ename
from emp e1,emp e2
where e1.mgr=e2.empno(+)
--sql99
select e1.empno,e1.ename,e1.mgr,e2.ename
from emp e1 left outer join emp e2
on e1.mgr=e2.empno

--sql 99 右外 包含沒有下級的員工的信息
--sql 92
select e1.empno,e1.ename,e1.mgr,e2.ename
from emp e1, emp e2
where e1.mgr(+)=e2.empno
--sql 99
select e1.empno,e1.ename,e1.mgr,e2.ename
from emp e1 right join emp e2
on e1.mgr=e2.empno

--sql 99 全外 包含沒有上下級的員工的信息
--sql99
select e1.empno,e1.ename,e1.mgr,e2.ename
from emp e1 full join emp e2
on e1.mgr=e2.empno

--sql 99 查詢部門的全部信息,以及每一個部門的平均工資,包含沒有員工的部門
--sql 92
select d.*,avg(sal)
from emp e, dept d
where e.deptno(+)=d.deptno
group by d.deptno,d.dname,d.loc
--sql99
select d.*,avg(sal)
from emp e right outer join dept d
on e.deptno=d.deptno
group by d.deptno,d.dname,d.loc

--查詢20號部門的員工的編號、姓名、薪水、部門名稱,薪水等級
--三表
--sql 92
select d.deptno ,e.empno,e.ename,e.sal,d.dname,s.grade
from emp e, dept d, salgrade s
where d.deptno=20 and e.deptno=d.deptno and e.sal >= s.losal and e.sal<=s.hisal

--sql 99 natural join 隱式鏈接的字段不能添加表的限定
select deptno,e.empno,e.ename,e.sal,d.dname,s.grade
from emp e natural join dept d join salgrade s
on e.sal>=s.losal and e.sal<=s.hisal
where deptno=20

--sql 99 Using + on Using 等值鏈接的字段,不要指定表的限定
select deptno,e.empno,e.ename,e.sal,d.dname,s.grade
from emp e join dept d
Using(deptno)
join salgrade s
on e.sal>=s.losal and e.sal<=s.hisal
where deptno=20

--sql 99 on on 中的等值鏈接部分,若是顯式等值鏈接的字段,須要對字段指定屬於哪個表。
select d.deptno,e.empno,e.ename,e.sal,d.dname,s.grade
from emp e join dept d
on e.deptno=d.deptno
join salgrade s
on e.sal>=s.losal and e.sal<=s.hisal
where d.deptno=20

相關文章
相關標籤/搜索