1.SQL的基本概念
1.基本表
一個關系對應一個基本表。基本表是獨立存在的表,不是由其他表導出的。一個,或者多個機泵表對應一個存儲檔案。
2.視圖
視圖是從一個或者幾個基本表導出的表,是一個虛表。資料庫中隻存放視圖的定義不存放視圖的資料,這些資料任然存放在導出視圖的基本表中。
2.SQL的主要特點
1.文法簡單,類似于英語的自然語言,簡潔易用。
2.SQL是一體化的語言,包括資料定義,資料查詢,資料操縱,和資料控制等方面的功能,可以完成資料庫活動中全部的工作。
3.SQL是一種非過程化的語言,使用者不需要關注具體的操作過程,不必了解資料的存取路徑。
4.SQL是一種面向集合的語言,每個指令的操作對象是一個或者對個關系,結果也是一個關系。
5.SQL 既是自含式語言又是嵌入式語言。自含式語言可以獨立使用互動式指令,嵌入式語言可以将其嵌入到進階語言中使用。
3.SQL的運用
1.建立資料庫
create database 資料庫名
[on
(
name=資料檔案的邏輯名稱,
filename='路徑+資料檔案名',
size=資料檔案的初始大小,
maxsize=資料檔案的最大容量,
filegrowth=日志檔案自動增長的容量,
)]
[log on (
name=日志檔案邏輯名稱,
filename='路徑+日志檔案名',
size=日志檔案初始檔案大小,
maxsize=日志檔案的最大容量,
filengrowth=日志檔案自動增長容量’
)]
[collate資料庫校驗方式名稱]
[for attach]
說明
(1)[]中的語句在建立資料庫的過程中可以選用或者不用。
(2)資料庫校驗方式可以使Windows校驗也可以是SQL校驗方式。
(3)for attach 表示将已經存在的資料檔案附加到新的資料庫檔案中。
2.修改資料庫
可以使用 alter database 指令修改資料庫。(隻有資料庫管理者(DBA)或者有 create database 權限的人員才有權執行此指令)。
alter database 資料庫名稱
add file(
具體檔案格式
)
說明
(1)add file:向資料庫中添加資料檔案
(2)add log file :向資料庫中添加日志檔案
(3)remove flie :從資料庫中删除邏輯檔案,并删除實體檔案
(4)modify file :指定要修改的檔案
(5)add filegroup:向資料庫中添加檔案組
3.删除數使用者據庫
drop database 資料庫的名稱
2.資料表的建立和使用
1.建立資料表
create 表名
(列名 資料類型(長度)[限制]
……
)
說明
1.定義資料表的限制
(1)null/not null 限制
既不是空格,也不是0,更不是null字元串,而是表示,不知道,不确定,或者沒有資料。
(2)unique限制
用于指明基本表在某一列或者多個列的組合上取值必須唯一。定義了唯一限制的那些列稱為唯一鍵,系統會自動為唯一鍵建立唯一索引,進而保證了唯一鍵的唯一性。
(3)primary key 限制(主鍵限制)
用于定義基本表的主鍵,其唯一辨別作用,其值不能為空,也不能重複,以保證明體的的完整性
(4)check 限制
check限制用來檢查字段所允許的範圍。
2.修改資料表
(1)add方式。用于增加新列和完整性限制。定義的方式和 create table 中的定義方式相同。
(2)alter方式。用于修改某些列。
注意
該方式不能改變列名,不能将含有空值的列的定義修改為 not null限制 ,如果列中已有資料則不能改變列的寬度,也不能改變其資料類型,智能修改 null/not null 限制 ,修改其他的限制的時候必須先将其删除然後重新定義新的限制。
(3)drop方式。隻用于删除完整性限制定義
3.删除基本表
drop table 表名
3.單關系(表)資料的查詢
1.查詢的結構
select 列名[all|ditinct][as 别名]
from 表名
[where 檢索的條件]
[group by 列名 having 條件表達式]
[ order by 列名[asc|desc] ]
2.無條件查詢
相當于隻進行投影操作
select sno
from s
3.條件查詢
需要使用到where子句,通常有三部分構成,
(1)列名
(2)比較運算符
(3)列名,常數
4.常用的庫函數以及統計彙總查詢
注意
函數SUM和函數AVG隻能對數值字段進行計算
5.分組查詢
使用group by子句可以将查詢的結果按照屬性列或者屬性列的組合在行的方向上進行分組,每組在屬性列或者屬性列的組合上值是相同的。
如果在分組後好需要進行一定條件的篩選操作,則需使用having子句。having子句作用于組,選擇滿足于條件的組。必須使用在group by 子句之後,但是group by子句可以不需要having子句。
6.查詢結果排序
當需要對查詢的結果排序的時候需要使用order by子句,order by子句必須出現在其他子句之後。排序的方式可以自己指定,升序(asc),降序(desc),如果不指定,預設為升序。
4.多關系(表)的連接配接查詢
1.查詢結構
1.表之間滿足一定條件進行連接配接時,from子句指明進行連接配接的表名,where子句指明連接配接的條件以及連接配接的列名。
2.利用關鍵字JOIN進行連接配接
(1)inner join内連接配接(預設方式)
(2)left join 左外連接配接,用于顯示符合條件的資料行以及左邊表中不符合條件的數行,此時右邊的資料行使用NULL來表示。
(3)right join 右外連接配接,用于顯示符合條件的資料以及右邊表中不符合條件得資料行,缺乏資料時用NULL來顯示。
(4)full join顯示符合條件的資料以及左邊和右邊不符合條件的資料行,缺乏資料時用NULL來顯示。
(5)cross join 講一個表的每一個記錄和另一個表的每個記錄皮胚比對成新的資料行。
當join關鍵字放在from子句中是應該有關鍵字on與之對應,以表明連接配接的條件。
2.内連接配接查詢
查詢所有選課學生的學号,成績,姓名、選課名稱
select sno ,score,sn,cn
from s,c,sc
where s.sno=sc.sno and c.cno=sc.cno
3.外連接配接查詢
外連接配接查詢分為左外連接配接和右外連接配接,主表在左稱為左外連接配接,主表在右稱為右外連接配接。
4.交叉查詢
對連接配接查詢(cross join)的表沒有任何特殊的要求,任何表都可以交叉查詢操作。
5.自連接配接查詢
當一個表與自身進行連接配接操作時,稱為表的自連接配接查詢。
5.子查詢
當where子句包含一個 select-from-where的查詢塊的時候,該查詢塊稱之為子查詢或者稱為嵌套查詢。
子查詢的嵌套最多可以達到255層。
嵌套查詢的執行時由裡向外的,每一個子查詢的結果都會被父查詢用到。
1.普通子查詢
執行順序,先執行子查詢,然後将子查詢的結果作為父查詢的條件。普通的子查詢隻執行一次。
1.傳回一個值的普通子查詢
當子查詢傳回隻有一個值的時候,可以使用比較運算符将父查詢和子查詢連接配接起來
2.傳回一組值的普通子查詢
如果子查詢的傳回值不隻是一個的時候,而是一個集合的時候,不能直接使用比較運算符,可以在比較運算符和子查詢直接使用any或all
any的含義是任何一個的意思,all的意思是全部的意思。
可以使用in來代替“=any”
2.相關子查詢
相關子查詢的執行順序是,先去父查詢中的第一行記錄,内部的子查詢使用此行中相關的屬性值進行查詢,然後父查詢根據子查詢傳回的結構判斷此行是否滿足查詢條件。如果滿足,把該行放入父查詢的查詢結果集合中。重複執行這一結果直到處理完父查詢中的每一行的資料。即,相關子查詢的執行次數是由父查詢表的行數決定的。
6.其他類型的查詢
1.集合運算查詢
使用union操作符将來自不同查詢的資料組合起來,形成一個具有綜合資訊的查詢結果。union會自動将重複的資料行剔除掉,但是參加集合查詢的各子查詢的使用的表結構應該相同,即各子查詢中的資料數目和對應的資料類型都必須相同。
2.将查詢的幾結果存儲到表中
使用select……into語句可以将查詢的結果存儲到一個建立的資料庫表或者臨時表中
7.資料表中的資料操作
1.添加資料表中的資料
将新的記錄添加到一個已經存在的表中。
1.添加一行新記錄
insert……into 表名 [列名]
values(值)
注意
(1)表名是要添加記錄的表的名字
(2)values子句是要添加的具體的值
(3)列名的順序不一定要和定義表的時候列的順序一緻,但是,values添加得資料的順序必須要和列名一一對應,即個數相等,資料類型對應。
(4)values中的資料必須用逗号分開,字元型資料必須要用單引号括起來,
添加多行記錄
添加多行資料用于表間的複制,即将一個表中的多行資料抽取數行添加到另一個表中可以通過子查詢來實作
insert into 表名
子查詢
2.修改資料表中的資料
使用update語句對表中的一行或者多行的資料的某些列進行修改
update 表名
set列名=表達式
[where 條件]
3.删除表中的資料
使用delete語句可以删除表中的一行或者多行的資料
delete
from 表名
[where 條件]
注意
(1)其中表名是指要删除資料的資料表
(2)如果沒有where子句,則代表删除的是整個資料表中的記錄
8.視圖
視圖是一個虛拟表,其内容由查詢定義。視圖在資料庫中并不是以資料值存儲集形式存在,除非是索引視圖。視圖中的行和列資料來自定義視圖的查詢所引用的基本表,并且在引用視圖時動态生成。
視圖的作用類似于篩選。
1.視圖的建立
使用create view語句建立視圖
create view 視圖名
as select[(列名)]
from 表名
where 條件
說明
(1)視圖的通路僅限于指定的列,進而達到了資料保密的目的
2.修改視圖
使用alter view語句實作對視圖的修改
alter view 視圖名[視圖清單]
as 子查詢
3.視圖的删除
使用drop view實作對視圖的删除
drop view 視圖名
4.視圖的查詢
視圖的查詢和對基本表的查詢操作一樣
5.更新視圖
更新視圖包括添加,修改,删除資料操作,其文法的格式同對基本表的操作一樣
1.添加
insert into 視圖名[(列名)]
values (值)
2.修改
update 視圖名
set 列名=表達式
where 條件
3.删除
delete
from 視圖名
where 條件
9.索引
1.索引的概述
索引是一種可以加快檢索的資料庫結構,它包含從表或者視圖一列或者多列生成的鍵,以及映射到指定資料存儲位置的指針。
通過設計、創造良好的索引可以顯著的提高資料庫的查詢和應用程式的性能。
索引一旦建立,将由DBMS自動管理和維護。但是要避免在一個表中建立大量的索引,否則會影響插入,删除
更新資料庫的性能,增加索引調整的成本,降低系統的響應速度。
2.索引的分類
1.聚集索引
在聚集索引中,表中行的實體存儲順序與索引鍵的邏輯(索引)順序相同。
真正的實體存儲隻有一個,是以在一個表中,隻能包含一個聚集索引。建立和修改聚集索引會非常耗費時間,因為要涉及到實體存儲順序的調整。
可與考慮建立聚集索引的情況
(1)包含有限數量的唯一值的列。
(2)使用between,>、<、……等這樣運算符傳回的某個範圍值的查詢。
(3)傳回大型結果集的查詢。
2.非聚集索引
與聚集索引具有相似的索引結構,但是。不同的是,非聚集索引不影響資料行的實體存儲順序,資料行的實體存儲順序與索引鍵的邏輯(索引)順序不同。
每個資料表可以有多個非聚集索引,非聚集索引可以提高查詢資料的速度,但是,同樣會降低插入和更新資料的速度。
3.唯一索引
(1)唯一索引能夠保證索引鍵中不包含重複的值,進而使表中的每一行在某種方式上具有唯一性。
(2)隻有當唯一性是資料本身的特征時,指定唯一索引才有意義。
(3)聚集索引和非聚集索引都可以是唯一的,可以同為一個表建立一個聚集索引和多個非聚集索引,
(4)建立primary key和unique 限制的時候,會為指定的列自動建立唯一索引。
4.視圖索引
視圖的使用和基本表類似,是以對視圖建立唯一聚集索引後結果集就可以直接存儲子資料庫中,就像帶有聚集索引的基本表一樣。
如果很少更新基本表的資料可考慮使用視圖索引,效果會更佳。
5.全文索引
全文索引是目前搜尋引擎的關鍵技術之一。也稱為倒排文檔技術。其原理就是先定義一個詞庫,然後在文檔查找并存儲沒個詞條出現的位置和頻率。相當于對檔案履歷了一個以詞庫為目錄的索引,這樣查找某個詞的時候就可以很快的定位到改詞出現的位置。
6.xml索引
可以對xml類型的資料建立xml索引。
3.建立索引
可以使用create index語句建立索引,既可以建立聚集索引,又可以建立非聚集索引,既可以在一列上建立索引,也可以在多列上建立索引。
create [unique] [clustered|nonclustered] index 索引名
on 基本表或者視圖名(列名)
4.修改索引
通常情況下,索引建立後有DBMS自動維護更新。
5.删除索引
drop index 視圖或者表名.索引名
6.檢視索引
1.使用Sp_helpindex檢視索引
EXEC Sp_helpindex 表名