sql查询百分之20到百分之40的数据_数据库基础学习——SQL语言知识总结(6)
1 視圖(View)
1.1什么是視圖
可以通過創建表的視圖來表現數據的邏輯子集或數據的組合。視圖是基于表或另一個視圖的邏輯表,一個視圖并不包含它自己的數據,它象一個窗口,通過該窗口可以查看或改變表中的數據。視圖基于其上的表稱為基表。
1.2視圖的優越性
? 視圖限制數據的訪問,因為視圖能夠選擇性的顯示表中的列。
? 視圖可以用來構成簡單的查詢以取回復雜查詢的結果。例如,視圖能用于從多表中查詢信息,而用戶不必知道怎樣寫連接語句。
? 視圖對特別的用戶和應用程序提供數據獨立性,一個視圖可以從幾個表中取回數據。
1.3視圖類型
簡單視圖和復雜視圖
1.4簡單視圖 和 復雜視圖的區別
視圖有兩種分類:簡單和復雜,基本區別涉及 DML (INSERT、UPDATE 和 DELETE)操作。
簡單視圖:
? 數據僅來自一個表
? 不包含函數或數據分組
? 能通過視圖執行 DML 操作
復雜視圖:
? 數據來自多個表
? 包含函數或數據分組
? 不允許通過視圖進行 DML 操作
1.5創建簡單視圖
create view temp_emp as select e.employee_id,e.last_name,e.salary from employees e;1.6用子查詢中的列別名創建視圖
如果在創建視圖的查詢語句中含有列別名,那么列別名將作為視圖的列名。
create view emp as select e.employee_id id,e.last_name name,12*e.salary sal from employees e;1.7 創建復雜視圖
create view dept_name1(name,minsal,maxsal,avgsal) as select d.department_name,min(e.salary) ,max(e.salary) ,avg(e.salary)avg from employees e,departments d where e.department_id =d.department_id group by d.department_name;1.8視圖中 DML 操作的執行規則
如果視圖中包含下面的部分就不能修改數據:
? 組函數
? GROUP BY 子句
? DISTINCT 關鍵字
? 用表達式定義的列
1.9拒絕 DML 操作
創建一個簡單視圖,包含 employees 表中的所有數據,單該視圖拒絕 DML 操作。
create view v_emp as select * from employees with read only;1.10內建視圖
? 內建視圖是一個帶有別名 (或相關名) 的可以在 SQL 語句中使用的子查詢。
? 一個主查詢的在 FROM 子句中指定的子查詢就是一個內建視圖。
內建視圖:內建視圖由位于 FROM 子句中命名了別名的子查詢創建。該子查詢定義一個可以在主查詢中引用數據源。
示例
顯示那些雇員低于他們部門最高薪水的雇員的名字、薪水、部門號和他們部門最高的薪水。
select em.last_name,em.salary,em.department_id, e.maxsal from employees em ,(select e.department_id, max(e.salary) maxsal from employees e group by e.department_id)e where em.department_id = e.department_id and em.salary < e.maxsal;1.11Top-N 分析
Top-N 查詢在需要基于一個條件,從表中顯示最前面的 n 條記錄或最后面的 n 條記錄時是有用的。該結果可以用于進一步分析,例如,用 Top-N 分析你可以執行下面的查詢類型:
1.11.2 執行“Top-N”分析
Top-N 查詢使用一個帶有下面描述的元素的一致的嵌套查詢結構:
?子查詢或者內建視圖產生數據的排序列表,該子查詢或者內建視圖包含 ORDER BY 子句來確保排序以想要的順序排列。為了取回最大值,需要用 DESC 參數。
? 在最后的結果集中用外查詢限制行數。外查詢包括下面的組成部分:
——ROWNUM 偽列,它為從子查詢返回的每一行指定一個從 1 開始的連續的值
—— 一個 WHERE 子句,它指定被返回的 n 行,外 WHERE 子句必須用一個<或者<=操作。
示例
從 EMPLOYEES 表中顯示掙錢最多的 3 個人的名字及其薪水。
select rownum ,last_name,salary from(select last_name, salary from employees order by salary desc) where rownum <=3;1.12Oracle 的分頁查詢
當查詢的結果集數據量過大時,可能會導致各種各樣的問題發生,例如:服務器資源被耗盡,因數據傳輸量過大而使處理超時,等等。最終都會導致查詢無法完成。解決這個問題的一個策略就是“分頁查詢”,也就是說不要一次性查詢所有的數據,每次只查詢一部分數據。這樣分批次地進行處理,可以呈現出很好的用戶體驗,對服務器資源的消耗也不大。
分頁查詢原則:
在內建視圖中通過 rownum 偽劣值的判斷來指定獲取數據的數量。
示例
查詢雇員表中數據,每次只返回 10 條數據。
select * from (select rownum rn,e.* from employees e) em where em.rn between 11 and 20;2 序列(Sequence)
2.1什么是序列
序列是用戶創建的數據庫對象,序列會產生唯一的整數。序列的一個典型的用途是創建一個主鍵的值,它對于每一行必須是唯一的。序列由一個 Oracle 內部程序產生并增加或減少。
序列是一個節省時間的對象,因為它可以減少應用程序中產生序列程序的代碼量。序列號獨立于表被存儲和產生,因此,相同的序列可以被多個表使用。
2.2創建序列
在語法中:
increment by n 指定序列號之間的間隔,在這兒 n 是一個整數 (如果該子句被省
略,序列增量為 1)
start with n 指定要產生的第一個序列數 (如果該子句被省略,序列從 1 開始)
maxvalue n 指定序列能產生的最大值
nomaxvalue n對于升序序列指定 10^27 為最大值,對于降序序列指定-1 為最大值(這是默認選項)
minvalue n 指定最小序列值
nominvalue n 對于升序序列指定 1 為最小值,對于降序序列指定-(10^26)為最小值(這是默認選項)
cycle/nocycle 指定序列在達到它的最大或最小值之后,是否繼續產生(NOCYCLE是默認選項)
cache/nocache 指定 Oracle 服務器預先分配多少值,并且保持在內存中(默認情況下,Oracle 服務器緩沖 20 個值)
示例
創建一個序列名稱為:dept_seq,增長間隔為 10,從 120 開始,最大值為 9999,不緩存。不循環使用。
create sequence dept_seq increment by 10 start with 120 maxvalue 9999 nocache nocycle;2.3查詢序列
通過數據字典表user_sequences查詢。
select sequence_name,increment_by,max_value,min_value,last_number from user_sequences;2.4使用序列
NEXTVAL 和 CURRVAL 偽列
? NEXTVAL 返回下一個可用的序列值,它每次返回一個唯一的被引用值,即使對于不同的用戶也是如此
? CURRVAL 獲得當前的序列值
? 在 CURRVAL 獲得一個值以前,NEXTVAL 對該序列必須發布
示例
在 location ID 2500 中插入一個新部門名稱 Support。
insert into departments(department_id,department_name,location_id) values(dept_seq.nextval,'Support',2500);查詢當前序列號
select deptseq.nextval,dept_seqval from dual;3 索引(Index)
3.1什么是索引
在關系型數據庫中,索引是一種單獨的、物理的對數據庫表中一列或多列的值進行排序的一種存儲結構,它是某個表中一列或若干列值的集合和相應的指向表中物理標識這些值的數據頁的邏輯指針清單。索引的作用相當于圖書的目錄,可以根據目錄中的頁碼快速找到所需的內容。
索引提供對表中行的直接和快速訪問,它的目的是用已索引的路徑快速定位數據以減少磁盤 I/O。索引由 Oracle 服務器自動使用和維護,索引邏輯地和物理地獨立于他們索引的表,這意味者索引可以在任何時候被創建或刪除,并且不影響基表或其它的索引。當刪除表時,相應的索引也被刪除。
3.2索引的類型
唯一性索引:當你在一個表中定義一個列為主鍵,或者定義一個唯一鍵約束時 Oracle服務器自動創建該索引,索引的名字習慣上是約束的名字。
非唯一索引:由用戶創建,例如,可以創建一個 FOREIGN KEY 列索引用于一個查詢中的連接來改進數據取回的速度。
3.3創建索引的方式
? 自動:在一個表的定義中,當定義一個 PRIMARY KEY 或 UNIQUE 約束時,一個
唯一索引被自動創建
? 手動:用戶能夠在列上創建非唯一的索引來加速對行的訪問。
3.4使用索引
過多也是件壞事在表上建立更多的索引并不意味者更快地查詢,在帶索引的表上被提交的每個 DML 操作意味者索引必須更新;與表聯系的索引越多,對 Oracle 數據庫的影響越大,Oracle 數據庫在每次 DML 操作之后必須更新所有的索引。
3.4.1什么時候創建索引
? 一個列包含一個大范圍的值
? 一個列包含很多的空值
? 一個或多個列經常同時在一個 WHERE 子句中或一個連接條件中被使用
? 表很大,并且經常的查詢期望取回少于百分之 2 到 4 的行。
3.4.2什么時候不創建索引
? 表很小
? 不經常在查詢中作為條件被使用的列
? 大多數查詢期望取回多于表中百分之 2 到 4 的行
? 表經常被更新
? 被索引的列作為表達式的的一部分被引用
3.5操作索引
3.5.1非唯一性索引的類型
oracle 的非唯一性索引:單行索引,復合索引(組合索引),函數索引。
3.5.2創建索引語法
創建單行索引
create index emp_index on employees(last_name);創建復合索引
create index dept_man_loc on departments(manager_id,location_id);創建函數索引
create index dept_upper2 on departments(upper(department_name));3.6查詢索引
利用數據字典表
示例
select IC.INDEX_NAME ,ic.COLUMN_NAME,ic.COLUMN_POS ITION,ix.uniqueness from user_indexes ix ,user_ind_columns ic where ix.index_name = ic.INDEX_NAME and ic.TABLE_NAME ='DEPARTMENTS'; select * from user_indexes where table_name='表名'; select * from user_ind_columns where index_name='索引名';4 同義詞(Synonym)
4.1什么是同義詞
同義詞可以除去對象名必須帶的方案限制,并提供給你一個可替換表名、視圖名、序列名和存儲過程名或其它對象名。該方法對具有特別長的對象的名字很有用。
4.2創建和刪除同義詞
create synonym em for employees; drop synonym em;5 創建用戶(User)
5.1什么是 Oracle 用戶
Oracle 用戶是用來連接數據庫和訪問數據庫對象的。
5.2創建用戶
需要具備創建用戶的權限可以使用 sys 或者 system 用戶來創建新用戶
create user u_test identified by 123456;5.3使用指定表空間創建用戶
create user u_bjsxt identified by 123456 default tablespace bjsxt temporary tablespace temp;5. 數據控制語言(DCL)
grant...授予用戶權限
revork..撤銷用戶權限
5 .1授予系統權限
5.1.1授予創建其他對象權限
– CREATE SESSION (會話)
– CREATE TABLE (創建表)
– CREATE SEQUENCE(創建序列)
– CREATE VIEW(創建視圖)
– CREATE PROCEDURE
– UNLIMITED TABLESPACE(永久表空間權限)
為 u_bjsxt 用戶分配創建表、創建視圖、創建序列權限以及使用永久表空間權限。
grant create table ,create view ,create sequence ,unlimited tablespace to u_bjsxt;5.2 撤銷權限
Revoke 權限 from 用戶。
revoke create table from u_bjsxt;5.3 Oracle 中的角色
角色是命名的可以授予用戶的相關權限的組,該方法使得授予、撤回和維護權限容易的
多。一個用戶可以使用幾個角色,并且幾個用戶也可以被指定相同的角色。
5.4創建角色并且授予權限給角色
創建角色
create role manager;授予權限給一個角色
grant create session,create table,create view,create sequence to manager;5.5授予一個角色給用戶
create user newbjsxt identified by oracle default tablespace bjsxt; grant unlimited tablespace to newbjsxt; grant manager to newbjsxt;5.6撤銷用戶角色
revoke manager from newbjsxt;總結
以上是生活随笔為你收集整理的sql查询百分之20到百分之40的数据_数据库基础学习——SQL语言知识总结(6)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: string转换成date类型_你竟然知
- 下一篇: 数据库和python的结合_MySQL数