1. 程式人生 > 實用技巧 >Oracle 學習筆記(二)

Oracle 學習筆記(二)

Oracle 學習筆記

Day_2

  • 多表查詢

已有表

已有的表格:

select * from bonus;

/*
多表查詢:
笛卡爾積:實際上是兩張表的乘積
*/
 
select * from emp,dept;

select * from emp e1,dept e2 where e1.deptno == d1.deptno;

--查詢員工編號,員工姓名,經理的編號,經理的姓名
 select * from em 
 
--查詢員工編號,員工姓名,員工的部門名稱,經理的編號,經理的姓名
select e1.empno,e1.ename, d1.dname , e1.mgr , m1.ename 
 from emp e1,emp m1,dept d1 where e1.mgr= m1.empno and e1.deptno = d1. deptno;

 /*
 內聯接:
險式內聯接:
等值內聯接:where e1.deptno = d?. deptno ;不等值內聯接:where ei.deptno <>di.deptno;自聯接:自己連線自己
內聯接:
select *from表iinner join 表2 in 連線條件I


外連線:
左外連線 ;left outer join 左表的所有記錄,如果所有記錄沒有表記錄, 就顯示為空。

右外連線“: right outer join 

outer 關鍵字可以忽略

Oracle的外連線(+): 如果沒有對應的記錄,就顯示空值

select * from emp e1,dept d1 where e1.deptno = d1.deptno(+)

*/
 
 --查詢員工姓名 和員工 部門所屬的位置
 select el.ename,d1.loc from emp e1 ,dept d1 where e1.deptno == d1.deptno ;
  

--
  • 子查詢

    --查詢員工中的最高工資
    
    select max(sal) from emp ; --最高工資
    
    select * from emp where sal = (select max(sal) from emp )
    
    /*子查詢語: 巢狀查詢
    分類別:
    單行子查詢:  是使用關係 查詢語句 < > + =  等
    多行子查詢: */
    
    --查詢出比給僱員7654 的工資高,同時和7788 從事 相同工作的員工資訊。
    
    /*分析:
    1.查詢7654 的工資
    
    2.7788 從事的工作 
    
    3.符合條件的員工資訊*/
    
    select sal from emp where empno = 7654;
    
    select job from emp where empno = 7788;
    
    select * from emp where  sal > (select sal from emp where empno = 7654) and job = (select job from emp where empno = 7788);
    

    sal:

    符合條件”

--查詢領導資訊
--1.查詢所有經理的編號
select mgr from emp;
select dissinct mgr from emp;
--2.結果
select * from emp where empno in (select mgr from emp);

--查詢不是領導的資訊

select * from emp where empno not in (select mgr from emp) --寫法錯誤,對NULL 值的理解錯誤


select * from emp where empno <>all (select mgr from emp)--方法一:<> all 非所有的 sql 裡的非

select * from emp where empno not in (select mgr from emp where mgr is not NULL) --非 領導且不為空值中查詢 

/*
內聯接,單行子查詢,多行子查詢
in
not in
any
all
exists
通常情況下,資料庫中不要出現null not null

*/

/*
--查詞每個部門最低工資的員工信怎和他所在的部門資訊
--1.知諧每個部門7的最低工資
--2.員工工資等寧腦所郊部i門了的最低工資
--查詢部門的相關資訊  
*/

select deptno ,min(sal) minsal  from emp group by deptno'

select * from emp e1,dept d1 where e.deptno = d1.pno

/*
exists(存在):存在的意,思
    當作布林值來處理:
    當查詢語句有結果的時候,就是返回true
    否則返回的是false
    資料最比較大的時候是非常高效的
 */

select * from emp order by sal desc
/*
按照列名是一個排序順序,可以是:
ASC表示按升序排序
DESC表示按降序排序
*/
select rownum,e1.* from emp e1 order by sal desc 

/*
rownum : 偽列,系統自動生成的一列,用:來表示行號
rownum是oracle中特有的用來表示行號的,預設值/起始值是1,在查詢出結果之後,再新增1
*/

--統計每年入職的員工個數

select hiredate from emp;

select to_char (hiredate,'yyyy') from emp ;

select to_char (hiredate,'yyyy') yy,count(1) cc from emp group by to_char(hiredate,'yyyy');
  

/*
rowid :偽列每行記錄所存放的真實實體地址
rownum : 行號,每查詢出記錄之後,就會新增一個行號
*/
select * rowid ,e.* from emp e;

create table p(
name varchar2(10)
)
insert into p value('黃偉福');
insert into p value('黃三');
insert into p value('代五');

select rowid,* from p;

delete from p p1 where rowid > (select min(rowid) from p p2 where p1.name = p2.name );


  • Oracle 分頁查詢

(1)>= y,<= x表示從第y行(起始行)~x行(結束行) 。
(2)rownum只能比較小於,不能比較大於,因為rownum是先查詢後排序的,例如你的條件為rownum>1,當查詢到第一條資料,rownum為1,則不符合條件。第2、3…類似,一直不符合條件,所以一直沒有返回結果。所以查詢的時候需要設定別名,然後查詢完成之後再通過呼叫別名進行大於的判斷。

--查詢第6-10 的記錄

select rownum,emp.* from emp;
select rownum hanghao,emp.* from emp;
select * from (select rownum hanghao ,emp.* from emp) where tt.hanghao between 6 and 10;
/*
(select rownum hanghao ,emp.* from emp) 行號,emp的成員元素
 刪選條件: 行號 在 6 到 10 之間
*/

  • 集合運算
/*
集合運算:
並集:將兩個查詢結果進行合併交集 
union / union all
差集: 
*/

效果圖

/*
集合運算中的注意事項:
1.列的型別要一致
2.按照順序寫
3.列的數量要一致,如果不足,用空值填充,如果沒有,應該用null 填充 。
*/