OracleSQL易錯知識點和外鏈接查詢

分類:編程 時間:2017-03-30
易錯知識點:
NULL表示:不可用、未賦值、不知道、不適用,它既不是0也不是空格。記住:一個數值與NULL進行四則運算,其結果是NULL 通配符:% 表示零個或多個字符,下劃線_ b表示一個字符。
select * from employees where last_name like '%\%%' escape '\' -- 制定反斜線後面的字符是轉義字符,當然反斜線也可以換成其他字符,這裏只是要通過escape告訴Oracle這個字符後面的是轉義字符
相關子查詢:子查詢中參考了外部主查詢中的表。非相關子查詢當作一張表來用(就是from子句中用一個子查詢構建一個表,不能是相關子查詢)
Oracle Not Exists 及 Not In 使用
SELECT A.VALUE FROM TEMP_A A WHERE A.ID BETWEEN 1 AND 100 AND NOT EXISTS (SELECT * FROM TEMP_B B WHERE A.VALUE = http://www.bitscn.com/pdb/oracle/201703/B.VALUE);
這時能查出結果
SELECT A.VALUE FROM TEMP_A A WHERE A.ID BETWEEN 1 AND 100 AND A.VALUE NOT IN (SELECT VALUE FROM TEMP_B);
此時查出的結果為空.
內表(temp_b)有空值. 用not in得到的結果集都為空.以下是結論:
1、對於not exists查詢,內表存在空值對查詢結果沒有影響;對於not in查詢,內表存在空值將導致最終的查詢結果為空。
2、對於not exists查詢,外表存在空值,存在空值的那條記錄最終會輸出;對於not in查詢,外表存在空值,存在空值的那條記錄最終將被過濾,其他數據不受影響。
使用exists 代替 in 案例:查詢所有屬於管理級別的員工信息 SELECT employee_id, last_name, job_id, department_id FROM employees WHERE employee_id IN (SELECT manager_id FROM employees WHERE manager_id IS NOT NULL); --使用exists 效率更高 SELECT employee_id, last_name, job_id, department_id FROM employees outer WHERE EXISTS (SELECT 'X' FROM employees WHERE manager_id = outer.employee_id);
Oracle with子句的使用 使用WITH好處:1) 如果在後面多次使用則可以簡化SQL ; 2) 適當提高SQL語句的性能
案例:查詢部門總工資在全公司所有部門的平均工資之上的部門名稱和部門的總工資 WITH dept_costs AS --創建第一個子查詢,得到各部門的總工資信息,結果集另外命名為臨時表dept_costs (SELECT d.department_name, SUM(e.salary) dept_total FROM employees e, departments d WHERE e.department_id = d.department_id GROUP BY d.department_name), avg_cost AS -- 創建第二個子查詢,使用第一個子查詢的結果集,計算每個部門的平均工資,得到的結果集作為臨時表avg_cost (SELECT SUM(dept_total) / COUNT(*) dept_avg FROM dept_costs) SELECT * FROM dept_costs WHERE dept_total > (SELECT dept_avg FROM avg_cost) -- 同時使用上面兩個結果集得到目的結果 ORDER BY department_name;

Oracle 中的外鏈接 分為左外連接和右外連接,左右是相對於主表和從表而言的。主表要顯示全部數據,通過外鏈接的從表中沒有對應的數據也要顯示出來(即為空)
例如:顯示每個員工所屬的部門,有的部門可能沒有員工,就顯示該部門的員工信息為空,但必須知道是哪個部門沒有員工,所以部門信息要求齊全,部門表是主表。這時候就使用外鏈接,部門表外鏈接員工表,使用部門ID SELECT d.department_name, d.department_id,e.last_name FROM departments d, employees e WHERE d.department_id = e.department_id(+); -- 為了避免外鏈接容易弄混淆,通常主表在左邊,從表在右邊,加號寫在從表的字段上。

Tags:

文章來源:


ads
ads

相關文章
ads

相關文章

ad