MySQL深度知識(shí)四(摘自sql官方文檔)

SQL CHECK 約束
CHECK 約束用于限制列中的值的范圍岸蜗。
如果對(duì)單個(gè)列定義 CHECK 約束,那么該列只允許特定的值。
如果對(duì)一個(gè)表定義 CHECK 約束徒仓,那么此約束會(huì)在特定的列中對(duì)值進(jìn)行限制。

下面的 SQL 在 "Persons" 表創(chuàng)建時(shí)為 "Id_P" 列創(chuàng)建 CHECK 約束誊垢。CHECK 約束規(guī)定 "Id_P" 列必須只包含大于 0 的整數(shù)掉弛。
My SQL:
CREATE TABLE Persons
(
Id_P int NOT NULL,
LastName varchar(255) NOT NULL,
FirstName varchar(255),
Address varchar(255),
City varchar(255),
CHECK (Id_P>0)
)

如果需要命名 CHECK 約束,以及為多個(gè)列定義 CHECK 約束喂走,請(qǐng)使用下面的 SQL 語法:
CREATE TABLE Persons
(
Id_P int NOT NULL,
LastName varchar(255) NOT NULL,
FirstName varchar(255),
Address varchar(255),
City varchar(255),
CONSTRAINT chk_Person CHECK (Id_P>0 AND City='Sandnes')
)

如果在表已存在的情況下為 "Id_P" 列創(chuàng)建 CHECK 約束殃饿,請(qǐng)使用下面的 SQL:

ALTER TABLE Persons ADD CHECK (Id_P>0)
如果需要命名 CHECK 約束,以及為多個(gè)列定義 CHECK 約束芋肠,請(qǐng)使用下面的 SQL 語法:

ALTER TABLE Persons
ADD CONSTRAINT chk_Person CHECK (Id_P>0 AND City='Sandnes')
撤銷 CHECK 約束
如需撤銷 CHECK 約束乎芳,請(qǐng)使用下面的 SQL:
MySQL:
ALTER TABLE Persons DROP CHECK chk_Person

SQL DEFAULT 約束
DEFAULT 約束用于向列中插入默認(rèn)值。
如果沒有規(guī)定其他的值帖池,那么會(huì)將默認(rèn)值添加到所有的新記錄奈惑。
下面的 SQL 在 "Persons" 表創(chuàng)建時(shí)為 "City" 列創(chuàng)建 DEFAULT 約束:
CREATE TABLE Persons
(
Id_P int NOT NULL,
LastName varchar(255) NOT NULL,
FirstName varchar(255),
Address varchar(255),
City varchar(255) DEFAULT 'Sandnes'
)

通過使用類似 GETDATE() 這樣的函數(shù),DEFAULT 約束也可以用于插入系統(tǒng)值:
CREATE TABLE Orders
(
Id_O int NOT NULL,
OrderNo int NOT NULL,
Id_P int,
OrderDate date DEFAULT GETDATE()
)

如果在表已存在的情況下為 "City" 列創(chuàng)建 DEFAULT 約束睡汹,請(qǐng)使用下面的 SQL:

MySQL:
ALTER TABLE Persons ALTER City SET DEFAULT 'SANDNES'
撤銷 DEFAULT 約束
如需撤銷 DEFAULT 約束肴甸,請(qǐng)使用下面的 SQL:
MySQL:
ALTER TABLE Persons ALTER City DROP DEFAULT
CREATE INDEX 語句用于在表中創(chuàng)建索引。
在不讀取整個(gè)表的情況下帮孔,索引使數(shù)據(jù)庫應(yīng)用程序可以更快地查找數(shù)據(jù)雷滋。

索引
您可以在表中創(chuàng)建索引不撑,以便更加快速高效地查詢數(shù)據(jù)。
用戶無法看到索引晤斩,它們只能被用來加速搜索/查詢焕檬。
注釋:更新一個(gè)包含索引的表需要比更新一個(gè)沒有索引的表更多的時(shí)間,這是由于索引本身也需要更新澳泵。因此实愚,理想的做法是僅僅在常常被搜索的列(以及表)上面創(chuàng)建索引。

