數據庫 ----連表查詢篇

數據庫 ----連表查詢篇

一、rowid 和 rownum

​ ROWID 是 ORACLE 中的一個重要的概念。用於定位數據庫中一條記錄的一個相對唯一地址值。通常情況下,該值在該行數據插入到數據庫表時即被確定且唯一。ROWID 它是一個僞列,它並不實際存在於表中。它是 ORACLE 在讀取表中數據行時,根據每一行數據的物理地址信息編碼而成的一個僞列。所以根據一行數據的 ROWID 能找到一行數據的物理地址信息。從而快速地定位到數據行。數據庫的大多數操作都是通過 ROWID 來完成的,而且使用 ROWID 來進行單記錄定位速度是最快的。我們可以將其用於刪除重複數據。
​ ROWNUM 是一種僞列,它會根據返回記錄生成一個序列化的數字。排序後的結果集的順序號 ,每一個結果集 都有自己順序號 ,不能直接查詢大於 1 的數。利用ROWNUM,我們可以生產一些原先難以實現的結果輸出。 例如實現分頁操作。
​ ps: oracle 中 索引從 1 開始,java 程序 從 0 開始
1、rowid
​ 實現重複記錄的刪除

源碼:

insert into tb_student values(1,‘張三’,‘語文’,81);
insert into tb_student values(2,‘張三’,‘數學’,75);
insert into tb_student values(3,‘李四’,‘語文’,86);
insert into tb_student values(4,‘李四’,‘數學’,90);
insert into tb_student values(5,‘王五’,‘語文’,81);
insert into tb_student values(6,‘王五’,‘數學’,100);
insert into tb_student values(7,‘王五’,‘英語’,90);
commit;
select * from tb_student;

–1.根據名字,課程,分數分組
select name,course,score from tb_student group by name,course,score;

–2.找到每個數據唯一的一條
–因爲rowid是唯一的,所以找到rowid就可以了,但是找到的數據是經過去重的,是組函數,所以不能直接用rowid
select name,course,score,min(rowid) from tb_student group by name,course,score;
–3.找到要刪除的重複的數據
select rowid
from tb_student
where not rowid in
​ (select min(rowid) from tb_student group by name, course, score);
–4. 最終 刪除重複的數據
delete from tb_student where not rowid in
​ (select min(rowid) from tb_student group by name, course, score);

圖片:
在這裏插入圖片描述

2、rownum
​ rownum :1、必須排序 2、不能直接取大於 1 的數

源代碼:

–rownum 結果集的序號,在同一個結果集中rownum不重複
–rownum與order by的順序:如果根據主鍵排序,先排序再確定rownum,如果根據非主鍵排序,先確定rownum再排序
select deptno ,dname ,rownum from dept;
select deptno ,dname, rownum from dept order by deptno desc;

select empno,ename,rownum from emp;
–確定結果集就能確定rownum —先確定rownum,然後再order by
select empno,ename,rownum from emp order by deptno;

–分頁查詢
–一頁顯示的數據量num 當前的頁碼 n
– num=3 n=1
select * from emp where rownum<=3;
– num=3 n=2
select * from emp where rownum>3 and rownum<=6;

–分頁的公式: 起始數據的rownum>(n-1)num 結束數據的rownum<=nnum
select ename,empno,sal,deptno,rownum from emp; --結果集中能夠確定不變的rownum
select *
from (select ename, empno, sal, deptno, rownum r from emp)
where r > 3
and r <= 6;

–根據工資降序查詢分頁顯示 第三頁的數據,每頁顯示2條數據
select ename, empno, sal, deptno, rownum r from emp order by sal desc;
select ename, empno, sal, deptno, rownum from (select * from emp order by sal desc);
select *
from (select ename, empno, sal, deptno, rownum r
​ from (select * from emp order by sal desc))
where r > (3 - 1) * 2
and r <= 3 * 2;

圖片:
在這裏插入圖片描述

二、表連接(92)

​ 當我們獲取的數據不是來自於同一張表而是來自於多張表時就需要使用到表連接
select * from emp;
select * from dept;
注意:同名列 非 必須區分*
數據源 、關係列、 過濾條件、字段

1、笛卡爾積

–非 必須區分 使用表名 或別名.區分*
select * from emp , dept;
select ename , dname from emp , dept;
select ename, dname, e.deptno from emp e, dept d;

