模式
定義模式實際上定義了一個命名空間互躬,在這個空間中 可以進一步 定義該模式包含的數(shù)據(jù)對象,例如基本表烫饼,視圖起趾,索引等
創(chuàng)建模式
CREATE SCHEMA <模式名> AUTHORIZATION 用戶名
定義模式的同時,創(chuàng)建表隅肥,視圖竿奏,定義授權(quán)
CREATE SCHEMA <模式名> AUTHORIZATION <用戶名> [<表定義子句> | <視圖定義子句>|<授權(quán)定義子句>]
刪除模式
DROP SCHEMA <模式名> <CASCADE | RESTRICT>
CASCADE 級聯(lián)
RESTRICT 限制
表創(chuàng)建修改刪除
創(chuàng)建表
CREATE TABLE <表名>(<列名> <數(shù)據(jù)類型> [列級完整性約束條件] [,<列名> <數(shù)據(jù)類型> [列級完整性約束]] [,<表級完整性約束條件>]);
-
修改表:
ALTER TABLE <表名> [ADD <新列名> <數(shù)據(jù)類型> [完整性約束]] [DROP <完整性約束名>] [ALTER COLUMN <列名> <數(shù)據(jù)類型>]
- ADD: 添加新列和新的完整性約束條件
ALTER TABLE CategoriesNew ADD Commission money null
- DROP: 用戶刪除指定的完整性約束條件, 也可以用來刪除列
ALTER TABLE CategoriesNew DROP COLUMN Sales_date
- ALTER COLUMN 用戶修改原有的列定義腥放,包括修改列名和數(shù)據(jù)類型
ALTER TABLE CategoriesNew ALTER COLUMN name varchar(20) NOT NULL
- ADD: 添加新列和新的完整性約束條件
刪除表:
DROP TABLE <表名> [RESTRICT|CASCADE]
清空表數(shù)據(jù):
truncate table 表名稱
其他操作
- 重命名表:
exec sp_rename newPerson ,somePerson
- 修改列名:
exec sp_rename 'somePerson.name',newName ,'column'
復(fù)制表:
A. 復(fù)制整張表:(同時復(fù)制 表結(jié)構(gòu)和 數(shù)據(jù))
select * into new_table from old_table
B. 復(fù)制表結(jié)構(gòu):
select * into new_table from old_table where 1=2
C. 復(fù)制表內(nèi)容:
insert into new_tab select * from old_table
. 修改identity列
自增列不能直接修改泛啸,必須將原有ID列刪除,然后重新添加一列具有identity屬性的ID字段秃症。比如你要修改的字段名為ID:
alter table 表名 drop column ID
alter table 表名 add ID int identity(1,1)
視圖
- 建立視圖:
CREATE VIEW 視圖名 AS SELECT 列名1候址,列名2.列名3 FROM Student WHERE 條件
索引
- 建立索引
CREATE [UNIQUE][CLUSTER] INDEX <索引名> ON <表名> (<列名> [<次序>] [,<列名> [<次序>]]...);
例:
CREATE UNIQUE INDEX Stusno ON Student(Sno);
CREATE UNIQUE INDEX Coucno ON Course(Cno);
CREATE UNIQUE INDEX SCno ON SC(Sno ASC, Cno DESC)
- 刪除索引:
DROP INDEX <索引名>
索引實現(xiàn)的方式
B+ 樹 動態(tài)平衡
HASH 索引 查找速度快
關(guān)于 GROUP BY 和聚合函數(shù)
如果語句中有g(shù)roup by關(guān)鍵字,那么select后只能跟group by后出現(xiàn)的列种柑,或者是聚合函數(shù)
max() min() count(),sum(),avg()
表操作
單表數(shù)據(jù)查詢
一般格式:
SELECT [ALL|DISTINCT] <目標(biāo)列表達式> [,<目標(biāo)列表達式>]... FROM <表名或視圖名>[,<表名或視圖名>]... [WHERE <條件表達式>] [GROUP BY <列名1> [HAVING <條件表達式>]] [ORDER BY <列名2> [ASC|DESC]];
-
單表查詢
查詢指定列
SELECT Sno,Sname FROM Student
查詢?nèi)苛?br>
SELECT * FROM Student
查詢經(jīng)過計算的值
SELECT Sname, 2004-Sage FROM Student
指定別名
SELECT Sname 姓名, 'Year of Birth:' 生日, 2004-Sage 年齡岗仑, LOWER(Sdept) 部門
消除重復(fù)行
SELECT DISTINCT Sno FROM SC
查詢滿足條件的元祖 where
- 比較大小
= 等于 , > 大于, <小于, >= 大于等于, <= 小于等于, != 或 <> 不等于, !> 不大于, !< 不小于
-
確定范圍
BETWEEN...(下限)AND...(上限) 在什么范圍內(nèi)
NOT BETWEEN...AND... 不在范圍之內(nèi)
確定集合
in
屬性屬于指定集合-
字符匹配
[NOT] LIKE <匹配串> [ESCAPE <轉(zhuǎn)義字符>]
-
%
任意長度的字符串(包括0) -
_
任意單個字符 -
ESCAPE
轉(zhuǎn)義字符: 如WHERE Cname LIKE 'DB\_%I__'ESCAPE'\'
-
涉及空值的查詢
WHERE Grade IS NULL
多重條件查詢
AND OR
排序
ORDER BY
默認是升序 ASC
DESC 降序
- 聚集函數(shù) (主要用于服務(wù) GROUP BY)
COUNT([DISTINCT | ALL]) *
統(tǒng)計元祖?zhèn)€數(shù)
COUNT([DISTINCT | ALL] <列名>)
統(tǒng)計列個數(shù)
SUM([DISTINCT | ALL] <列名>)
列綜合(數(shù)值型)
AVG([DISTINCT | ALL]<列名>)
列平均值 (數(shù)值型)
MAX([DISTINCT | ALL] <列名>)
列 最大值
MIN([DISTINCT | ALL] <列名>)
列 最小值 - 分組
GROUP BY
多表數(shù)據(jù)查詢
鏈接查詢
-
等值查詢 和 非等值查詢
- 等值查詢:
SELECT 表1的列,表2的列 FROME 表1, 表2 WHERE 表1.列=表2.列
查詢 表一 和 表二 某個列相等條件下 的表信息(從表1 和 表2 摘出一些列 組成新的表)
- 等值查詢:
-
非等值查詢:
SELECT 表1的列聚请,表2的列 FROME 表1, 表2 WHERE 表1.列>表2.列
查詢 表一 的某個列 大于表2的某個列條件下 的表信息(從表1 和 表2 摘出一些列 組成新的表)
非等值查詢的比較運算符有:>
,<
,!=
,<>
,!>
,!<
自身鏈接 (自己鏈接自己)
如:
SELECT FIRST.Cno, SECOND.Cpno FROM Course FIRST, Course SECOND WHERE FIRST.Cpno=Second.Cno
外鏈接
-
LEFT JOIN
左鏈接 -
RIGHT JOIN
右鏈接 -
INNER JOIN
內(nèi)鏈接
復(fù)合條件連接
AND OR
嵌套查詢
- 帶有
IN
謂詞的子查詢
如:SELECT Sname FROM Student WHERE Sno IN (SELECT Sno From SC WHERE Cno=
2)
子查詢條件 不依賴于父查詢驶赏, 這類子查詢稱為不相關(guān)子查詢
如果子查詢的查詢條件依賴于父查詢炸卑,這種查詢 稱為 相關(guān)子查詢
- 帶有比較運算符的子查詢
如:SELECT Sno,Sname,Sdept FROM Student WHERE Sdept = (SELECT Sdept From Student WHERE Sname='劉晨')
子查詢一定要放到 比較運算符后面
相關(guān)子查詢的例子:
SELECT Sno,Cno FROM SC x WHERE Grade >= (SELECT AVG(Grade) FROM SC y WHERE y.Sno = x.Sno
)
執(zhí)行順序
- 外查詢中取一個 Sno 傳遞給 內(nèi)查詢
- 經(jīng)過內(nèi)查詢 得到 平均值 88
- 最后回到外查詢, 得到最終結(jié)果
- 帶有 ANY(SOME) 或 ALL 謂詞的子查詢
> ANY
大于子查詢結(jié)果中的某個值
> ALL
大于子查詢結(jié)果中的所有值
< ANY
小于子查詢結(jié)果中的某個值
< ALL
小于子查詢結(jié)果中的所有值
>= ANY
大于等于子查詢結(jié)果中的某個值
>= ALL
大于等于子查詢中的所有值
<= ANY
小于等于子查詢中的某個值
<= ALL
小于等于子查詢結(jié)果中的所有值
= ANY
等于子查詢結(jié)果中的某個值
= ALL
等于子查詢結(jié)果中的所有值(通常沒有實際意義)
!= 或 <> ANY
不等于子查詢結(jié)果中的某個值
!= 或 <> ALL
不等于子查詢結(jié)果中的任何一個值
如:SELECT Sname,Sage FROM Student WHERE Sage<ANY (SELECT Sage FROM Student WHERE Sdept='CS')
= | <>或者 != | < | <= | > | >= | |
---|---|---|---|---|---|---|
ANY | IN | -- | <MAX | <=MAX | >MIN | >=MIN |
ALL | -- | NOT IN | <MIN | <=MIN | >MAX | >=MAX |
表:ANY(或SOME)煤傍,ALL 謂詞與聚集函數(shù)盖文,IN 謂詞的等價轉(zhuǎn)換關(guān)系
- 帶有 EXISTS (NOT EXISTS)謂詞的子查詢
EXISTS 代表存在量詞 ,帶有 EXISTS 謂詞的子查詢不返回任何數(shù)據(jù)蚯姆, 只產(chǎn)生邏輯真值“ture” 或 邏輯假值"false"
如:SELECT Sname FROM Student WHERE EXISTS (SELECT * FROM SC WHERE Sno=Student.Sno AND Cno='1')
-
集合查詢: 并集
UNION
,交集INTERSECT
,差EXCEPT
SELECT 語句1 UNION SELECT 語句2
如:SELECT * FROME Student Where Sdept='CS' UNION SELECT * FROM Student WHERE Sage<=19
表更新
-
插入數(shù)據(jù)
插入元祖
INSERT INTO <表名> (<屬性列1>五续,[<屬性列2 >...)] VALUES (<常量1>[,<常量2>]...)
如:INSERT INTO Student(Sno,Sname,Ssex,Sdept,Sage) VALUES ('201710093','王斌斌','男','IS',18)
插入子查詢結(jié)果
INSERT INTO <表名> (<屬性列1>[,<屬性列2>...])
如:INSERT INTO Dept_age(Sdep,Avg_age) SELECT Sdept,AVG(Sage) FROM Student GROUP BY Sdept
-
修改表
UPDATE <表名> SET <列名>=<表達式>[,<列名=<表達式>]...[WHERE <條件>]
- 修改某一個元祖的值
如:UPDATE Student SET Sage=22 WHERE Sno='201710092'
- 修改多個元祖的值
如:UPDATE Student SET Sage=Sage+1
- 帶子查詢的修改語句
如:UPDATE SC SET Grade = 0 WHERE 'CS'=(SELECT Sdept FROM Student WHERE Student.Sno = SC.Sno)
- 修改某一個元祖的值
-
刪除數(shù)據(jù)
DELETE FROM <表> [WHERE <條件>]
- 刪除某一個元祖的值
DELECT FROM Student WHERE Sno='201710092'
- 刪除多個元祖的值
DELETE FROM SC
- 帶子查詢的刪除語句
DELETE FROM SC WHERE 'CS'=(SELECT Sdept FROM Student WHERE Student.Sno=SC.Sno)
- 刪除某一個元祖的值
視圖
- 建立視圖
CREATE VIEW <視圖名> [(<列名>[,<列名>]...)] AS <子查詢> [WITH CHECK OPTION]
如:CREATE VIEW IS_Student AS SELECT Sno,Sname,Sage FROM Student WHERE Sdept='IS'
- 不許有
ORDER BY
- 不許有
DISTINCT
- 不許有
WITH CHECK OPTION
表示對視圖進行UPDATE,INSERT 和 DELETE操作時蒋失,要保證更新返帕,插入或者刪除的行滿足視圖定義中的謂詞條件(即子查詢中的條件表達式)
組成視圖的屬性列名,要么全部省略 要么全部指定篙挽。
下面三種情況 必須指明所有列名
- 某個目標(biāo)列不是單純的屬性名荆萤,而是聚集函數(shù)或數(shù)列表達式
如:CREATE VIEW BT_S(Sno,Sname,Sbirth) AS SELECT Sno,Sname,2017-Sage FROM Student
- 多表鏈接時選出了幾個同名列作為視圖的字段
如:CREATE VIEW IS_SI(Sno,Sname,Grade) AS SELECT Student, Sno,Sname,Grade FROM Student,SC WHERE Sdept='IS' AND Student.Sno=SC.Sno AND SC.Cno='1'
- 需要在視圖中衛(wèi)某個列啟用新的更合適的名字
-
刪除視圖
DROP VIEW <視圖名> [CASCADE]
如:
DROP VIEW IS_SI CASCADE
查詢視圖 (同查表)
-
更新視圖 (同更新表)
- 若視圖是由兩個以上基本表導(dǎo)出的,則此視圖不允許更新
- 若視圖的字段來自字段表達式或常數(shù),則不允許對此視圖執(zhí)行
INSET
和UPDATE
操作链韭, 但允許DELETE
操作 - 若視圖的字段來自聚集函數(shù)偏竟,則此視圖不允許更新
- 若視圖定義中 含有
GROUP BY
子句, 則此視圖不允許更新 - 若視圖定義中含有
DISTINCT
短語敞峭, 則此視圖不允許更新 - 若視圖定義中有嵌套查詢踊谋,并且內(nèi)層查詢的
FROM
子句中涉及的表也是導(dǎo)出該視圖的基本表,則此視圖不允許更新旋讹。 - 一個不允許更新的視圖上定義的視圖也不允許更新
-
視圖的作用
- 視圖能簡化用戶的操作
- 視圖使用戶能以多種角度看待同一數(shù)據(jù)
- 視圖對重構(gòu)數(shù)據(jù)庫提供了一定程度的邏輯獨立性
- 視圖能夠?qū)C密數(shù)據(jù)提供安全保護
- 適當(dāng)?shù)睦靡晥D可以更清晰的表達查詢
數(shù)據(jù)庫性能調(diào)優(yōu)
《數(shù)據(jù)庫性能調(diào)優(yōu):原理與技術(shù)》
英文名
《Database Tuning:Principles,Experiments,and Troubleshooting Techniques》