【文章內(nèi)容簡介】
多個列的數(shù)據(jù)必須同時匹配,而非成對比較則不要求多個列的數(shù)據(jù)同時匹配。Oracle 10g數(shù)據(jù)庫基礎教程p 查詢與 7844號員工的工資、工種都相同的員工的信息。n SELECT empno,ename,sal,job FROM emp n WHERE (sal,job)=(SELECT sal,job FROM empn WHERE empno=7844)。p 查詢與 10號部門某個員工工資相同,工種也與 10號部門的某個員工相同的員工的信息。n SELECT empno,ename,sal,job FROM emp n WHERE sal IN (SELECT sal FROM emp WHERE n deptno=10) AND job IN (SELECT job FROM emp n WHERE deptno=10)。 Oracle 10g數(shù)據(jù)庫基礎教程( 5)多行多列子查詢p 多行多列子查詢是指子查詢返回多行數(shù)據(jù),并且是多列數(shù)據(jù)。p 例如,查詢與 10號部門某個員工的工資和工種都相同的員工的信息,語句為n SELECT empno,ename,sal,job FROM empn WHERE (sal,job) IN(n SELECT sal,job FROM emp WHERE deptno=10)。 Oracle 10g數(shù)據(jù)庫基礎教程( 6)相關子查詢p 子查詢在執(zhí)行時并不需要外部父查詢的信息,這種子查詢稱為無關子查詢。p 如果子查詢在執(zhí)行時需要引用外部父查詢的信息,那么這種子查詢就稱為相關子查詢。p 在相關子查詢中經(jīng)常使用 EXISTS或 NOT EXISTS謂詞來實現(xiàn)。如果子查詢返回結(jié)果,則條件為 TRUE,如果子查詢沒有返回結(jié)果,則條件為 FALSE。Oracle 10g數(shù)據(jù)庫基礎教程p 查詢沒有任何員工的部門號、部門名。n SELECT deptno,dname,loc FROM dept n WHERE NOT EXISTS(SELECT * FROM emp WHERE n =)。p 查詢比本部門平均工資高的員工信息。n SELECT empno,ename,sal n FROM emp e n WHERE sal( SELECT avg(sal) FROM emp WHERE n deptno=)。 Oracle 10g數(shù)據(jù)庫基礎教程( 7)在 FROM子句中使用子查詢p 當在 FROM子句中使用子查詢時,該子查詢被作為視圖對待,必須為該子查詢指定別名。p 查詢各個員工的員工號、員工名及其所在部門平均工資。n SELECT empno,ename, FROM emp,n (SELECT deptno,avg(sal) avgsal FROM emp GROUP n BY deptno) d WHERE =。p 查詢各個部門號、部門名、部門人數(shù)及部門平均工資。n SELECT ,dname, , n FROM dept,(SELECT deptno,count(*)amount, n avg(sal) avgsal FROM emp GROUP BY deptno)d n WHERE =。 Oracle 10g數(shù)據(jù)庫基礎教程( 8)在 DDL語句中使用子查詢p 可以在 CREATE TABLE和 CREATE VIEW語句中使用子查詢來創(chuàng)建表和視圖。n CREATE TABLE emp_subquery n AS n SELECT empno,ename,sal FROM emp。n CREATE VIEW emp_view_subqueryn ASn SELECT * FROM emp WHERE sal2023。 Oracle 10g數(shù)據(jù)庫基礎教程( 9)使用 WITH子句的子查詢p 如果在一個 SQL語句中多次使用同一個子查詢,可以通過 WITH子句給子查詢指定一個名字,從而可以實現(xiàn)通過名字引用該子查詢,而不必每次都完整寫出該子查詢。p 查詢?nèi)藬?shù)最多的部門的信息。n SELECT * FROM deptn WHERE deptno IN (n SELECT deptno FROM emp GROUP BY deptno n HAVING count(*)=ALL(n SELECT count(*) FROM emp GROUP BY deptno)n )。Oracle 10g數(shù)據(jù)庫基礎教程p 相同的子查詢連續(xù)出現(xiàn)了兩次,因此可以按下列方式編寫查詢語句。n WITH deptinfo AS(SELECT deptno,count(*) num n FROM emp GROUP BY deptno) n SELECT * FROM dept WHERE deptno IN(SELECT n deptno FROM deptinfo WHERE num=(SELECT n max(num) FROM deptinfo)n )。 Oracle 10g數(shù)據(jù)庫基礎教程 合并查詢p 語法p UNIONp INTERSECTp MINUSOracle 10g數(shù)據(jù)庫基礎教程p 語法: SELECT query_statement1 [UNION|UNION ALL|INTERSECT|MINUS] SELECT query_statement2。p 注意:n 當要合并幾個查詢的結(jié)果集時,這幾個查詢的結(jié)果集必須具有相同的列數(shù)與數(shù)據(jù)類型。n 如果要對最終的結(jié)果集排序,只能在最后一個查詢之后用 ORDER BY子句指明排序列。 Oracle 10g數(shù)據(jù)庫基礎教程( 1) UNIONp UNION運算符用于獲取幾個查詢結(jié)果集的并集,將重復的記錄只保留一個,并且默認按第一列進行排序。p 查詢 10號部門的員工號、員工名、工資和部門號以及工資大于 2023的所有員工的員工號、員工名、工資和部門號,語句為n SELECT empno,ename,sal,deptno n FROM emp WHERE deptno=10n UNIONn SELECT empno,ename,sal,deptno n FROM emp WHERE sal2023n ORDER BY deptno。 Oracle 10g數(shù)據(jù)庫基礎教程p 如果要保留所有的重復記錄,則需要使用 UNION ALL運算符。n SELECT empno,ename,sal,deptnon FROM emp WHERE deptno=10n UNION ALLn SELECT empno,ename,sal,deptno n FROM emp WHERE sal2023n ORDER BY deptno。 Oracle 10g數(shù)據(jù)庫基礎教程( 2) INTERSECTp INTERSECT用于獲取幾個查詢結(jié)果集的交集,只返回同時存在于幾個查詢結(jié)果集中的記錄。同時,返回的最終結(jié)果集默認按第一列進行排序。p 查詢 30號部門中工資大于 2023的員工號、員工名、工資和部門號,語句為:n SELECT empno,ename,sal,deptno n FROM emp WHERE deptno=30n INTERSECTn SELECT empno,ename,sal,deptno n FROM EMP WHERE sal2023。 Oracle 10g數(shù)據(jù)庫基礎教程( 3) MINUSp MINUS用于獲取幾個查詢結(jié)果集的差集,即返回在第一個結(jié)果集中存在,而在第二個結(jié)果集中不存在的記錄。同時,返回的最終結(jié)果集默認按第一列進行排序。p 查詢 30號部門中工種不是 “SALESMAN”的員工號、員工名和工種名稱,語句為: n SELECT empno,ename,job n FROM emp WHERE deptno=30n MINUSn SELECT empno,ename,job n FROM EMP WHERE job=39。SALESMAN39。Oracle 10g數(shù)據(jù)庫基礎教程 數(shù)據(jù)操縱p 插入數(shù)據(jù)p 修改數(shù)據(jù)p MERGE語句 p 刪除數(shù)據(jù)Oracle 10g數(shù)據(jù)庫基礎教程 插入數(shù)據(jù)p 插入 單行記錄p 利用子查詢插入數(shù)據(jù)p 向多個表中插入數(shù)據(jù)Oracle 10g數(shù)據(jù)庫基礎教程( 1) 插入 單行記錄p 語法n INSERT INTO table_name|view_name n [(column1[,column2… ])] n VALUES(value1[,values, … ]) p 注意n 如果在 INTO子句中沒有指明任何列名,則 VALUES子句中列值的個數(shù)、順序、類型必須與表中列的個數(shù)、順序、類型相匹配。n 如果在 INTO子句中指定了列名,則 VALUES子句中提供的列值的個數(shù)、順序、類型必須與指定列的個數(shù)、順序、類型按位置對應。n 向表或視圖中插入的數(shù)據(jù)必須滿足表的完整性約束。n 字符型和日期型數(shù)據(jù)在插入時要加單引號。日期類型數(shù)據(jù)需要按系統(tǒng)默認格式輸入,或使用 TO_DATE函數(shù)進行日期轉(zhuǎn)換。 Oracle 10g數(shù)據(jù)庫基礎教程p 向 dept表中插入一行記錄。n INSERT INTO dept VALUES(50, 39。IM39。, 39。dalian39。)。p 向 emp表中插入一行記錄。n INSERT INTO emp(empno,ename,sal,hiredate) n VALUES(1234, 39。JOAN39。,2500, 39。204月 202339。)。Oracle 10g數(shù)據(jù)庫基礎教程( 2)利用子查詢插入數(shù)據(jù) p 語法n INSERT INTO table_name|view_namen [(column1[,column2,… ])n subquery。p 注意n INTO子句中指定的列的個數(shù)、順序、類型必須與子查詢中列的個數(shù)、順序和類型相匹配。 Oracle 10g數(shù)據(jù)庫基礎教程p 統(tǒng)計各個部門的部門號、部門最高工資和最低工資,并將統(tǒng)計的結(jié)果寫入到表 emp_salary(假設該表已經(jīng)創(chuàng)建)中。n INSERT INTO emp_salary n SELECT deptno,max(sal),min(sal) FROM emp n GROUP BY deptno。p 向 emp表中插入一行記錄,其員工名為 FAN,員工號為 1235,其他信息與員工名為 SCOTT的員工信息相同。n INSERT INTO emp n SELECT 1235, 39。FAN39。,job,mgr,hiredate,sal,m,deptnon FROM emp WHERE ename=39。SCOTT39。Oracle 10g數(shù)據(jù)庫基礎教程p 如果要將大量數(shù)據(jù)插入表中,可以利用子查詢直接裝載的方式進行。由于直接裝載數(shù)據(jù)的操作過程不寫入日志文件,因此數(shù)據(jù)插入操作的速度大大提高。p 利用子查詢裝載數(shù)據(jù)語法為:n INSERT /*+APPEND*/ INTO n table_name|view_name[(column1[,column2,… ])n subquery。p 復制 emp表中 empno, ename, sal, deptno四列的值,并插入到 new_emp表中,語句為:n INSERT /*+APPEND*/ INTO n new_emp(empno,ename,sal,deptno)n SELECT empno,ename,sal,deptno from emp。 Oracle 10g數(shù)據(jù)庫基礎教程 修改數(shù)據(jù)p 基本語法p 修改單行記錄p 修改多行記錄p 帶有子查詢的修改Oracle 10g數(shù)據(jù)庫基礎教程p 基本語法n UPDATE table_name|view_namen SET column1=value1[,column2=value2… ]n [WHERE condition]p 修改單條記錄n UPDATE emp SET sal=sal+100,m=200 n WHERE empno=7844。p 修改多條記錄n