2、等值連接(在笛卡爾積基礎上 取條件列相同的值)

在這裏插入圖片描述

–如果存在相同名字的字段,在使用時要指定表名

3、非等值連接 > < != <>between and

源碼:
–除了20部門以外的每個員工的員工信息和他所在的部門信息
select * from emp e,dept d where e.deptno !=20 and e.deptno = d.deptno;

–查詢用戶的信息以及工資等級
–數據:基本信息* grade
–來源: emp salgrade
–條件: sal>=losal and sal<=hisal

select * from emp e,salgrade s where e.sal>=s.losal and e.sal<=s.hisal;
select * from emp e,salgrade s where e.sal between s.losal and s.hisal;

圖片:

在這裏插入圖片描述

4、自連接: 特殊的等值連接 (來自於同一張表)

–找出 存在上級的員工姓名 及上級名稱
– 數據來源: emp e, emp m
– 字段: e.ename, m.ename
– 條件: e.mgr=m.empno

​ select e.ename,m.ename from emp e,emp m where e.mgr=m.empno;

在這裏插入圖片描述

5、外連接

–查詢有上級的員工的信息和上級信息

–主表:沒有+的表爲主表
–主表:主表中的所有數據全部出現,無論是否滿足條件
​ select * from emp e1,emp e2 where e1.mgr(+)=e2.empno; --右外連接
​ select * from emp e2,emp e1 where e1.mgr(+)=e2.empno; --左外連接

–外鏈接 看+和, 主表在,的左邊就叫左外連接 主表在,的右邊叫右連接
在這裏插入圖片描述

三、99 連接

1.交叉連接 cross join —>笛卡爾積
2.自然連接(主外鍵、同名列) natural join -->等值連接
3.join using連接(同名列) -->等值連接
4.[inner]join on 連接 -->等值連接 非等值 自連接 (解決一切) 關係列必須區分
5.left|right [outer] join on|using -->外連接
6.full join on|using -->全連接 滿足直接匹配,不滿足 相互補充null ,確保 所有表的記錄 都至少出現一次

1、交叉連接

​ select * from emp cross join dept;

2、自然連接

​ select * from emp natural join dept;
*–在指定列過程中同名列歸共同所有(除外)
​ select deptno,e.ename,d.dname from emp e natural join dept d;

3、using 連接

​ select deptno,e.ename,d.dname from emp e join dept d
using(deptno);

4、on 連接

– natrual 等值
​ select ename, dname from emp natural join dept
where deptno = 30;
–using
​ select ename, dname from emp join dept using (deptno) where deptno =30;
–on
​ select ename, dname from emp
join dept on emp.deptno = dept.deptno
where emp.deptno = 30;
on 非等值連接 、自連接
–部門編號爲30的員工名稱 工資等級
​ select ename, grade from emp e
join salgrade s on e.sal between s.losal and s.hisal
where deptno=30;
–部門編號爲30的員工名稱 上級名稱
​ select e.ename,m.ename mname from emp e join emp m
on e.mgr =m.empno where e.deptno =30;
–部門編號爲30的員工 員工名稱 部門名稱 工資等級 上級名稱
​ select e.ename, dname, grade, m.ename mname
from emp e
join dept d on e.deptno = d.deptno
join salgrade s on e.sal between s.losal and s.hisal
join emp m on e.mgr = m.empno
where e.deptno = 30;

5、外連接

–所有部門的 部門名稱,員工數
–左外
​ select dname, n from dept d
left outer join (select deptno, count(1) n from emp group by
deptno) i
on d.deptno = i.deptno;
select dname, n
from dept d
left outer join (select deptno, count(1) n from emp group by
deptno) i
using (deptno);
–右外
select dname, n
from (select deptno, count(1) n from emp group by deptno) i
right outer join dept d
on d.deptno = i.deptno;

6、全連接

​ select *
from (select 1 no, ‘a’ “name”
from dual
union
select 2 no, ‘b’ “name” from dual) a
full join (select 1 no, ‘c’ “name”
from dual
union
select 3 no, ‘d’ “name” from dual) b
on a.no=b.no;
select *
from (select 1 no, ‘a’ “name”
from dual
union
select 2 no, ‘b’ “name” from dual) a
full join (select 1 no, ‘c’ “name”
from dual
union
select 3 no, ‘d’ “name” from dual) b
using(no);

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章