1哑舒、SQL簡(jiǎn)介
*結(jié)構(gòu)化查詢語(yǔ)言(Structured Query Language)簡(jiǎn)稱SQL,是一種特殊目的的編程語(yǔ)言橡娄,是一種數(shù)據(jù)庫(kù)查詢和程序設(shè)計(jì)語(yǔ)言拔莱,用于存取數(shù)據(jù)以及查詢、更新和管理關(guān)系數(shù)據(jù)庫(kù)系統(tǒng)匿又,同時(shí)也是數(shù)據(jù)庫(kù)腳本文件的擴(kuò)展名
*編寫規(guī)范
? ? 1) sql語(yǔ)句的所有表名方灾、字段名全部小寫,系統(tǒng)保留字碌更、內(nèi)置函數(shù)名裕偿、sql保留字大寫。
? ? 2) 連接符or针贬、in击费、and、以及=桦他、<=蔫巩、>=等前后加上一個(gè)空格。
? ? 3) 對(duì)較為復(fù)雜的sql語(yǔ)句快压、過(guò)程圆仔、函數(shù)加上注釋,說(shuō)明算法蔫劣、功能坪郭。
? ? 4) 多表連接時(shí),使用表的別名來(lái)引用列
2脉幢、DQL\DML語(yǔ)句
1歪沃、DDL(數(shù)據(jù)定義語(yǔ)言)是用來(lái)定義數(shù)據(jù)結(jié)構(gòu),完成數(shù)據(jù)庫(kù)對(duì)象的創(chuàng)建(CREATE)嫌松、修改(ALTER)沪曙、刪除(DROP)
數(shù)據(jù)庫(kù)對(duì)象包括:數(shù)據(jù)庫(kù)實(shí)例、數(shù)據(jù)表萎羔、視圖液走、索引、約束、觸發(fā)器缘眶、存儲(chǔ)過(guò)程
2嘱根、創(chuàng)建數(shù)據(jù)庫(kù)語(yǔ)法:CREATE DATABASE 數(shù)據(jù)庫(kù)名稱、查看已有的數(shù)據(jù)庫(kù):SHOW DATABASES巷懈、使用已創(chuàng)建的數(shù)據(jù)庫(kù):USE 數(shù)據(jù)庫(kù)名稱
在使用CREATE語(yǔ)句創(chuàng)建數(shù)據(jù)庫(kù)實(shí)例時(shí)该抒,要求滿足數(shù)據(jù)庫(kù)命名規(guī)范:數(shù)據(jù)庫(kù)名稱不能重復(fù)、數(shù)據(jù)庫(kù)命名可以使用字母砸喻、數(shù)字和下劃線柔逼,不能出現(xiàn)其他字符、數(shù)據(jù)庫(kù)命名不能超過(guò)30個(gè)字符割岛、數(shù)據(jù)庫(kù)命名不能與系統(tǒng)關(guān)鍵字沖突愉适、數(shù)據(jù)庫(kù)命名盡量有意義,比如體現(xiàn)數(shù)據(jù)庫(kù)屬于哪個(gè)系統(tǒng)使用
3癣漆、創(chuàng)建數(shù)據(jù)庫(kù)時(shí)维咸,有時(shí)為了避免亂碼,需要指定字符集
默認(rèn)使用的latin1字符集惠爽,語(yǔ)法:CREATE DATABASE 數(shù)據(jù)庫(kù)名? ? DEFAULT CHARACTER SET 字符集 COLLATE 校對(duì)集
例子:CREATE DATABASE test_db DEFAULT CHARACTER SET utf8 COLLATE utf8_generel_ci;
查看MySQL支持的字符集命令:SHOW CHARACTER SET癌蓖、查看MySQL字符集支持的校對(duì)集命令:SHOW COLLATION
MySQL對(duì)字符集的支持分為四個(gè)層次:服務(wù)器、數(shù)據(jù)庫(kù)婚肆、數(shù)據(jù)表租副、連接
查看各層級(jí)字符集命令: SHOW VARIABLES LIKE '%char%';查看校對(duì)集命令: SHOW VARIABLES LIKE '%collation%';
4、創(chuàng)建數(shù)據(jù)表
語(yǔ)法:CREATE TABLE 表名(屬性名稱 數(shù)據(jù)類型[約束],……)
查看已有的數(shù)據(jù)表命令:SHOW TABLES较性、查看已創(chuàng)建的數(shù)據(jù)表屬性命令:DESC 表名用僧,例子:
創(chuàng)建數(shù)據(jù)表時(shí),也需要遵循命名規(guī)范赞咙,規(guī)范和數(shù)據(jù)庫(kù)名稱相同
5责循、MySQL數(shù)據(jù)庫(kù)支持的數(shù)據(jù)類型:整型、浮點(diǎn)型攀操、字符串院仿、日期和時(shí)間
其他數(shù)據(jù)類型:enum數(shù)據(jù)類型、set數(shù)據(jù)類型
當(dāng)數(shù)據(jù)表中的屬性定義為這兩種類型時(shí)速和,代表只能從指定的集合中取值歹垫;它們之間的區(qū)別是:enum類型只能取一個(gè)值,set類型可以取多個(gè)值颠放。例子:
enum數(shù)據(jù)類型定義的集合最多允許有65535個(gè)成員值县钥、set數(shù)據(jù)類型定義的集合最多允許有64個(gè)成員值
6、數(shù)據(jù)表約束主要有:
1)主鍵約束(PRIMARY KEY):通過(guò)數(shù)據(jù)表中的一個(gè)或多個(gè)屬性能夠標(biāo)識(shí)表中的唯一一行記錄慈迈,這一個(gè)或多個(gè)屬性稱為該表的主鍵
主鍵約束體現(xiàn)關(guān)系數(shù)據(jù)庫(kù)的實(shí)體完整性:定義為主鍵的屬性不允許為空、定義為主鍵的屬性不允許輸入重復(fù)值、一個(gè)表只能有一個(gè)主鍵痒留、定義主鍵約束時(shí)谴麦,會(huì)在主鍵列自動(dòng)創(chuàng)建索引,加快對(duì)主鍵的查詢速度伸头;如果主鍵由多個(gè)屬性組成匾效,則必須定義為表級(jí)約束
2)外鍵約束(FOREIGN KEY):建立和強(qiáng)調(diào)兩個(gè)表之間的關(guān)聯(lián),確保數(shù)據(jù)的完整性和一致性
例:A表中的屬性是另外一個(gè)B表中能夠唯一確定一行記錄的鍵恤磷,這個(gè)屬性就稱為A表的外鍵面哼,其中B表為主表或外表,A表為從表
外鍵約束體現(xiàn)關(guān)系數(shù)據(jù)庫(kù)的參照完整性:
-主表中被子表外鍵關(guān)聯(lián)的屬性進(jìn)行更新或刪除操作,會(huì)關(guān)聯(lián)子表中的外鍵列
-子表中外鍵列輸入的數(shù)據(jù)必須是主表關(guān)聯(lián)屬性中已有的值
-主表中被外鍵關(guān)聯(lián)的屬性必須建立索引,因此一般主表的主鍵或唯一鍵可以作為從表的外鍵關(guān)聯(lián)屬性
-子表中的外鍵與主表中的關(guān)聯(lián)屬性數(shù)據(jù)類型要一致
-定義外鍵約束的表類型必須是InnoDB咆疗,只有InnoDB類型的表才支持外鍵
-對(duì)于非InnoDB表勒极,外鍵約束會(huì)被忽略
FOREIGN KEY指定test_table1表中的屬性name為外鍵約束
REFERENCES關(guān)聯(lián)父表test_table2中的主鍵屬性n
ON DELETE、ON UPDATE指明父表中對(duì)主鍵進(jìn)行刪除历帚、更新操作,不指定則表示不能進(jìn)行刪除、更新操作
CASCADE表明子表中外鍵字段值也會(huì)被更新或刪除政敢,除了CASCADE,還可以使用SET NULL(父表更新或刪除時(shí)胚迫,子表字段值設(shè)置為NULL)喷户、NO ACTION(父表更新或刪除時(shí),子表不進(jìn)行任何操作)
3)唯一約束(UNIQUE):確保不是主鍵的屬性不會(huì)出現(xiàn)重復(fù)數(shù)據(jù)访锻;定義唯一約束時(shí)褪尝,也會(huì)自動(dòng)創(chuàng)建唯一索引
唯一約束與主鍵約束的區(qū)別:
一個(gè)表只能定義一個(gè)主鍵約束,但是可以定義超過(guò)1個(gè)唯一性約束朗若;主鍵約束不允許屬性值為空恼五,而唯一性約束的屬性允許為空
4)非空約束(NOT NULL)、空值約束(NULL)? ? ? ? ? ?
5)默認(rèn)值約束(DEFAULT):即向表中插入數(shù)據(jù)時(shí)哭懈,如果用戶沒(méi)有明確給出屬性的值灾馒,數(shù)據(jù)庫(kù)會(huì)自動(dòng)為該屬性添加默認(rèn)值
?6)AUTO_INCREMENT:當(dāng)屬性列定義為AUTO_INCREMENT時(shí),能夠?yàn)樾虏迦氲男匈x值為上一次插入的值+1
MySQL要求AUTO_INCREMENT只能用于作為主鍵的列
數(shù)據(jù)表中的屬性可以同時(shí)定義多個(gè)約束遣总,但是需要注意:
如果同一個(gè)屬性有默認(rèn)值約束和其他約束睬罗,默認(rèn)值要寫在其他約束前面;如果同一個(gè)屬性有多個(gè)約束旭斥,中間使用空格分隔開(kāi)
在其他數(shù)據(jù)庫(kù)管理工具中容达,如SQL Server還支持檢查約束(check),但是MySQL數(shù)據(jù)庫(kù)不支持垂券,如果需要可以通過(guò)enum枚舉類型或者觸發(fā)器來(lái)實(shí)現(xiàn)檢查
在MySQL數(shù)據(jù)庫(kù)中創(chuàng)建數(shù)據(jù)表的同時(shí)花盐,也可以指定表類型和字符集(語(yǔ)法:CREATE TABLE 表名(……)[ENGINE=表類型][DEFAULT CHARSET=字符集])
字符集:和數(shù)據(jù)庫(kù)支持的字符集相同? ? ?表類型:在MySQL數(shù)據(jù)庫(kù)中常用的表類型有2個(gè)-InnoDB羡滑、MyISAM
默認(rèn)情況下創(chuàng)建的表類型是InnoDB
兩種常用的表類型各有優(yōu)劣,主要區(qū)別:
MyISAM類型強(qiáng)調(diào)性能算芯,執(zhí)行速度比InnoDB更快柒昏, 但不支持事務(wù)等高級(jí)處理;InnoDB類型支持事務(wù)熙揍、外鍵等高級(jí)數(shù)據(jù)庫(kù)功能
7职祷、修改數(shù)據(jù)庫(kù)(使用alter命令來(lái)完成數(shù)據(jù)庫(kù)的修改,一般是修改數(shù)據(jù)庫(kù)的字符集和校對(duì)集)
語(yǔ)法:ALTER DATABASE 數(shù)據(jù)庫(kù)名稱? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?DEFAULT CHARACTER 字符集 COLLATE 校對(duì)集
8届囚、修改數(shù)據(jù)表
新增屬性有梆,語(yǔ)法: ALTER TABLE 表名 ADD 屬性名稱 數(shù)據(jù)類型[約束]
例子: ALTER TABLE test_table ADD name VARCHAR(20) NOT NULL;
修改屬性,語(yǔ)法: ALTER TABLE 表名 MODIFY 屬性名稱 數(shù)據(jù)類型[約束]
語(yǔ)法: ALTER TABLE 表名 CHANGE 屬性名稱 屬性名稱 數(shù)據(jù)類型[約束]
例子: ALTER TABLE test_table MODIFY name VARCHAR(20);? ? ? ?ALTER TABLE test_table CHANGE name name VARCHAR(20);
9意系、修改屬性名稱泥耀,語(yǔ)法: ALTER TABLE 表名 CHANGE 屬性原名稱 屬性新名稱 數(shù)據(jù)類型[約束]
例子: ALTER TABLE test_table CHANGE name name_new VARCHAR(20);
刪除屬性,語(yǔ)法:ALTER TABLE 表名 DROP 屬性名稱
例子:ALTER TABLE test_table DROP name;如果表中只有一個(gè)屬性昔字,不允許刪除
10爆袍、新增屬性約束,語(yǔ)法:ALTER TABLE 表名 ADD CONSTRAINT 約束別名 約束
例子:ALTER TABLE test_table ADD CONSTRAINT PRIMARY KEY(id);
ALTER TABLE test_table ADD CONSTRAINT fk FOREIGN KEY test_table(name) REFERENCES test_table2(name);
ALTER TABLE test_table ADD CONSTRAINT un UNIQUE(name);? ? ? ? ? ALTER TABLE test_table ALTER id SET DEFAULT 20;
刪除屬性約束作郭,語(yǔ)法:ALTER TABLE 表名 DROP 約束
例子: ALTER TABLE test_table DROP PRIMARY KEY;? ? ? ? ? ? ? ? ? ? ? ? ? ALTER TABLE test_table DROP FOREIGN KEY fk;
11陨囊、修改表名,語(yǔ)法:ALTER TABLE 表名 RENAME TO 新表名? ? ? ? ? ? 語(yǔ)法:RENAME TABLE 原表名 TO 新表名
例子:ALTER TABLE test_table RENAME TO test_table_new;? ? ? ? ? ? ? ?RENAME TABLE test_table TO test_table_new;
12夹攒、刪除數(shù)據(jù)庫(kù)
語(yǔ)法:DROP DATABASE 數(shù)據(jù)庫(kù)名稱? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?例子: DROP DATABASE test_db;
刪除數(shù)據(jù)表
語(yǔ)法:DROP TABLE 表名? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?例子: DROP TABLE test_table;
刪除數(shù)據(jù)庫(kù)蜘醋、數(shù)據(jù)表時(shí),如果數(shù)據(jù)庫(kù)咏尝、數(shù)據(jù)表不存在压语,命令執(zhí)行會(huì)出錯(cuò)
當(dāng)不確定數(shù)據(jù)庫(kù)、數(shù)據(jù)表是否存在時(shí)编检,可以增加控制流語(yǔ)句來(lái)判斷胎食,避免命令出錯(cuò)
例子: DROP DATABASE IF EXISTS test_db;? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? DROP TABLE IF EXISTS test_table;
IF EXISTS或者IF NOT EXISTS同樣可以用于數(shù)據(jù)庫(kù)、數(shù)據(jù)表的創(chuàng)建
DML(數(shù)據(jù)操縱語(yǔ)言)是用于維護(hù)數(shù)據(jù)表中的具體數(shù)據(jù)允懂,完成數(shù)據(jù)的增加(INSERT)厕怜、更新(UPDATE)、刪除(DELETE)
13蕾总、數(shù)據(jù)插入粥航,語(yǔ)法:INSERT INTO 表名(屬性1,屬性2,……) VALUES(值1,值2,……)? ? ? ?
例子:INSERT INTO test_table(id,name)VALUES(1,'zhangsan');
向數(shù)據(jù)表中插入數(shù)據(jù)時(shí),值與屬性要一一對(duì)應(yīng)生百,且數(shù)據(jù)類型要匹配递雀;還需要注意屬性的約束要滿足;當(dāng)使用INSERT語(yǔ)句向表中插入數(shù)據(jù)時(shí)蚀浆,如果不指定具體屬性缀程,則表示向所有屬性中插入數(shù)據(jù)
例子: INSERT INTO test_table VALUES(1,'zhangsan');
特殊用法:將一張表中的數(shù)據(jù)插入到另外一張表搜吧;語(yǔ)法:INSERT INTO 表名1(屬性1,….) SELECT 表名2.屬性1,…. FROM 表名2
例子: INSERT INTO test_table1 SELECT id,name FROM test_table;
需要注意,在當(dāng)前這種用法中杠输,SELECT語(yǔ)句查詢到的屬性值和向表1中插入的屬性要一一對(duì)應(yīng)赎败,且數(shù)據(jù)類型要相同,屬性約束要滿足
14蠢甲、數(shù)據(jù)更新
語(yǔ)法:UPDATE 表名 SET 屬性1=新值1,屬性2=新值2,..[WHERE條件子句];例子: UPDATE test_table SET name='lisi' WHERE id=1
UPDATE語(yǔ)句會(huì)將數(shù)據(jù)表中滿足WHERE條件的對(duì)應(yīng)元組的屬性1据忘、屬性2…更新為新的值
如果后面不接WHERE條件子句鹦牛,則會(huì)更新整張表的所有數(shù)據(jù)
15、數(shù)據(jù)刪除
語(yǔ)法:DELETE FROM 表名 [WHERE條件子句]? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 例子: DELETE FROM test_table WHERE id=1;
DELETE語(yǔ)句會(huì)將數(shù)據(jù)表中滿足WHERE條件的對(duì)應(yīng)元組刪除勇吊;如果后面不接WHERE條件子句曼追,則會(huì)刪除數(shù)據(jù)表中的所有數(shù)據(jù)
另外一種刪除數(shù)據(jù)的方法,語(yǔ)法:TRUNCATE TABLE 表名? ? ? ? ? ? ? ? ? ? 例子: TRUNCATE TABLE test_table;
TRUNCATE和DELETE的區(qū)別:
-DELETE可以通過(guò)WHERE條件選擇要?jiǎng)h除的部分?jǐn)?shù)據(jù)汉规,并返回被刪除的記錄數(shù)礼殊,使用靈活,但執(zhí)行速度不快
-TRUNCATE不能刪除指定的部分?jǐn)?shù)據(jù)针史,而且不會(huì)返回被刪除的記錄數(shù)晶伦,但執(zhí)行速度非常快