SQL CREATE INDEX 語法
在表上創(chuàng)建一個(gè)簡(jiǎn)單的索引兔辅。允許使用重復(fù)的值:
CREATE INDEX index_name ON table_name (column_name)
注釋:"column_name" 規(guī)定需要索引的列腊敲。
在表上創(chuàng)建一個(gè)唯一的索引。唯一的索引意味著兩個(gè)行不能擁有相同的索引值维苔。

CREATE UNIQUE INDEX index_name ON table_name (column_name)

CREATE INDEX 實(shí)例
本例會(huì)創(chuàng)建一個(gè)簡(jiǎn)單的索引碰辅,名為 "PersonIndex",在 Person 表的 LastName 列:
CREATE INDEX PersonIndex ON Person (LastName)
如果您希望以降序索引某個(gè)列中的值介时,您可以在列名稱之后添加保留字 DESC
CREATE INDEX PersonIndex ON Person (LastName DESC)
假如您希望索引不止一個(gè)列没宾,您可以在括號(hào)中列出這些列的名稱,用逗號(hào)隔開:
CREATE INDEX PersonIndex ON Person (LastName, FirstName)

通過使用 DROP 語句沸柔,可以輕松地刪除索引循衰、表和數(shù)據(jù)庫。

我們可以使用 DROP INDEX 命令刪除表格中的索引褐澎。
ALTER TABLE table_name DROP INDEX index_name

DROP TABLE 語句用于刪除表(表的結(jié)構(gòu)会钝、屬性以及索引也會(huì)被刪除):
DROP TABLE 表名稱
DROP DATABASE 語句用于刪除數(shù)據(jù)庫:
DROP DATABASE 數(shù)據(jù)庫名稱
如果我們僅僅需要除去表內(nèi)的數(shù)據(jù),但并不刪除表本身工三,那么我們?cè)撊绾巫瞿兀?br> 請(qǐng)使用 TRUNCATE TABLE 命令(僅僅刪除表格中的數(shù)據(jù)):
TRUNCATE TABLE 表名稱

ALTER TABLE 語句
ALTER TABLE 語句用于在已有的表中添加迁酸、修改或刪除列。

SQL ALTER TABLE 語法
如需在表中添加列俭正,請(qǐng)使用下列語法:
ALTER TABLE table_name ADD column_name datatype
要?jiǎng)h除表中的列胁出,請(qǐng)使用下列語法:
ALTER TABLE table_name DROP COLUMN column_name

注釋:某些數(shù)據(jù)庫系統(tǒng)不允許這種在數(shù)據(jù)庫表中刪除列的方式 (DROP COLUMN column_name)。
要改變表中列的數(shù)據(jù)類型段审,請(qǐng)使用下列語法:
ALTER TABLE table_nameALTER COLUMN column_name datatype

希望在表 "Persons" 中添加一個(gè)名為 "Birthday" 的新列全蝶。
ALTER TABLE Persons ADD Birthday date

請(qǐng)注意,新列 "Birthday" 的類型是 date寺枉,可以存放日期抑淫。數(shù)據(jù)類型規(guī)定列中可以存放的數(shù)據(jù)的類型。
希望改變 "Persons" 表中 "Birthday" 列的數(shù)據(jù)類型
ALTER TABLE Persons ALTER COLUMN Birthday year
請(qǐng)注意姥闪,"Birthday" 列的數(shù)據(jù)類型是 year始苇,可以存放 2 位或 4 位格式的年份。

刪除 "Person" 表中的 "Birthday" 列:
ALTER TABLE Person DROP COLUMN Birthday

Auto-increment 會(huì)在新記錄插入表中時(shí)生成一個(gè)唯一的數(shù)字筐喳。
我們通常希望在每次插入新記錄時(shí)催式,自動(dòng)地創(chuàng)建主鍵字段的值函喉。
我們可以在表中創(chuàng)建一個(gè) auto-increment 字段。

用于 MySQL 的語法
下列 SQL 語句把 "Persons" 表中的 "P_Id" 列定義為 auto-increment 主鍵:
CREATE TABLE Persons
(
P_Id int NOT NULL AUTO_INCREMENT,
LastName varchar(255) NOT NULL,
FirstName varchar(255),
Address varchar(255),
City varchar(255),
PRIMARY KEY (P_Id)
)

