一、連接查詢 1. 內連接 內連接用于返回滿足連接條件的所有記錄。默認情況下,在執行連接查詢時如果沒有指定任何連接操作符,那么這些連接查詢都屬于內連接。 Sql 代碼 1. SELECT a.dname,b.ename from depta,empb where a.deptno=b.deptno and a.deptno=10;
一、連接查詢1.內連接內連接用于返回滿足連接條件的所有記錄。默認情況下,在執行連接查詢時如果沒有指定任何連接操作符,那么這些連接查詢都屬于內連接。
Sql代碼
1.
SELECTa.dname,b.enamefromdept a,emp bwherea.deptno=b.deptnoanda.deptno=10;
在FROM子句中指定INNER JOIN選項,也可以指定內連接。
Sql代碼
1.
SELECTa.dname,b.enamefromdept aINNERJOINemp bwherea.deptno=b.deptnoanda.deptno=10;
從Oracle9i開始,如果主表的主鍵列和從表的外部鍵列名稱相同,那么可以使用NATURAL JOIN關鍵字自動執行內連接操作。
Sql代碼
1.
SELECTdname,enameFROMdept NATURALJOINemp;
2.左外連接左外連接通過指定LEFT[OUTER]JOIN選項來實現。當使用左外連接時,不僅會返回滿足連接條件的所有記錄,而且還會返回不滿足連接條件的連接操作符左邊表的其他行。
Sql代碼
1.
SELECTa.dname,b.enameFROMdept aLEFTJOINemp bONa.deptno=b.deptnoANDa.deptno=10;
3.右外連接右外連接通過指定RIGHT[OUTER]JOIN選項來實現的。當使用右外連接時,不僅會返回滿足連接條件的所有行,而且還會返回不滿足連接條件操作符右邊表的其他行。
Sql代碼
1.
SELECTa.dname,b.enameFROMdept aRIGHTJOINemp bONa.deptno=b.deptnoANDa.deptno=10;
4.完全外連接完全外連接是指定FULL[OUTER]JOIN選項來實現的。當使用完全外連接時,不僅會返回滿足連接條件的所有行,而且還會返回不滿足連接條件的所有其他行。
Sql代碼
1.
SELECTa.dname,b.enameFROMdept aFULLJOINemp bONa.deptno=b.deptnoANDa.deptno=10;
相當于沒連接去掉where條件
Sql代碼
1.
SELECTa.dname,b.enamefromdept a,emp;
5.使用(+)操作符在Oracle9i之前,當執行外連接時,都是使用連接操作符(+)來完成的。盡管可以使用操作符(+)執行外連接操作。但Oralce9i開始Oracle建議使用OUTER
JOIN執行外連接。語法如下:SELECT table1.column, table2.column FROM table1, table2 WHERE table1.column1(+) = table2.column2;當使用(+)操作符執行外連接時,應該將該操作符放在顯示較少行(完全滿足連接條件行)的一端。一句話,左外連接時,(+)要放在右邊表的一端。右外連接時,(+)放在左邊表的一端。左外連接:
Sql代碼
1.
SELECTa.dname,b.enameFROMdept a, emp bwherea.deptno=b.deptno(+)ANDb.deptno(+)=10;
右外連接
Sql代碼
1.
SELECTa.dname,b.enameFROMdept a, emp bwherea.deptno(+)=b.deptnoANDa.deptno(+)=10;
二、遞歸查詢1.語法
Sql代碼
1.
Select*from….Where[結果過濾條件語句]
2.
Startwith[起始條件過濾語句]
3.
Connectbyprior[中間記錄過濾條件語句]
2.例子
Sql代碼
1.
Select*fromcompany tWheret.flag=1
2.
Startwitht.company_id=50500000
3.
Connectbypriort.company_id=t.parent_id
說明:
Sql代碼
1.
select[level],column,exprfromtable[wherecondition]
2.
[startwith] //[起點]
3.
[connectbyprior+主鍵=外鍵或外鍵=主鍵]
a.自頂向下:左邊放主鍵,右邊放外鍵。b.自底向上:右邊放主鍵,左邊放外鍵。c.level(偽列)層次的級別,不固定值。三、更改數據庫的時間格式1、臨時更改alter session set nls_date_format='YYYY-MM-DD HH24:MI:SS'2.永久更改在注冊表[HKEY_CODE_MACHINE\SOFTWARE\ORACLE]里面,加入NLS_DATE_FORMAT,值為YYYY-MM-DD
HH24:MI:SS。3、Unix下,在用戶的.profile文件中增加以下內容:NLS_DATE_FORMAT=YYYY-MM-DD HH24:MI:SSexport NLS_DATE_FORMAT附:在SQLPLUS下,實現中-英字符集轉換
Sql代碼
1.
altersessionsetnls_language='AMERICAN';
2.
altersessionsetnls_language='SIMPLIFIED CHINESE';
四、復制表和數據1)建表
Sql代碼
1.
createtabletestasselect*fromdept;--從已知表復制數據和結構
2.
createtabletestasselect*fromdeptwhere1=2;--從已知表復制結構但不包括數據
建立視圖:
Sql代碼
1.
CREATEORREPLACEVIEWdept_10ASSELECTempno,ename,job,sal,deptnoFROMempWHEREdeptno=10ORDERBYempno;
建立實體化視圖:
Sql代碼
1.
CREATEMATERIALLIZEDVIEWsummary_empASSELECTdeptno,job,avg(sal) avgsal,sum(sal) sumsalFROMempGROUPBYcube(deptno,job);
實體化視圖管理是用于匯總,預計算,復制或分發數據的對象,在大型的數據庫中使用它可以提高涉及到的SUM,COUNT,AVG,MIN,MAX等的表的查詢的速度,只要在實體化視圖管理上創建了統計,查詢優化器將自動的使用實體化視圖管理,這特性被稱為QUERY
REWRITE(查詢重寫).與普通的視圖不同的是實體化視圖管理存儲數據,占據數據庫的物理空間的.2)不使用列的列表插入數據:
Sql代碼
1.
insertintotestselect*fromdept;
3)使用DEFAULT插入數據:如果列存在默認值,則會使用其默認值;如果列不存在默認值,則自動使用NULL.
Sql代碼
1.
insertintodeptvalues(10,'市場部',default);
4)使用子查詢插入數據
將查出來的內容全部插入
Sql代碼
1.
insertintoemployee(empno,ename,sql,deptno)
2.
selectempno,ename,sal,deptnofromemp
3.
wheredeptno = 10;
將查出來的內容部分插入
Sql代碼
1.
insertintoemployee(empno,ename,sql,deptno)
2.
selectempno,’楊凱’,sal,deptnofromemp
3.
wheredeptno = 10;
當要裝載大批量數據時,用直接裝載方式:
Sql代碼
1.
insert/*+APPEND */intoemployee(empno,ename,sql,deptno)
2.
selectempno,ename,sal,deptnofromemp
3.
wheredeptno = 10;
5)使用多表插入數據。從Oracle9i開始,使用INSERT語句可以將某張表的數據同時插入到多張表中。使用ALL操作符,在每個條件子句上都要執行INTO子句后的子查詢。
Sql代碼
1.
insertallwhendeptno=10thenintot_dept10
2.
whendeptno=20thenintot_dept20
3.
whendeptno=30thenintot_dept30
4.
whenjob='clerk'thenintot_clerk
5.
elseintot_other
6.
select*fromemp;
使用FIRST操作符執行多表插入,如果數據已經滿足了先前條件,并且已經被插入到某表,那么該行數據在后續插入中將不會被再次使用。
Sql代碼
1.
insertfirstwhendeptno=10thenintot_dept10
2.
whendeptno=20thenintot_dept20
3.
whendeptno=30thenintot_dept30
4.
whenjob='clerk'thenintot_clerk
5.
elseintot_other
6.
select*fromemp;
五、多列子查詢多列子查詢是指返回多列數據的子查詢語句。當多列子查詢返回單行數據時,在WHERE子句中可以使用單行比較符;當多列子查詢返回多行數據時,在WHERE子句中必須使用多行比較符(IN,ANY,ALL)。如顯示與Id為10000的人員部門和崗位完全相同的所有雇員:
Sql代碼
1.
SELECTename,job,sal,deptnoFROMempWHERE(deptno,job)=(SELECTdeptno,jobFROMempWHEREid=10000);
當執行成對比較是時,因為要求多個列的數據必須同時匹配,所以必須要使用多列子查詢實現。如顯示工資和補助與部門30雇員的工資和補助完全匹配的所有雇員:
Sql代碼
1.
SELECTename,sal,comm,dptnoFROMempWHERE(sal, nvl(comm,-1))IN(SELECTsal, nvl(comm,-1)FROMempWHEREdeptno=30);
執行非成對比較時,應該使用多個多行子查詢來實現。如顯示工資匹配于部門30工資列表、補助匹配于部門30補助列表的所有雇員:
Sql代碼
1.
SELECTename,sal,comm,deptnoFROMempWHEREsalIN(SELECTsalFROMempWHEREdeptno=30)ANDnvl(comm,-1)IN(SELECTnvl(comm,-1)FROMempWHEREdeptno=30);
六、相關子查詢與FROM子句中子查詢相關子查詢是指需要引用主查詢表列的子查詢語句,是通過EXISTS謂詞來實現的。如顯示工作在“NEW YORK”的所有雇員:
Sql代碼
1.
SELECTename,job,sal,deptnoFROMempWHEREEXISTS (SELECT1FROMdeptWHEREdept.deptno=emp.deptnoANDdept.loc='NEW YORK');
在FROM子句中使用子查詢時,該子查詢會被作為視圖對待。因此也被稱為內嵌視圖。如顯示高于部門平均工資的雇員信息:
Sql代碼
1.
SELECTename,job,salFROMemp, (SELECTdeptno,avg(sal) avgsalFROMempGROUPBYdeptno) deptWHEREemp.deptno=dept.deptnoANDsal>dept.avgsal;
七、合并查詢集合操作符有UNION,UNION ALL,INTERSECT和MINUS。當使用集合操作符時,必須確保不同查詢的列個數和數據類型都要匹配。有以下一些限制:1.對于LOB,VARRAY和嵌套表列來說,集合操作符是無效的。2.對于LONG列來說,UNION,INTERSECT,MINUS操作符是無效的。3.如果選擇列表包含了表達式,則必須為為其指定列別名。(一)UNIONUNION操作符用于獲取兩個結果集的并集。當使用該操作符時,會自動去掉結果集中的重復行。并且會以第一列的結果進行排序。
Sql代碼
1.
SELECTename,sal,jobFROMempWHEREsal>2500UNIONSELECTename,sal,jobFROMempWHEREjob='MANAGER';
(二)UNION ALLUNION ALL操作符獲取兩個結果集的并集,但不會取消重復值,而且也不會以任何列進行排序。
Sql代碼
1.
SELECTename,sal,jobFROMempWHEREsal>2500UNIONALLSELECTename,sal,jobFROMempWHEREjob='MANAGER';
(三)INTERSECTINTERSECT操作符用于獲取兩個結果集的交集。當使用該操作符時,只會顯示同時存在于兩個結果集中的數據,并且會以第一列進行排序。
Sql代碼
1.
SELECTename,sal,jobFROMempWHEREsal>2500INTERSECTSELECTename,sal,jobFROMempWHEREjob='MANAGER';
(四)MINUSMINUS用于獲取兩個結果集的差集。以第一列進行排序。
Sql代碼
1.
SELECTename,sal,jobFROMempWHEREsal>2500 MINUSSELECTename,sal,jobFROMempWHEREjob='MANAGER';
八、CASE表達式和倒敘查詢通過CASE表達式,可以避免調用過程來完成條件分支操作。
Sql代碼
1.
SELECTename,sal,CASEWHENsal>3000THEN3WHENsal>2000THEN2ELSE1ENDgradeFROMempWHEREdeptno=10;
默認情況下,當執行查詢操作時,只能看到最近提交的數據。從Oracle9i開始,通過使用倒敘查詢(Flashback
Query)特征,可以查看到過去某個時間點所提交的數據。注意,如果使用倒敘查詢,那么要示數據庫必須彩UNDO管理方式,并且初始化參數undo_retention限制了UNDO數據的保留時間。
Sql代碼
1.
SELECTename,salFROMempASOFTIMESTAMPto_timestamp('2009-01-01 12:12:00','YYYY-MM-DD HH24:MI:SS')WHEREename='CLARK';
九、使用WITH子句重用子查詢從Oracle9i開始,通過WITH子句可以給子查詢指定一個名稱,并且使得在一條語句中可以完成所有任務,從而避免使用臨時表。如顯示部門工資總和高于雇員工資總和三分之一的部門名稱及工資總和。
Sql代碼
1.
WITHsummaryAS(SELECTdname,SUM(sal)ASdept_totalFROMemp,deptWHEREemp.deptno=dept.deptnoGROUPBYdname)
2.
SELECTdname, dept_totalFROMsummaryWHEREdept_total>(
3.
SELECTSUM(dept_total) * 1/3FROMsummary);
十、oracle對記錄進行去重sql
Sql代碼
1.
DELETEFROM[TABLE_NAME]
2.
WHEREROWIDNOTIN(
3.
SELECTMIN(ROWID)FROM[TABLE_NAME]
4.
GROUPBY[COL1,COL2,COL3...]
5.
);
統計酒店名不重復的總數
Sql代碼
1.
SELECT COUNT(DISTINCT(hotel_id)) FROMt_app_travel_hotel_comment;
十一、SQL排序后的NULL位置可以把那些NULL值假想為所有內容中值是最大的,因此,升序排序后NULL值在最后,倒序排序后NULL值在最前!當指定"NULLSFIRST"時,無論是升序排序還是倒序排序,NULL值都會排列在最前面;當指定“NULLSLAST”時,無論是升序排序還是倒序排序,NULL值都會排列在最后面。
Sql代碼
1.
SELECT*FROMtORDERBYxDESCNULLSLAST;
本文原創發布php中文網,轉載請注明出處,感謝您的尊重!