標籤:group 沒有 產生 order by sts first 文法 數值 ora
子查詢:
定義,就是指查詢中巢狀查詢。
子查詢可以出現在很多位置,比如: 當列、當表、當條件等
文法:
SELECT (子查詢)
FROM (子查詢)
WHERE (子查詢)
GROUP BY 子句
HAVING (子查詢)
ORDER BY 子句
註:子查詢要用括弧括起來。
如:
-- 找出與Ben同一個部門的員工
--第一步:先找出Ben所在的部門
select dept_id from s_emp where first_name = ‘Ben‘;
--第二步:找出該部門的所有員工
select first_name from s_emp where dept_id = 數值
--第三步:
select first_name from s_emp where dept_id =(select dept_id from s_emp where first_name = ‘Ben‘) and first_name != ‘Ben‘;
子查詢分類
1. 無關子查詢
是指子查詢中沒有使用外部查詢所定義的變數/別名。
2. 相互關聯的子查詢
是指子查詢中要使用外部查詢所定義的變數/別名。
rownum
它總是從1開始,依次遞增,絕不會產生GAP【間隔】
如:
select d.*,rownum from s_dept d where rownum = 1;
select d.*,rownum from s_dept d where rownum = 5;
select d.*,rownum from s_dept d where rownum > 5;
select d.*,rownum from s_dept d where rownum < 5;
-- rownum 的作用
2. 分頁查詢問題
-- 查詢出員工表中第2頁[第7行至第12行]資料。
//錯誤
select * from s_emp where rownum between 7 and 12;
select * from s_emp where rownum >=7 and rownum<= 12;
//正確:方法一
select * from (
--中介層,負責把上限行給取出來
select v1_.*,rownum rw_ from (
-- 業務的核心語句
select id,first_name,salary from s_emp
) v1_
where rownum <= 12
) v2_
where v2_.rw_ >= 7;
方法二:
select * from
(select * from s_emp where rownum <=12)
where id not in (select id from s_emp where rownum <7);
有關 exists 與 not exists 運算子
exists用來判斷子查詢是否有結果,如果有,則返回TRUE,否則,返回FALSE
關於子查詢的集合操作
UNION 返回兩個子查詢的並集,不含重複記錄
UNION ALL 返回兩個子查詢的並集,包含複復記錄
如:
select id,first_name from s_emp where salary > 1200
union
select id,first_name from s_emp where salary between 850 and 1400;
INTERSECT 返回交集
MINUS 兩個子查詢相減
Oracle 進階查詢2 子查詢