【正文】
。 。 SELECT last_name FROM employees WHERE last_name LIKE 39。 。%SA\_%39。\39。 ? 使用 IS NULL 操作檢驗是否有 Null值 邏輯運算符 如果條件為假,則返回 TRUE NOT 如果前后兩個條件有一個為真,則返回TRUE OR 如果前后兩個條件都為真,則返回 TRUE AND Meaning Operator 使用邏輯運算符 SELECT employee_id, last_name, job_id, salary FROM employees WHERE salary = 10000 AND job_id LIKE 39。 。%MAN%39。 使用邏輯運算符 ? NOT 操作符可以與 IN, BETWEEN, LIKE, and NULL配合使用 : ... WHERE job_id NOT IN (39。, 39。) ... WHERE salary NOT BETWEEN 10000 AND 15000 ... WHERE last_name NOT LIKE 39。 ? 使用 NULL FIRST和 NULL LAST指定 NULL值在排序中的位置。 排序 ORDER BY ? 默認的排序為升序: ? 數(shù)字是最小的值在前 (1 to 999). ? 日期的值最早的在前 (01JAN11在 01JAN12之前 ) ? 字符按字母表順序 (“A” 最前, “Z” 最后 ). ? Null 值在升序時顯示在最后面,在降序時顯示在最前面 ? 可以使用一個不在 SELECT列表中的列來排序 替換變量 Substitution Variables ? 替換變量臨時保存數(shù)據(jù),使用“ amp。amp。amp。column_name 。SQL Course39。SQL Course39。SQL Course39。JACK and JUE39。J39。BL39。HelloWorld39。HelloWorld39。W39。*39。*39。Hello39。World39。H39。HelloWorld39。HelloWorld39。08SEP9539。01SEP9539。FRIDAY39。28FEB9539。01FEB9539。01SEP9539。11JAN9439。 ADD_MONTHS (‘31JAN9639。MONTH39。YEAR39。MONTH39。YEAR39。01JAN9039。fmDD Month YYYY39。 … 數(shù)字轉(zhuǎn)換為字符 SELECT TO_CHAR(salary, 39。) SALARY FROM employees WHERE last_name = 39。 字符轉(zhuǎn)換為日期、數(shù)字 SQL select TO_number(39。,39。) from dual。6,39。99,39。2020081839。YYYYMMDD39。 TO_DATE(39。 ? 函數(shù)的運算順序是從內(nèi)到外。 多個列的 GROUP BY SELECT department_id dept_id, job_id, SUM(salary) FROM employees GROUP BY department_id, job_id ORDER BY department_id。 SELECT department_id, job_id, COUNT(last_name) FROM employees GROUP BY department_id。 ? 不能在 WHERE 子句中使用組函數(shù)。 正確: SELECT department_id, AVG(salary) FROM employees GROUP BY department_id HAVING AVG(salary) 8000。 多個表的數(shù)據(jù)查詢 SQL:1999標準中的 JOIN語法 ? 使用 join從多個表中查詢數(shù)據(jù): 表示表 table1中的列名 NATURAL JOIN 用于對兩個表中相同的列進行 join JOIN table2 USING column_name 基于指定的列進行對等 join JOIN table2 ON = 基于 on條件指定的列進行對等 join LEFT/RIGHT/FULL OUTER 用于外連接 CROSS JOIN 進行笛卡爾乘積 SELECT , FROM table1 [NATURAL JOIN table2] | [JOIN table2 USING (column_name)] | [JOIN table2 ON ( = )]| [LEFT|RIGHT|FULL OUTER JOIN table2 ON ( = )]| [CROSS JOIN table2]。 SELECT , , , , FROM employees e JOIN departments d ON ( = )。 … 額外條件 SELECT , , , , FROM employees e JOIN departments d ON ( = ) AND = 149 。 或 自連接 selfjoin ? 自連接是指一個表與自己進行 join SELECT emp, mgr FROM employees worker JOIN employees manager ON ( = )。 … 外連接 Outer Joins EMPLOYEES DEPARTMENTS There are no employees in department 190. … 內(nèi)連接和外連接 ? 在 SQL:1999標準中,只返回匹配記錄的 JOIN稱為內(nèi)連接 (inner join) ? 除返回匹配記錄的結(jié)果外,還要從左邊 (右邊 )的表中返回不相匹配的數(shù)據(jù)記錄的 join稱為左外(右外 )連接 (left /right outer join) ? 既返回內(nèi)連接的結(jié)果,又返回左外連接與右外連接的 join稱為全外連接 (full outer join) ? 外連接種類: LEFT OUTER RIGHT OUTER FULL OUTER 左外連接 Left Outer Join SELECT , , FROM employees e LEFT OUTER JOIN departments d ON ( = ) 。 … 笛卡爾乘積 Cartesian Products ? 以下情況會進行笛卡爾乘積 : 沒有 join條件 Join條件無效 所有數(shù)據(jù)都符合 join條件 ? 盡量避免 笛卡爾乘積 子查詢 subquery ? 問題:誰的工資比員工 A高 ? 哪個員工的工資比員工 A高 ? 主查詢 : 員工 A的工資是多少 ? 子查詢 : 子查詢語法 ? 子查詢首先運行 ? 子查詢的結(jié)果被主查詢使用 ? 子查詢放于小括號中 ? 單行操作符必須與單行子查詢匹配 ? 多行操作符必須與多行子查詢匹配 SELECT select_list FROM table WHERE expr operator (SELECT select_list FROM table)。X39。 查找哪個部門沒有員工 (表 employees中有一行數(shù)據(jù)的 department_id為 null) SELECT department_id, department_name FROM departments d WHERE department_id NOT IN (SELECT department_id FROM employees)。IT_PROG39。IT_PROG39。IT_PROG39。IT_PROG39。 … … UNION ALL SELECT employee_id, job_id, department_id FROM employees UNION ALL SELECT employee_id, job_id, department_id FROM job_history ORDER BY employee_id。 MINUS SELECT employee_id FROM employees MINUS SELECT employee_id FROM job_history。 集合操作符與 ORDER BY ? ORDER BY 只能在整個查詢的最后面出現(xiàn)一次 ? ORDER BY 中指定的列,必須在第一個查詢語句中指定的列 ? 默認情況下,第一個查詢語句中的第一個列作為返回結(jié)果的排序依據(jù),順序為升序 多列子查詢 MultipleColumn Subqueries 主查詢 WHERE (MANAGER_ID, DEPARTMENT_ID) IN 子查詢結(jié)果 100 90 102 60 124 50 多列子查詢 MultipleColumn Subqueries ? 不成對比較 ? 成對比較 成對比較子查詢 返回與名字為 John的員工在同一個部門,且同一個領(lǐng)導(dǎo)的員工 SELECT employee_id, manager_id, department_id FROM empl_demo WHERE (manager_id, department_id) IN (SELECT manager_id, department_id FROM empl_demo WHERE first_name = 39。) AND first_name 39。 不成對比較子查詢 返回與名字為 John的員工中任意一個領(lǐng)導(dǎo)相符和任意一個部門相符的員工 當名字為 John多于一人時,與成對比較子查詢的返回結(jié)果不同。John39。John39。John39。 GET 主查詢 fetch到一行數(shù)據(jù) EXECUTE 子查詢根據(jù)這行數(shù)據(jù)的值進行運算 USE 根據(jù)子查詢的結(jié)果,決定是否返回這行數(shù)據(jù) 關(guān)聯(lián)子查詢 vs 嵌套子查詢 嵌套子查詢: 子查詢首先執(zhí)行,且執(zhí)行一次,返回相關(guān)結(jié)果 主查詢使用子查詢返回的結(jié)果進行一次運算 關(guān)聯(lián)子查詢: 主查詢 fetch到一行數(shù)據(jù) 根據(jù)這行數(shù)據(jù),進行子查詢運算 根據(jù)子查詢的結(jié)果,決定是否返回這行數(shù)據(jù) 重復(fù)以上過程,直到主查詢結(jié)束 使用關(guān)聯(lián)子查詢 SELECT column1, column2, ... FROM table1 WHERE column1 operator (SELECT column1, column2 FROM table2 WHERE expr1 = .expr2)。 WITH ? 使用 WITH,可以在查詢中多次引用相同的子查詢 ? 使用 WITH 返回的結(jié)果存放在臨時空間 ? 在復(fù)雜的查詢中適當使用 WITH,可以提高性能 WITH示例 WITH dept_costs AS ( SELECT , SUM() AS dept_total FROM employees e JOIN departments d ON = GROUP BY ), avg_cost AS ( SELECT SUM(dept_total)/COUNT(*) AS dept_avg FROM dept_costs) SELECT * FROM dept_costs WHERE dept_total (SELECT dept_avg FROM avg_cost) ORDER BY department_name。事務(wù)中的語句必須全部成功,否則必須全部回退。Finance39。 INSERT INTO departments (department_