oracle資料庫三
rowid
? 資料庫中,每一張表的每一行資料,都擁有一個獨一無二的rowid,默認情況下,rowid是不顯示的,必須在select之后添加rowid才可以查詢到
? rowid作用:應用于后面所學的索引,資料去重,
select rowid,e.* from emp e;
# emp表的別名為e,e.*為emp表的所有欄位
? oralce去重的方法
# 使用 distinct 去重
select distinct id, name from jerk order by id;
# 使用 group by 分組去重
select id, name from jerk group by id, name;
# 使用 rowid 去重
# 基于 id 或者 name 對資料斤西瓜分組,是重復的資料被劃分在同一個陣列中,這些重復的資料,id 和 name 都相同,但是 rowid 一定不同,所以只需要從每一組中提取一個 rowid ,再利用子查詢將這些 rowid 隊形的資訊查出即可
select * from jerk where rowid in
(select max(rowid) from jerk group by id);
# rowid 可以用于重復資料的洗掉,先分組去重取每組最大的 rowid 然后洗掉剩下的資料
delete from jerk where rowid not in
(select max(rowid) form jerk group by id);
rownum 偽列
? rownum 是表中每一行資料所對應的行號
select rownum, e.* from emp e;
# 查詢emp表的前十行資料
select * form emp where rownum < 11;
# rownum 不同于一般的欄位,再遍歷表進行比對的程序中,只要有一次條件不符合,就會停止比對
# 可以使用子查詢的特性,使用 rownum 的特性,規避他的弊端
# 把rownum的查詢變成一個子查詢的陳述句,rownum 使用別名r,對外部查詢而言,r就是一個普通欄位,只不過具備了 rownum 的屬性
select * from
(select rownum r,e.* from emp e)
where r < 11 and r > 5;
# 查詢公司工資前十高的員工資訊
select * from
(select * from emp order by sal desc)
where rownum < 11;
# 查詢公司工資第六到第十高的與員工資訊
select * from
(select rownum r,a.* from
(select * from emp order by sal des) a)
where r > 5 and r < 11;
# 基于 rownum 查詢,一般也稱為分頁查詢
多表關聯查詢
笛卡爾積
? 數學中的笛卡爾積是將兩個集合中所有元素的匹配可能性
? A={a,b,c} B={1,2,3}
? A*B = {(a,1),(a,2),(a,3),(b,1),(b,2),(b,3),(c,1),(c,2),(c,3)}
# 對兩張表做笛卡爾積(以 emp 和 dept 舉例)
# 兩張表做笛卡爾積的前提:兩張表必須有關聯的欄位
# 直接笛卡爾積(會出現冗余資料)
select * from emp, dept;
# 在多表查詢中,每一個表都必須定義別名
# 如果做了笛卡爾積,select 之后的所有欄位必須通過別名來宣告這個欄位屬于哪一張表
# 通過篩選去除冗余資料
select * from emp e, dept d where e.deptno = d.deptno;
# 三張表做笛卡爾積,先將前兩張表做笛卡爾積,將結果于第三張表再做笛卡爾積即可
# 直接笛卡爾積的寫法,也叫92sql范式,這種寫法存在弊端
# join連接查詢寫法,也叫97sql范式
# 兩種sql范式的區別在于書寫的區別和性能差異
# join連接查詢
select * from emp e join dept d on e.deptno = d.deptno;
# join查詢的特點,等值連接寫在on之后,而不是where之后
# 97sql范式它提供了五種連接查詢的方式,每一種的使用是不一樣的
# 實體使用emp1和dept1表
# emp1中有部門50,dept1表中沒有
# dept1中有部門40,emp1表中沒有
# 1. cross join 直接笛卡爾積,不可以使用on,只能使用where
# 部門編號為40,50的資訊都沒有出現
# cross join 如果使用的是等值連接,沒有匹配資料的表記錄會被剔除掉
select * from emp1 e cross join dept1 d where e.deptno = d.deptno;
# 2. inner join 內連接,一般來講inner 可以省略
# 部門編號為40,50的資訊都沒有出現
# 同樣不會顯示沒有匹配的表記錄
select * from emp1 e inner join dept1 d on e.deptno = d.deptno;
# 3. left join 左連接
# 部門編號為40的資訊沒有出現
# 會以左表的資訊為主,強制顯示左表中沒有匹配的資訊
select * from emp1 e left join dept1 d on e.deptno = d.deptno;
# 4. right join 右連接
# 部門編號為50的資訊沒有出現
# 會以右表的資訊為主,強制顯示右表中沒有匹配的資訊
select * from emp1 e right join dept1 d on e.deptno = d.deptno;
# 5. full outer join 滿外連接
# 部門編號全部顯示
# 強制顯示所有的資訊,不管有沒有匹配
select * from emp1 e full outer join dept1 d on e.deptno = d.deptno;
# 一般使用較多的是 inner join 和 left join
? 如果sql查詢的欄位來自于同一張表,盡可能使用子查詢(子查詢不會產生笛卡爾積)
? 如果sql查詢的欄位來自于多張表,就無法使用子查詢,優先使用連接查詢
直接笛卡爾積的寫法:先做笛卡爾積,然后再篩選(產生大量的笛卡爾積)
連接查詢:先做篩選,再做笛卡爾積(產生笛卡爾積的數量會大大減少)
自連接和非等值連接
# 自連接的本質依舊是笛卡爾積
# 使用不同的別名即可實作自連接
select wc1.fname,wc2.fname from worldcup wc1
join worldcup wc2 on wc1.fid!=wc2.fid;
建立復制表
? 指揮復制表的結構和資料,不會復制約束和所有的鍵
create table emp1 as select * from emp;
create table dept1 as select * from dept;
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/548666.html
標籤:Oracle