MySQL 使用 AUTO_INCREMENT 關(guān)鍵字來執(zhí)行 auto-increment 任務(wù)荣月。
默認(rèn)地管呵,AUTO_INCREMENT 的開始值是 1,每條新記錄遞增 1哺窄。
要讓 AUTO_INCREMENT 序列以其他的值起始捐下,請(qǐng)使用下列 SQL 語法:
ALTER TABLE Persons AUTO_INCREMENT=100

要在 "Persons" 表中插入新記錄,我們不必為 "P_Id" 列規(guī)定值(會(huì)自動(dòng)添加一個(gè)唯一的值):
INSERT INTO Persons (FirstName,LastName) VALUES ('Bill','Gates')
上面的 SQL 語句會(huì)在 "Persons" 表中插入一條新記錄萌业。"P_Id" 會(huì)被賦予一個(gè)唯一的值坷襟。"FirstName" 會(huì)被設(shè)置為 "Bill","LastName" 列會(huì)被設(shè)置為 "Gates"生年。

視圖是可視化的表婴程。
本章講解如何創(chuàng)建、更新和刪除視圖抱婉。

什么是視圖排抬?
在 SQL 中,視圖是基于 SQL 語句的結(jié)果集的可視化的表授段。
視圖包含行和列,就像一個(gè)真實(shí)的表番甩。視圖中的字段就是來自一個(gè)或多個(gè)數(shù)據(jù)庫中的真實(shí)的表中的字段侵贵。我們可以向視圖添加 SQL 函數(shù)、WHERE 以及 JOIN 語句缘薛,我們也可以提交數(shù)據(jù)窍育,就像這些來自于某個(gè)單一的表。
注釋:數(shù)據(jù)庫的設(shè)計(jì)和結(jié)構(gòu)不會(huì)受到視圖中的函數(shù)宴胧、where 或 join 語句的影響漱抓。

SQL CREATE VIEW 語法
CREATE VIEW view_name AS SELECT column_name(s)
FROM table_name WHERE condition

注釋:視圖總是顯示最近的數(shù)據(jù)。每當(dāng)用戶查詢視圖時(shí)恕齐,數(shù)據(jù)庫引擎通過使用 SQL 語句來重建數(shù)據(jù)乞娄。

可以從某個(gè)查詢內(nèi)部、某個(gè)存儲(chǔ)過程內(nèi)部显歧,或者從另一個(gè)視圖內(nèi)部來使用視圖仪或。通過向視圖添加函數(shù)、join 等等士骤,我們可以向用戶精確地提交我們希望提交的數(shù)據(jù)范删。

樣本數(shù)據(jù)庫 Northwind 擁有一些被默認(rèn)安裝的視圖。視圖 "Current Product List" 會(huì)從 Products 表列出所有正在使用的產(chǎn)品拷肌。這個(gè)視圖使用下列 SQL 創(chuàng)建:

CREATE VIEW [Current Product List] AS
SELECT ProductID,ProductName
FROM Products WHERE Discontinued=No
可以查詢上面這個(gè)視圖:
SELECT * FROM [Current Product List]

Northwind 樣本數(shù)據(jù)庫的另一個(gè)視圖會(huì)選取 Products 表中所有單位價(jià)格高于平均單位價(jià)格的產(chǎn)品:
CREATE VIEW [Products Above Average Price] AS
SELECT ProductName,UnitPrice FROM Products
WHERE UnitPrice>(SELECT AVG(UnitPrice) FROM Products)
可以像這樣查詢上面這個(gè)視圖:
SELECT * FROM [Products Above Average Price]

