SQL语言之创建数据库其他对象(视图)
創建數據庫其他對象(視圖)
一、視圖(view)
可以通過創建表的視圖來表現數據的邏輯子集或數據的組合。視圖是基于表或另一個視圖的邏輯表,一個視圖并不包含他自己的數據,他像一個窗口,通過該窗口可以查看或改變表中的數據。視圖基于其上的表稱為基表;
?視圖的優越性
1.視圖限制數據的訪問,因為視圖能夠選擇行的顯示表中的列;
2.視圖可以用來構成簡單的查詢以取回復雜查詢的結果。例:視圖能用于從多表中查詢信息,而用戶不必知道怎樣寫連接語句;
3.視圖對特別的用戶和應用程序提供數據獨立性,一個視圖可以從幾個表中取回數據;
?視圖類型
簡單視圖 和 復雜視圖
?區別
簡單和復雜,基本區別涉及dml(insert、update和delete)操作;
?簡單視圖
1.數據僅來自一個表;
2.不包含函數或數據分組
3.能通過視圖執行dml操作
?復雜視圖
1.數據來自多個表;
2.包含函數或數據分組;
3.不允許通過視圖進行dml操作;
?創建簡單視圖
(以hr用戶中的employees表為例)
例
創建一個視圖,視圖中包含部門 id 為 80 的員工的 id,名字以及薪水。 Create view as select e.employee_id , e.last_name , e.salary from employees e where e.department_id = 80;?使用子查詢中的列別名創建視圖
如果在創建視圖的查詢語句中含有列別名,那么列別名將作為視圖的列名;
(以hr用戶中的employees表為例)
例
創建一個視圖,包含部門 id 為 50 的員工 id 使用 ID_NUMBER 命名該列,包 含員工名字使用 NAME 命名該列,包含員工的年薪使用 ANN_SALARY 命名該列。Create view emp50 as select e.employee_id id_number , e.last_name name , e.salary ann_salary from employees e where e.department_id = 50;?從視圖中取回數據
(以hr用戶中的emp80、emp50為例)
例
1.查詢部門 id 為 80 的員工信息,包含他們的 id,名字以及薪水。Select * from emp80; 2.查詢部門 id 為 50 的員工信息,包含他們的 id 和薪水。Select e.id_number,e.ann_salary from emp50 e;?創建復雜視圖
(以hr用戶中的employees,departments表為例)
例
創建一個視圖,包含每個部門的部門名稱,部門最低薪水、部門最高薪水以及 部門的平均薪水。 Create view dept_name as Select de.department_name , min(em.salary) min, max(em.salary) max , avg(em.salary) avg from employees em , departments de where em.department_id = de.department_id group by de.department_name;?在定義視圖時指定列名
(以hr用戶中的employees,departments表為例)
例
創建一個視圖,包含每個部門的部門名稱、部門最低薪水、部門最高薪水以及部門 的平均薪水。將部門名稱命名為 name、最低薪水命名為 minsal、最高薪水命名為 maxsal、平均薪水命名為 avgsal。 Create view dept_name1(name,minsal,maxsal,avgsal) as select de.department_name ,min(em.salary) , max(em.salary) , avg(em.salary) from employees em , departments de where em.department_id = de.department_id group by de.department_name;?視圖中dml操作的執行規則
如果視圖中包含下面的部分就不能修改數據;
1.組函數;
2.Group by子句;
3.Distinct關鍵字;
4.用表達式定義的列;
(以hr用戶中的視圖emp80為例)
例
刪除 emp80 視圖中雇員 ID 為 190 的雇員。 Delete emp80 e where e.employee_id = 190;?拒絕dml操作
例
創建一個簡單視圖,包含 employees 表中的所有數據,單該視圖拒絕 DML 操作。 Create view emp90 as select * from employees with read only;?通過工具創建視圖
最后執行完之后需要點擊左上角的齒輪按鈕;
?刪除視圖
刪除視圖不會丟失數據,因為視圖時基于數據庫中的基本表的;
例
刪除名稱為 emp90 的視圖。 Drop view emp90;?內建視圖
1.一個帶有別名(或相關名)的可以在SQL語句中使用的子查詢;
2.一個主查詢在from子句中指定的子查詢就是一個內建視圖;
3.由于位于from子句中命名了別名的子查詢創建,該子查詢定義一個可以在主 查詢中引用數據源;
(以hr用戶中的employees表為例)
例
顯示那些雇員低于他們部門最高薪水的雇員的名字、薪水、部門號和他們部門 最高的薪水。 Select e.last_name,e.salary,e.department_id,es.maxsal from employees e ,(select em.department_id ,max(em.salary) maxsal from employees em group by em.department_id) es where e.department_id = es.department_id and e.salary < es.maxsal;?Top-n分析
查找在需求基于一個條件,從表中顯示最前面的n條記錄或最后面的n條記錄時是 有用的。
?執行top-n分析
查詢使用一個與下面描述的元素一致的嵌套查詢結構;
?子查詢或內建視圖產生數據的排序列表,該子查詢或內建視圖包含order by子句來確保排序以想要的順序排序。為了取回最大值,需要用的desc參數;
?在最后的結果集中用外查詢限制行數。外查詢包括:
1.Rownum偽列,它為從子查詢返回的每一行指定一個從1開始的連續的值;2.一個where子句,它指定被返回的n行,外where子句必須用一個<或<=操作;(以hr用戶中的employees表為例)
例
一、從 EMPLOYEES 表中顯示掙錢最多的 3 個人的名字及其薪水。 Select rownum,last_name,salary from (select e.last_name , e.salary from employees e order by e.salary desc) where rownum < 4;二、顯示公司中 4 個資格最老的雇員顯示他們的入職時間與名字。 Select rownum, hire_date , last_name from (select e.hire_date , e.last_name from employees e order by e.hire_date) where rownum < 5;?Oracle的分頁查詢
當查詢的結果集數據量過大時,可能會導致各種各樣的問題發生,例如:服務器資 源被耗盡,因數據傳輸量過大而使處理超時,等待。最終都會導致查詢無法完成。 解決這個問題的一個策略就是“分頁查詢”,也就是說不要一次性查詢所有數據, 每次只查詢一部分數據,這樣分批次的進行處理,可以呈現出很好的用戶體驗,對 服務器資源的消耗也不大。
分頁查詢原則
在內建視圖中通過rownum偽列值的判斷來指定獲取數據的數量;
(以hr用戶中的employees表為例)
例
查詢雇員表中數據,每次只返回 10 條數據。 Select * from (select rownum ru ,e.* from employees e) em where em.ru between 1 and 10;總結
以上是生活随笔為你收集整理的SQL语言之创建数据库其他对象(视图)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: SQL语言之定义约束
- 下一篇: SQL语言之序列(Oracle)