SQL查詢_高級查詢
一、子查詢
子查詢出現(xiàn)的位置一般為條件語句,oracle會先執(zhí)行子查詢,再執(zhí)行父查詢,子查詢會單獨(dú)運(yùn)算,不會與其他數(shù)據(jù)源進(jìn)行笛卡爾積運(yùn)算,子查詢可以訪問父查詢的數(shù)據(jù)源,父查詢不能訪問子查詢的數(shù)據(jù)源,子查詢可以出現(xiàn)在插入、更新、查詢、刪除當(dāng)中,更加有效的限制where子句中的條件
語句:select * from employee where emp_id in (select emp_id from employee where emp_salary>5000);
語句:select * from employee e where exists (select emp_id from t_employee where emp_id=e.emp_id);
二、聯(lián)合查詢
聯(lián)合查詢是對查詢結(jié)果集的操作,包含union(并集,會去重)、union all(并集,顯示重復(fù)的數(shù)據(jù))、intersect(交集)、minus
2.01、?union查詢union查詢將兩個查詢結(jié)果進(jìn)行并集操作,并將重復(fù)的記錄刪除,相當(dāng)于執(zhí)行并集操作后,再執(zhí)行一次distinct
語句:
select '張三' newname,5000 newsalary from dual union select emp_name newname,emp_salary ?newsalary from employee;
NEWNAME ? ? ? ? ? ? ?NEWSALARY
-------------------- ----------------------
韓明 ? ? ? ? ? ? ? ? 4500
李麗 ? ? ? ? ? ? ? ? 6000
李四 ? ? ? ? ? ? ? ? 4500
王蘭 ? ? ? ? ? ? ? ? 4600
張三 ? ? ? ? ? ? ? ? 5000趙飛 ? ? ? ? ? ? ? ? 6000
備注:union操作的各結(jié)果集,只要把證列數(shù)相同,且各列的類型一致,列名可以不一致?,若列名不一致,同一使用第一個查詢結(jié)果集中的列名
2.02、?union all查詢union all查詢也是并集操作,但不刪除重復(fù)的記錄
語句:select '張三' newname,5000 newsalary from dual union all select emp_name newname,emp_salary ?newsalary from employee;
NEWNAME ? ? ? ? ? ? ?NEWSALARY
-------------------- ----------------------
張三 ? ? ? ? ? ? ? ? 5000
張三 ? ? ? ? ? ? ? ? 5000
李四 ? ? ? ? ? ? ? ? 4500
趙飛 ? ? ? ? ? ? ? ? 6000
韓明 ? ? ? ? ? ? ? ? 4500
王蘭 ? ? ? ? ? ? ? ? 4600李麗 ? ? ? ? ? ? ? ? 6000
2.03、 intersect查詢intersect查詢用于兩個結(jié)果集的交集
語句:select '張三' newname,5000 newsalary from dual intersect select emp_name newname,emp_salary ?newsalary from employee;
NEWNAME ? ? ? ? ? ? ?NEWSALARY
-------------------- ----------------------
張三 ? ? ? ? ? ? ? ? 5000
2.04、 minus查詢
minus查詢可以看作集合間的減法運(yùn)算,第一個集合看成被減數(shù),第二個看成減數(shù)
語句:select emp_name newname,emp_salary ?newsalary from employee minus select '張三' newname,5000 newsalary from dual;
NEWNAME ? ? ? ? ? ? ?NEWSALARY
-------------------- ----------------------
韓明 ? ? ? ? ? ? ? ? 4500
李麗 ? ? ? ? ? ? ? ? 6000
李四 ? ? ? ? ? ? ? ? 4500
王蘭 ? ? ? ? ? ? ? ? 4600趙飛 ? ? ? ? ? ? ? ? 6000三、聯(lián)接
聯(lián)接用于指定多數(shù)據(jù)源(表、視圖)之間如何組合,以形成最終的數(shù)據(jù)源?,包含:自然聯(lián)接、內(nèi)聯(lián)接、外聯(lián)接:左聯(lián)接、外聯(lián)接:右聯(lián)接、外聯(lián)接:完全聯(lián)接
3.01、自然聯(lián)接
自然聯(lián)接將兩個數(shù)據(jù)源中相同名稱的列進(jìn)行聯(lián)接,不必明確指定執(zhí)行聯(lián)接的列,關(guān)鍵字:natrual join
語句:select * from employee natural join department;
EMP_DEPARTMENT ? ? EMP_ID ? ? ? ? ? ? ? ??EMP_NAME ? ? ? ? ? ? ? ? ? ?ID ? ? ? ? ? ? ? ? ? ??POSITION
-------------------- ? ? ? ? ?-------------------- ? ? ??-------------------- ? ? ? ? ? ?-------------- ? ? ???--------------------
設(shè)計部 ? ? ? ? ? ? ? ? ? ? ? ? ?0001 ? ? ? ? ? ? ? ? ? ? ? ?張三 ? ? ? ? ? ? ? ? ? ? ? ??? ? ? 0001 ? ? ? ? ? ? ? ?? 深圳
工程部 ? ? ? ? ? ? ? ? ? ? ? ? ?0005 ? ? ? ? ? ? ? ? ? ? ??王蘭 ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?? 0003 ? ? ? ? ? ? ? ? 上海
工程部0002李四0003 ? ? ? ? ? ? ? ??上海項目部0006李麗 ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?0002 ? ? ? ? ? ? ? ? 深圳
項目部0004韓明 ? ? ? ? ? ? ? ? ? ? ? ? ? ? ???0002 ? ? ? ? ? ? ? ?深圳
項目部0003趙飛 ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?0002 ? ? ? ? ? ? ? ?深圳
備注:其中EMP_DEPARTMENT是兩個表中的相同列,EMP_ID 、EMP_NAME是employee 表中的列,?ID、POSITION是department中的列,自然聯(lián)接根據(jù)兩個表中相同的列聯(lián)接,顯示兩個表中的所有列,無多大實際意義,聯(lián)接列必須同名
3.02、內(nèi)聯(lián)接
內(nèi)聯(lián)接需要在from中使用聯(lián)接條件,可以自行定義所要聯(lián)接的列
語句:
select * from employee e inner join department d on e.emp_id=d.id;EMP_ID ? ? ? ? ? ? ? EMP_NAME ? ? ? ? ? ? EMP_DEPARTMENT ? ? ? ID ? ? ? ? ? ? ?EMP_DEPARTMENT ? ? ? ? ? ?POSITION
-------------------- -------------------- ? ? ? ?---------------------- ? ? ? ? ??-------------- ?-------------------------------- ??-----------------------------------------
0001 ? ? ? ? ? ? ? ? ? ?張三 ? ? ? ? ? ? ? ? ? ? ? ???設(shè)計部 ? ? ? ? ? ? ? ? ? ? ? ? ???0001 ? ? ? ? ? ? ??設(shè)計部 ? ? ? ? ? ? ? ? ? ? ? ? ? ?? ?深圳
0003 ? ? ? ? ? ? ? ??? ?趙飛 ? ? ? ? ? ? ? ? ? ? ? ? ?項目部 ? ? ? ? ? ? ? ? ? ? ? ? ? ?0003 ? ? ? ? ? ???工程部 ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 上海
0002 ? ? ? ? ? ? ? ?? ?李四 ? ? ? ? ? ? ? ? ? ??? ? ??工程部 ? ? ? ? ? ? ? ? ? ? ? ? ?? 0002 ? ? ? ? ? ? ? ?項目部 ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?深圳
內(nèi)聯(lián)接一般可以用where 代替,在開發(fā)中比較少用?,內(nèi)聯(lián)接會將兩數(shù)據(jù)源中聯(lián)接列中相同的值顯示出來
3.03、外聯(lián)接___左聯(lián)接
外聯(lián)接與內(nèi)聯(lián)接不同,內(nèi)聯(lián)接中的兩個數(shù)據(jù)源的地位是并列關(guān)系,二者具有平等的關(guān)系,而外聯(lián)接將其中的一個數(shù)據(jù)源指定為基表(主表),另一個數(shù)據(jù)源可以看作為附表?,在最終的數(shù)據(jù)源中,一定含有基表中的數(shù)據(jù),而附表中的數(shù)據(jù)是否出現(xiàn),則以具體的聯(lián)接條件而定,左聯(lián)接中l(wèi)eft jion左邊的表為主表,右邊的表為附表
語句:select * from employee e left join department d on e.emp_id=d.id;
EMP_ID ? ? ? ? ? ? ?EMP_NAME ? EMP_DEPARTMENT ? ? ? ID ? ? ? ? EMP_DEPARTMENT ? ? ? POSITION
-------------------- -------------------- ----------------- ? ? ? ??--------- ? ? ------------------ ? ? ? ? ? ? ? ? ?---------------
0001 ? ? ? ? ? ? ? ? 張三 ? ? ? ? ? ? ? ?設(shè)計部 ? ? ? ? ? ? ? ? ? ? ? ? ? 0001 ? ? ? 設(shè)計部 ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?? 深圳
0003 ? ? ? ? ? ? ? ? 趙飛 ? ? ? ? ? ? ? ?項目部0003 ? ? ? 工程部上海0002 ? ? ? ? ? ? ? ? 李四 ? ? ? ? ? ? ? ?工程部0002 ? ? ? 項目部深圳
0004 ? ? ? ? ? ? ? ? 韓明 ? ? ? ? ? ? ? ?項目部
0005 ? ? ? ? ? ? ? ? 王蘭 ? ? ? ? ? ? ? ?工程部0006 ? ? ? ? ? ? ? ? 李麗 ? ? ? ? ? ? ? ?項目部
備注:主表employee 中的所有數(shù)據(jù)都顯示left join中省略了outer,實際為left outer join
3.04、外聯(lián)接___右聯(lián)接
右表聯(lián)接中right join 右邊的表為主表,左邊的表為附表
語句:select * from employee e right join department d on e.emp_id=d.id;
EMP_ID ? ? ? ? ? ? ? EMP_NAME ? ? ? ? ? ? EMP_DEPARTMENT ? ? ? ID ? ? ? ? EMP_DEPARTMENT ? ? ? POSITION
-------------------- -------------------- ?-------------------- ? ? ? ? ? ? ? ? ? ?---------- -------------------- ? ? ? ? ? ?--------------------
0001 ? ? ? ? ? ? ? ? 張三 ? ? ? ? ? ? ? ? ? ? ? ??? 設(shè)計部 ? ? ? ? ? ? ? ? ? ? ? ? ? ? ??0001 ? ? ? 設(shè)計部 ? ? ? ? ? ? ? ? ? ? ? ? ?深圳
0002 ? ? ? ? ? ? ? ? 李四工程部0002 ? ? ? 項目部深圳0003 ? ? ? ? ? ? ? ? 趙飛項目部0003 ? ? ? 工程部上海
0007 ? ? ? ??商務(wù)部 ? ? ? ? ? ? ? ? ? ??? ?深圳
3.05、外聯(lián)接___完全聯(lián)接
完全聯(lián)接是左聯(lián)接和右聯(lián)接的組合,先執(zhí)行一個左聯(lián)接,再執(zhí)行一個右聯(lián)接,最后將兩個結(jié)果集執(zhí)行union操作,從而獲取最終的數(shù)據(jù)源
語句:select * from employee e full join department d on e.emp_id=d.id;
EMP_ID ? ? ? ? ? ? ? EMP_NAME ? ? ? ? ? ? EMP_DEPARTMENT ? ? ? ? ? ID ? ? ? ? EMP_DEPARTMENT ? ? ? ?POSITION
-------------------- -------------------- ?-------------------- ? ---------- ?-------------------- ?--------------------
0001 ? ? ? ? ? ? ? ? 張三 ? ? ? ? ? ? ? ?設(shè)計部 ? ? ? ? ? ? ? ? ? ?0001 ? ? ? 設(shè)計部 ? ? ? ? ? ? ? ?深圳
0002 ? ? ? ? ? ? ? ? 李四 ? ? ? ? ? ? ? ?工程部 ? ? ? ? ? ? ? ? ? ?0002 ? ? ? 項目部 ? ? ? ? ? ? ? ?深圳
0003 ? ? ? ? ? ? ? ? 趙飛 ? ? ? ? ? ? ? ?項目部 ? ? ? ? ? ? ? ? ? ?0003 ? ? ? 工程部 ? ? ? ? ? ? ? ?上海
0004 ? ? ? ? ? ? ? ? 韓明 ? ? ? ? ? ? ? ?項目部
0005 ? ? ? ? ? ? ? ? 王蘭 ? ? ? ? ? ? ? ?工程部
0006 ? ? ? ? ? ? ? ? 李麗 ? ? ? ? ? ? ? ?項目部0007 ? ? ? 商務(wù)部 ? ? ? ? ? ? ? ?深圳
備注:盡量避免使用完全聯(lián)接,會降低查詢性能