另一個(gè)來自 Northwind 數(shù)據(jù)庫的視圖實(shí)例會(huì)計(jì)算在 1997 年每個(gè)種類的銷售總數(shù)到旦。請(qǐng)注意旨巷,這個(gè)視圖會(huì)從另一個(gè)名為 "Product Sales for 1997" 的視圖那里選取數(shù)據(jù):
CREATE VIEW [Category Sales For 1997] AS
SELECT DISTINCT CategoryName,Sum(ProductSales) AS CategorySales
FROM [Product Sales for 1997] GROUP BY CategoryName
可以像這樣查詢上面這個(gè)視圖:
SELECT * FROM [Category Sales For 1997]
也可以向查詢添加條件。現(xiàn)在添忘,我們僅僅需要查看 "Beverages" 類的全部銷量:
SELECT * FROM [Category Sales For 1997]
WHERE CategoryName='Beverages'

SQL 更新視圖
您可以使用下面的語法來更新視圖:
SQL CREATE OR REPLACE VIEW Syntax
CREATE OR REPLACE VIEW view_name AS
SELECT column_name(s)   FROM table_name  WHERE condition
希望向 "Current Product List" 視圖添加 "Category" 列采呐。我們將通過下列 SQL 更新視圖:
CREATE VIEW [Current Product List] AS
SELECT ProductID,ProductName,Category   FROM Products
WHERE Discontinued=No

SQL 撤銷視圖
您可以通過 DROP VIEW 命令來刪除視圖。
SQL DROP VIEW Syntax   DROP VIEW view_name

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末昔汉,一起剝皮案震驚了整個(gè)濱河市懈万,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌靶病,老刑警劉巖会通,帶你破解...
    沈念sama閱讀 216,544評(píng)論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異娄周,居然都是意外死亡涕侈,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,430評(píng)論 3 392
  • 文/潘曉璐 我一進(jìn)店門煤辨,熙熙樓的掌柜王于貴愁眉苦臉地迎上來裳涛,“玉大人,你說我怎么就攤上這事众辨《巳” “怎么了?”我有些...
    開封第一講書人閱讀 162,764評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵鹃彻,是天一觀的道長(zhǎng)郊闯。 經(jīng)常有香客問我,道長(zhǎng)蛛株,這世上最難降的妖魔是什么团赁? 我笑而不...
    開封第一講書人閱讀 58,193評(píng)論 1 292
  • 正文 為了忘掉前任,我火速辦了婚禮谨履,結(jié)果婚禮上欢摄,老公的妹妹穿的比我還像新娘。我一直安慰自己笋粟,他們只是感情好怀挠,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,216評(píng)論 6 388
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著害捕,像睡著了一般唆香。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上吨艇,一...
    開封第一講書人閱讀 51,182評(píng)論 1 299
  • 那天躬它,我揣著相機(jī)與錄音,去河邊找鬼东涡。 笑死冯吓,一個(gè)胖子當(dāng)著我的面吹牛倘待,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播组贺,決...
    沈念sama閱讀 40,063評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼凸舵,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來了失尖?” 一聲冷哼從身側(cè)響起啊奄,我...
    開封第一講書人閱讀 38,917評(píng)論 0 274
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎掀潮,沒想到半個(gè)月后菇夸,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,329評(píng)論 1 310
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡仪吧,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,543評(píng)論 2 332
  • 正文 我和宋清朗相戀三年庄新,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片薯鼠。...
    茶點(diǎn)故事閱讀 39,722評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡择诈,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出出皇,到底是詐尸還是另有隱情羞芍,我是刑警寧澤,帶...
    沈念sama閱讀 35,425評(píng)論 5 343
  • 正文 年R本政府宣布郊艘,位于F島的核電站荷科,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏暇仲。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,019評(píng)論 3 326
  • 文/蒙蒙 一副渴、第九天 我趴在偏房一處隱蔽的房頂上張望奈附。 院中可真熱鬧,春花似錦煮剧、人聲如沸斥滤。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,671評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽佑颇。三九已至,卻和暖如春草娜,著一層夾襖步出監(jiān)牢的瞬間挑胸,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,825評(píng)論 1 269
  • 我被黑心中介騙來泰國打工宰闰, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留茬贵,地道東北人簿透。 一個(gè)月前我還...
    沈念sama閱讀 47,729評(píng)論 2 368
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像解藻,于是被迫代替她去往敵國和親老充。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,614評(píng)論 2 353

推薦閱讀更多精彩內(nèi)容