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