Oracle 學習筆記(二)
阿新 • • 發佈:2020-12-26
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 填充 。
*/