MYSQL 語(yǔ)法速成手冊(cè)

一吭狡、基本概念

數(shù)據(jù)庫(kù)術(shù)語(yǔ)

  • 數(shù)據(jù)庫(kù)(database) - 保存有組織的數(shù)據(jù)的容器(通常是一個(gè)文件或一組文件)生逸。

  • 數(shù)據(jù)表(table) - 某種特定類型數(shù)據(jù)的結(jié)構(gòu)化清單啦辐。

  • 模式(schema) - 關(guān)于數(shù)據(jù)庫(kù)和表的布局及特性的信息赞厕。模式定義了數(shù)據(jù)在表中如何存儲(chǔ)榔昔,包含存儲(chǔ)什么樣的數(shù)據(jù)驹闰,數(shù)據(jù)如何分解瘪菌,各部分信息如何命名等信息。數(shù)據(jù)庫(kù)和表都有模式嘹朗。

  • 列(column) - 表中的一個(gè)字段师妙。所有表都是由一個(gè)或多個(gè)列組成的。

  • 行(row) - 表中的一個(gè)記錄屹培。

  • 主鍵(primary key) - 一列(或一組列)默穴,其值能夠唯一標(biāo)識(shí)表中每一行。

SQL 語(yǔ)法

SQL(Structured Query Language)褪秀,標(biāo)準(zhǔn) SQL 由 ANSI 標(biāo)準(zhǔn)委員會(huì)管理蓄诽,從而稱為 ANSI SQL。各個(gè) DBMS 都有自己的實(shí)現(xiàn)媒吗,如 PL/SQL仑氛、Transact-SQL 等。

SQL 語(yǔ)法結(jié)構(gòu)

image

SQL 語(yǔ)法結(jié)構(gòu)包括:

  • 子句 - 是語(yǔ)句和查詢的組成成分闸英。(在某些情況下锯岖,這些都是可選的。)

  • 表達(dá)式 - 可以產(chǎn)生任何標(biāo)量值甫何,或由列和行的數(shù)據(jù)庫(kù)表

  • 謂詞 - 給需要評(píng)估的 SQL 三值邏輯(3VL)(true/false/unknown)或布爾真值指定條件出吹,并限制語(yǔ)句和查詢的效果,或改變程序流程沛豌。

  • 查詢 - 基于特定條件檢索數(shù)據(jù)趋箩。這是 SQL 的一個(gè)重要組成部分。

  • 語(yǔ)句 - 可以持久地影響綱要和數(shù)據(jù)加派,也可以控制數(shù)據(jù)庫(kù)事務(wù)叫确、程序流程、連接芍锦、會(huì)話或診斷竹勉。

SQL 語(yǔ)法要點(diǎn)

  • SQL 語(yǔ)句不區(qū)分大小寫,但是數(shù)據(jù)庫(kù)表名娄琉、列名和值是否區(qū)分次乓,依賴于具體的 DBMS 以及配置。

例如:SELECTselect 孽水、Select 是相同的票腰。

  • 多條 SQL 語(yǔ)句必須以分號(hào)(;)分隔。

  • 處理 SQL 語(yǔ)句時(shí)女气,所有空格都被忽略杏慰。SQL 語(yǔ)句可以寫成一行,也可以分寫為多行。

-- 一行 SQL 語(yǔ)句UPDATE user SET username='robot', password='robot' WHERE username = 'root';-- 多行 SQL 語(yǔ)句UPDATE userSET username='robot', password='robot'WHERE username = 'root';
  • SQL 支持三種注釋
## 注釋1-- 注釋2/* 注釋3 */

SQL 分類

數(shù)據(jù)定義語(yǔ)言(DDL)

數(shù)據(jù)定義語(yǔ)言(Data Definition Language缘滥,DDL)是 SQL 語(yǔ)言集中負(fù)責(zé)數(shù)據(jù)結(jié)構(gòu)定義與數(shù)據(jù)庫(kù)對(duì)象定義的語(yǔ)言轰胁。

DDL 的主要功能是定義數(shù)據(jù)庫(kù)對(duì)象

DDL 的核心指令是 CREATE朝扼、ALTER赃阀、DROP

數(shù)據(jù)操縱語(yǔ)言(DML)

數(shù)據(jù)操縱語(yǔ)言(Data Manipulation Language, DML)是用于數(shù)據(jù)庫(kù)操作擎颖,對(duì)數(shù)據(jù)庫(kù)其中的對(duì)象和數(shù)據(jù)運(yùn)行訪問工作的編程語(yǔ)句榛斯。

DML 的主要功能是 訪問數(shù)據(jù),因此其語(yǔ)法都是以讀寫數(shù)據(jù)庫(kù)為主肠仪。

DML 的核心指令是 INSERT肖抱、UPDATE备典、DELETE异旧、SELECT。這四個(gè)指令合稱 CRUD(Create, Read, Update, Delete)提佣,即增刪改查吮蛹。

事務(wù)控制語(yǔ)言(TCL)

事務(wù)控制語(yǔ)言 (Transaction Control Language, TCL) 用于管理數(shù)據(jù)庫(kù)中的事務(wù)。這些用于管理由 DML 語(yǔ)句所做的更改拌屏。它還允許將語(yǔ)句分組為邏輯事務(wù)潮针。

TCL 的核心指令是 COMMITROLLBACK倚喂。

數(shù)據(jù)控制語(yǔ)言(DCL)

數(shù)據(jù)控制語(yǔ)言 (Data Control Language, DCL) 是一種可對(duì)數(shù)據(jù)訪問權(quán)進(jìn)行控制的指令每篷,它可以控制特定用戶賬戶對(duì)數(shù)據(jù)表、查看表端圈、預(yù)存程序焦读、用戶自定義函數(shù)等數(shù)據(jù)庫(kù)對(duì)象的控制權(quán)。

DCL 的核心指令是 GRANT舱权、REVOKE矗晃。

DCL 以控制用戶的訪問權(quán)限為主,因此其指令作法并不復(fù)雜宴倍,可利用 DCL 控制的權(quán)限有:CONNECT张症、SELECTINSERT鸵贬、UPDATE俗他、DELETEEXECUTE阔逼、USAGE兆衅、REFERENCES

根據(jù)不同的 DBMS 以及不同的安全性實(shí)體,其支持的權(quán)限控制也有所不同涯保。

(以下為 DML 語(yǔ)句用法)

二诉濒、增刪改查

增刪改查,又稱為 CRUD夕春,數(shù)據(jù)庫(kù)基本操作中的基本操作未荒。

插入數(shù)據(jù)

  • INSERT INTO 語(yǔ)句用于向表中插入新記錄。

插入完整的行

INSERT INTO userVALUES (10, 'root', 'root', 'xxxx@163.com');

插入行的一部分

INSERT INTO user(username, password, email)VALUES ('admin', 'admin', 'xxxx@163.com');

插入查詢出來的數(shù)據(jù)

INSERT INTO user(username)SELECT nameFROM account;

更新數(shù)據(jù)

  • UPDATE 語(yǔ)句用于更新表中的記錄及志。
UPDATE userSET username='robot', password='robot'WHERE username = 'root';

刪除數(shù)據(jù)

  • DELETE 語(yǔ)句用于刪除表中的記錄片排。
  • TRUNCATE TABLE 可以清空表,也就是刪除所有行速侈。

刪除表中的指定數(shù)據(jù)

DELETE FROM userWHERE username = 'robot';

清空表中的數(shù)據(jù)

TRUNCATE TABLE user;

查詢數(shù)據(jù)

  • SELECT 語(yǔ)句用于從數(shù)據(jù)庫(kù)中查詢數(shù)據(jù)率寡。
  • DISTINCT 用于返回唯一不同的值。它作用于所有列倚搬,也就是說所有列的值都相同才算相同冶共。
  • LIMIT 限制返回的行數(shù)∶拷纾可以有兩個(gè)參數(shù)捅僵,第一個(gè)參數(shù)為起始行,從 0 開始眨层;第二個(gè)參數(shù)為返回的總行數(shù)庙楚。
  • ASC :升序(默認(rèn))
  • DESC :降序

查詢單列

SELECT prod_nameFROM products;

查詢多列

SELECT prod_id, prod_name, prod_priceFROM products;

查詢所有列

ELECT *FROM products;

查詢不同的值

SELECT DISTINCTvend_id FROM products;

限制查詢結(jié)果

-- 返回前 5 行SELECT * FROM mytable LIMIT 5;SELECT * FROM mytable LIMIT 0, 5;-- 返回第 3 ~ 5 行SELECT * FROM mytable LIMIT 2, 3;

三、子查詢

子查詢是嵌套在較大查詢中的 SQL 查詢趴樱。子查詢也稱為內(nèi)部查詢內(nèi)部選擇馒闷,而包含子查詢的語(yǔ)句也稱為外部查詢外部選擇

  • 子查詢可以嵌套在 SELECT叁征,INSERT纳账,UPDATE 或 DELETE 語(yǔ)句內(nèi)或另一個(gè)子查詢中。

  • 子查詢通常會(huì)在另一個(gè) SELECT 語(yǔ)句的 WHERE 子句中添加航揉。

  • 您可以使用比較運(yùn)算符塞祈,如 >,<帅涂,或 =议薪。比較運(yùn)算符也可以是多行運(yùn)算符,如 IN媳友,ANY 或 ALL斯议。

  • 子查詢必須被圓括號(hào) () 括起來。

  • 內(nèi)部查詢首先在其父查詢之前執(zhí)行醇锚,以便可以將內(nèi)部查詢的結(jié)果傳遞給外部查詢哼御。執(zhí)行過程可以參考下圖:

    image

子查詢的子查詢

SELECT cust_name, cust_contactFROM customersWHERE cust_id IN (SELECT cust_id                  FROM orders                  WHERE order_num IN (SELECT order_num                                      FROM orderitems                                      WHERE prod_id = 'RGAN01'));

WHERE

  • WHERE 子句用于過濾記錄坯临,即縮小訪問數(shù)據(jù)的范圍。

  • WHERE 后跟一個(gè)返回 true 或 false 的條件恋昼。

  • WHERE 可以與 SELECT看靠,UPDATE 和 DELETE 一起使用。

  • 可以在 WHERE 子句中使用的操作符

運(yùn)算符 描述
= 等于
<> 不等于液肌。注釋:在 SQL 的一些版本中挟炬,該操作符可被寫成 !=
> 大于
< 小于
>= 大于等于
<= 小于等于
BETWEEN 在某個(gè)范圍內(nèi)
LIKE 搜索某種模式
IN 指定針對(duì)某個(gè)列的多個(gè)可能值

SELECT 語(yǔ)句中的 WHERE 子句

SELECT * FROM CustomersWHERE cust_name = 'Kids Place';

UPDATE 語(yǔ)句中的 WHERE 子句

UPDATE CustomersSET cust_name = 'Jack Jones'WHERE cust_name = 'Kids Place';

DELETE 語(yǔ)句中的 WHERE 子句

DELETE FROM CustomersWHERE cust_name = 'Kids Place';

IN 和 BETWEEN

  • IN 操作符在 WHERE 子句中使用,作用是在指定的幾個(gè)特定值中任選一個(gè)值嗦哆。

  • BETWEEN 操作符在 WHERE 子句中使用谤祖,作用是選取介于某個(gè)范圍內(nèi)的值。

IN 示例

SELECT *FROM productsWHERE vend_id IN ('DLL01', 'BRS01');

BETWEEN 示例

SELECT *FROM productsWHERE prod_price BETWEEN 3 AND 5;

AND老速、OR粥喜、NOT

  • AND、OR橘券、NOT 是用于對(duì)過濾條件的邏輯處理指令额湘。

  • AND 優(yōu)先級(jí)高于 OR,為了明確處理順序约郁,可以使用 ()缩挑。

  • AND 操作符表示左右條件都要滿足。

  • OR 操作符表示左右條件滿足任意一個(gè)即可鬓梅。

  • NOT 操作符用于否定一個(gè)條件。

AND 示例

SELECT prod_id, prod_name, prod_priceFROM productsWHERE vend_id = 'DLL01' AND prod_price <= 4;

OR 示例

SELECT prod_id, prod_name, prod_priceFROM productsWHERE vend_id = 'DLL01' OR vend_id = 'BRS01';

NOT 示例

SELECT *FROM productsWHERE prod_price NOT BETWEEN 3 AND 5;

LIKE

  • LIKE 操作符在 WHERE 子句中使用谨湘,作用是確定字符串是否匹配模式绽快。

  • 只有字段是文本值時(shí)才使用 LIKE。

  • LIKE 支持兩個(gè)通配符匹配選項(xiàng):% 和 _紧阔。

  • 不要濫用通配符坊罢,通配符位于開頭處匹配會(huì)非常慢。

  • % 表示任何字符出現(xiàn)任意次數(shù)擅耽。

  • _ 表示任何字符出現(xiàn)一次活孩。

% 示例

SELECT prod_id, prod_name, prod_priceFROM productsWHERE prod_name LIKE '%bean bag%';

_ 示例

SELECT prod_id, prod_name, prod_priceFROM productsWHERE prod_name LIKE '__ inch teddy bear';

四、連接和組合

連接(JOIN)

  • 如果一個(gè) JOIN 至少有一個(gè)公共字段并且它們之間存在關(guān)系乖仇,則該 JOIN 可以在兩個(gè)或多個(gè)表上工作憾儒。
  • 連接用于連接多個(gè)表,使用 JOIN 關(guān)鍵字乃沙,并且條件語(yǔ)句使用 ON 而不是 WHERE起趾。
  • JOIN 保持基表(結(jié)構(gòu)和數(shù)據(jù))不變。
  • JOIN 有兩種連接類型:內(nèi)連接和外連接警儒。
  • 內(nèi)連接又稱等值連接训裆,使用 INNER JOIN 關(guān)鍵字。在沒有條件語(yǔ)句的情況下返回笛卡爾積嗜历。
  • 自連接可以看成內(nèi)連接的一種辑舷,只是連接的表是自身而已和媳。
  • 自然連接是把同名列通過 = 測(cè)試連接起來的盾舌,同名列可以有多個(gè)帮掉。
  • 內(nèi)連接 vs 自然連接
  • 內(nèi)連接提供連接的列单匣,而自然連接自動(dòng)連接所有同名列团南。
  • 外連接返回一個(gè)表中的所有行宗雇,并且僅返回來自次表中滿足連接條件的那些行钳恕,即兩個(gè)表中的列是相等的别伏。外連接分為左外連接、右外連接忧额、全外連接(Mysql 不支持)厘肮。
  • 左外連接就是保留左表沒有關(guān)聯(lián)的行。
  • 右外連接就是保留右表沒有關(guān)聯(lián)的行睦番。
  • 連接 vs 子查詢
  • 連接可以替換子查詢类茂,并且比子查詢的效率一般會(huì)更快。
image

內(nèi)連接(INNER JOIN)

SELECT vend_name, prod_name, prod_priceFROM vendors INNER JOIN productsON vendors.vend_id = products.vend_id;

自連接

SELECT c1.cust_id, c1.cust_name, c1.cust_contactFROM customers c1, customers c2

自然連接(NATURAL JOIN)

SELECT *FROM ProductsNATURAL JOIN Customers;

左連接(LEFT JOIN)

SELECT customers.cust_id, orders.order_numFROM customers LEFT JOIN ordersON customers.cust_id = orders.cust_id;

右連接(RIGHT JOIN)

SELECT customers.cust_id, orders.order_numFROM customers RIGHT JOIN ordersON customers.cust_id = orders.cust_id;

組合(UNION)

  • UNION 運(yùn)算符將兩個(gè)或更多查詢的結(jié)果組合起來托嚣,并生成一個(gè)結(jié)果集巩检,其中包含來自 UNION 中參與查詢的提取行。

  • UNION 基本規(guī)則

  • 所有查詢的列數(shù)和列順序必須相同示启。

  • 每個(gè)查詢中涉及表的列的數(shù)據(jù)類型必須相同或兼容兢哭。

  • 通常返回的列名取自第一個(gè)查詢。

  • 默認(rèn)會(huì)去除相同行夫嗓,如果需要保留相同行迟螺,使用 UNION ALL。

  • 只能包含一個(gè) ORDER BY 子句舍咖,并且必須位于語(yǔ)句的最后矩父。

  • 應(yīng)用場(chǎng)景

  • 在一個(gè)查詢中從不同的表返回結(jié)構(gòu)數(shù)據(jù)。

  • 對(duì)一個(gè)表執(zhí)行多個(gè)查詢排霉,按一個(gè)查詢返回?cái)?shù)據(jù)窍株。

組合查詢

SELECT cust_name, cust_contact, cust_emailFROM customersWHERE cust_state IN ('IL', 'IN', 'MI')UNIONSELECT cust_name, cust_contact, cust_emailFROM customersWHERE cust_name = 'Fun4All';

JOIN vs UNION

  • JOIN vs UNION

  • JOIN 中連接表的列可能不同,但在 UNION 中攻柠,所有查詢的列數(shù)和列順序必須相同球订。

  • UNION 將查詢之后的行放在一起(垂直放置),但 JOIN 將查詢之后的列放在一起(水平放置)辙诞,即它構(gòu)成一個(gè)笛卡爾積辙售。

五、函數(shù)

?? 注意:不同數(shù)據(jù)庫(kù)的函數(shù)往往各不相同飞涂,因此不可移植旦部。本節(jié)主要以 Mysql 的函數(shù)為例祈搜。

文本處理

函數(shù) 說明
LEFT()RIGHT() 左邊或者右邊的字符
LOWER()士八、UPPER() 轉(zhuǎn)換為小寫或者大寫
LTRIM()容燕、RTIM() 去除左邊或者右邊的空格
LENGTH() 長(zhǎng)度
SOUNDEX() 轉(zhuǎn)換為語(yǔ)音值

其中, SOUNDEX() 可以將一個(gè)字符串轉(zhuǎn)換為描述其語(yǔ)音表示的字母數(shù)字模式婚度。

SELECT *FROM mytableWHERE SOUNDEX(col1) = SOUNDEX('apple')

日期和時(shí)間處理

  • 日期格式:YYYY-MM-DD

  • 時(shí)間格式:HH:MM:SS

函 數(shù) 說 明
AddDate() 增加一個(gè)日期(天蘸秘、周等)
AddTime() 增加一個(gè)時(shí)間(時(shí)、分等)
CurDate() 返回當(dāng)前日期
CurTime() 返回當(dāng)前時(shí)間
Date() 返回日期時(shí)間的日期部分
DateDiff() 計(jì)算兩個(gè)日期之差
Date_Add() 高度靈活的日期運(yùn)算函數(shù)
Date_Format() 返回一個(gè)格式化的日期或時(shí)間串
Day() 返回一個(gè)日期的天數(shù)部分
DayOfWeek() 對(duì)于一個(gè)日期蝗茁,返回對(duì)應(yīng)的星期幾
Hour() 返回一個(gè)時(shí)間的小時(shí)部分
Minute() 返回一個(gè)時(shí)間的分鐘部分
Month() 返回一個(gè)日期的月份部分
Now() 返回當(dāng)前日期和時(shí)間
Second() 返回一個(gè)時(shí)間的秒部分
Time() 返回一個(gè)日期時(shí)間的時(shí)間部分
Year() 返回一個(gè)日期的年份部分
mysql> SELECT NOW();
2018-4-14 20:25:11

數(shù)值處理

函數(shù) 說明
SIN() 正弦
COS() 余弦
TAN() 正切
ABS() 絕對(duì)值
SQRT() 平方根
MOD() 余數(shù)
EXP() 指數(shù)
PI() 圓周率
RAND() 隨機(jī)數(shù)

匯總

函 數(shù) 說 明
AVG() 返回某列的平均值
COUNT() 返回某列的行數(shù)
MAX() 返回某列的最大值
MIN() 返回某列的最小值
SUM() 返回某列值之和

AVG() 會(huì)忽略 NULL 行醋虏。

使用 DISTINCT 可以讓匯總函數(shù)值匯總不同的值。

SELECT AVG(DISTINCT col1) AS avg_colFROM mytable

六哮翘、排序和分組

ORDER BY

  • ORDER BY 用于對(duì)結(jié)果集進(jìn)行排序颈嚼。

  • ASC :升序(默認(rèn))

  • DESC :降序

  • 可以按多個(gè)列進(jìn)行排序,并且為每個(gè)列指定不同的排序方式

指定多個(gè)列的排序方向

SELECT * FROM productsORDER BY prod_price DESC, prod_name ASC;

GROUP BY

  • GROUP BY 子句將記錄分組到匯總行中饭寺。

  • GROUP BY 為每個(gè)組返回一個(gè)記錄阻课。

  • GROUP BY 通常還涉及聚合:COUNT,MAX艰匙,SUM限煞,AVG 等。

  • GROUP BY 可以按一列或多列進(jìn)行分組员凝。

  • GROUP BY 按分組字段進(jìn)行排序后署驻,ORDER BY 可以以匯總字段來進(jìn)行排序。

分組

SELECT cust_name, COUNT(cust_address) AS addr_numFROM Customers GROUP BY cust_name;

分組后排序

SELECT cust_name, COUNT(cust_address) AS addr_numFROM Customers GROUP BY cust_nameORDER BY cust_name DESC;

HAVING

  • HAVING 用于對(duì)匯總的 GROUP BY 結(jié)果進(jìn)行過濾绊序。

  • HAVING 要求存在一個(gè) GROUP BY 子句硕舆。

  • WHERE 和 HAVING 可以在相同的查詢中。

  • HAVING vs WHERE

  • WHERE 和 HAVING 都是用于過濾骤公。

  • HAVING 適用于匯總的組記錄;而 WHERE 適用于單個(gè)記錄扬跋。

使用 WHERE 和 HAVING 過濾數(shù)據(jù)

SELECT cust_name, COUNT(*) AS numFROM CustomersWHERE cust_email IS NOT NULLGROUP BY cust_nameHAVING COUNT(*) >= 1;

(以下為 DDL 語(yǔ)句用法)

七阶捆、數(shù)據(jù)定義

DDL 的主要功能是定義數(shù)據(jù)庫(kù)對(duì)象(如:數(shù)據(jù)庫(kù)、數(shù)據(jù)表钦听、視圖洒试、索引等)。

數(shù)據(jù)庫(kù)(DATABASE)

創(chuàng)建數(shù)據(jù)庫(kù)

CREATE DATABASE test;

刪除數(shù)據(jù)庫(kù)

DROP DATABASE test;

選擇數(shù)據(jù)庫(kù)

USE test;

數(shù)據(jù)表(TABLE)

創(chuàng)建數(shù)據(jù)表

普通創(chuàng)建

CREATE TABLE user (  id int(10) unsigned NOT NULL COMMENT 'Id',  username varchar(64) NOT NULL DEFAULT 'default' COMMENT '用戶名',  password varchar(64) NOT NULL DEFAULT 'default' COMMENT '密碼',  email varchar(64) NOT NULL DEFAULT 'default' COMMENT '郵箱') COMMENT='用戶表';

根據(jù)已有的表創(chuàng)建新表

CREATE TABLE vip_user ASSELECT * FROM user;

刪除數(shù)據(jù)表

DROP TABLE user;

修改數(shù)據(jù)表

添加列

ALTER TABLE userADD age int(3);

刪除列

ALTER TABLE userDROP COLUMN age;

修改列

ALTER TABLE `user`MODIFY COLUMN age tinyint;

添加主鍵

ALTER TABLE userADD PRIMARY KEY (id);

刪除主鍵

ALTER TABLE userDROP PRIMARY KEY;

視圖(VIEW)

  • 定義
  • 視圖是基于 SQL 語(yǔ)句的結(jié)果集的可視化的表朴上。
  • 視圖是虛擬的表垒棋,本身不包含數(shù)據(jù),也就不能對(duì)其進(jìn)行索引操作痪宰。對(duì)視圖的操作和對(duì)普通表的操作一樣叼架。
  • 作用
  • 簡(jiǎn)化復(fù)雜的 SQL 操作畔裕,比如復(fù)雜的聯(lián)結(jié);
  • 只使用實(shí)際表的一部分?jǐn)?shù)據(jù)乖订;
  • 通過只給用戶訪問視圖的權(quán)限扮饶,保證數(shù)據(jù)的安全性;
  • 更改數(shù)據(jù)格式和表示乍构。

創(chuàng)建視圖

CREATE VIEW top_10_user_view ASSELECT id, usernameFROM userWHERE id < 10;

刪除視圖

DROP VIEW top_10_user_view;

索引(INDEX)

  • 作用
  • 通過索引可以更加快速高效地查詢數(shù)據(jù)甜无。
  • 用戶無法看到索引,它們只能被用來加速查詢哥遮。
  • 注意
  • 更新一個(gè)包含索引的表需要比更新一個(gè)沒有索引的表花費(fèi)更多的時(shí)間岂丘,這是由于索引本身也需要更新。因此眠饮,理想的做法是僅僅在常常被搜索的列(以及表)上面創(chuàng)建索引奥帘。
  • 唯一索引
  • 唯一索引表明此索引的每一個(gè)索引值只對(duì)應(yīng)唯一的數(shù)據(jù)記錄。

創(chuàng)建索引

CREATE INDEX user_indexON user (id);

創(chuàng)建唯一索引

CREATE UNIQUE INDEX user_indexON user (id);

刪除索引

ALTER TABLE userDROP INDEX user_index;

約束

SQL 約束用于規(guī)定表中的數(shù)據(jù)規(guī)則君仆。

  • 如果存在違反約束的數(shù)據(jù)行為翩概,行為會(huì)被約束終止。

  • 約束可以在創(chuàng)建表時(shí)規(guī)定(通過 CREATE TABLE 語(yǔ)句)返咱,或者在表創(chuàng)建之后規(guī)定(通過 ALTER TABLE 語(yǔ)句)钥庇。

  • 約束類型

  • NOT NULL - 指示某列不能存儲(chǔ) NULL 值。

  • UNIQUE - 保證某列的每行必須有唯一的值咖摹。

  • PRIMARY KEY - NOT NULL 和 UNIQUE 的結(jié)合评姨。確保某列(或兩個(gè)列多個(gè)列的結(jié)合)有唯一標(biāo)識(shí),有助于更容易更快速地找到表中的一個(gè)特定的記錄萤晴。

  • FOREIGN KEY - 保證一個(gè)表中的數(shù)據(jù)匹配另一個(gè)表中的值的參照完整性吐句。

  • CHECK - 保證列中的值符合指定的條件。

  • DEFAULT - 規(guī)定沒有給列賦值時(shí)的默認(rèn)值店读。

創(chuàng)建表時(shí)使用約束條件:

CREATE TABLE Users (  Id INT(10) UNSIGNED NOT NULL AUTO_INCREMENT COMMENT '自增Id',  Username VARCHAR(64) NOT NULL UNIQUE DEFAULT 'default' COMMENT '用戶名',  Password VARCHAR(64) NOT NULL DEFAULT 'default' COMMENT '密碼',  Email VARCHAR(64) NOT NULL DEFAULT 'default' COMMENT '郵箱地址',  Enabled TINYINT(4) DEFAULT NULL COMMENT '是否有效',  PRIMARY KEY (Id)) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8mb4 COMMENT='用戶表';

(以下為 TCL 語(yǔ)句用法)

八嗦枢、事務(wù)處理

  • 不能回退 SELECT 語(yǔ)句,回退 SELECT 語(yǔ)句也沒意義屯断;也不能回退 CREATE 和 DROP 語(yǔ)句文虏。
  • MySQL 默認(rèn)是隱式提交,每執(zhí)行一條語(yǔ)句就把這條語(yǔ)句當(dāng)成一個(gè)事務(wù)然后進(jìn)行提交殖演。當(dāng)出現(xiàn) START TRANSACTION 語(yǔ)句時(shí)氧秘,會(huì)關(guān)閉隱式提交;當(dāng) COMMITROLLBACK 語(yǔ)句執(zhí)行后趴久,事務(wù)會(huì)自動(dòng)關(guān)閉丸相,重新恢復(fù)隱式提交。
  • 通過 set autocommit=0 可以取消自動(dòng)提交彼棍,直到 set autocommit=1 才會(huì)提交灭忠;autocommit 標(biāo)記是針對(duì)每個(gè)連接而不是針對(duì)服務(wù)器的膳算。
  • 指令
  • START TRANSACTION - 指令用于標(biāo)記事務(wù)的起始點(diǎn)。
  • SAVEPOINT - 指令用于創(chuàng)建保留點(diǎn)更舞。
  • ROLLBACK TO - 指令用于回滾到指定的保留點(diǎn)畦幢;如果沒有設(shè)置保留點(diǎn),則回退到 START TRANSACTION 語(yǔ)句處缆蝉。
  • COMMIT - 提交事務(wù)宇葱。
-- 開始事務(wù)START TRANSACTION;-- 插入操作 A

(以下為 DCL 語(yǔ)句用法)

九、權(quán)限控制

  • GRANT 和 REVOKE 可在幾個(gè)層次上控制訪問權(quán)限:
  • 整個(gè)服務(wù)器刊头,使用 GRANT ALL 和 REVOKE ALL黍瞧;
  • 整個(gè)數(shù)據(jù)庫(kù),使用 ON database.*原杂;
  • 特定的表印颤,使用 ON database.table;
  • 特定的列穿肄;
  • 特定的存儲(chǔ)過程年局。
  • 新創(chuàng)建的賬戶沒有任何權(quán)限。
  • 賬戶用 username@host 的形式定義咸产,username@% 使用的是默認(rèn)主機(jī)名矢否。
  • MySQL 的賬戶信息保存在 mysql 這個(gè)數(shù)據(jù)庫(kù)中。
```
USE mysql;SELECT user FROM user;復(fù)制代碼
```

創(chuàng)建賬戶

CREATE USER myuser IDENTIFIED BY 'mypassword';

修改賬戶名

UPDATE user SET user='newuser' WHERE user='myuser';FLUSH PRIVILEGES;

刪除賬戶

DROP USER myuser;

查看權(quán)限

SHOW GRANTS FOR myuser;

授予權(quán)限

GRANT SELECT, INSERT ON *.* TO myuser;

刪除權(quán)限

REVOKE SELECT, INSERT ON *.* FROM myuser;

更改密碼

SET PASSWORD FOR myuser = 'mypass';

十脑溢、存儲(chǔ)過程

  • 存儲(chǔ)過程可以看成是對(duì)一系列 SQL 操作的批處理僵朗;
  • 使用存儲(chǔ)過程的好處
  • 代碼封裝,保證了一定的安全性屑彻;
  • 代碼復(fù)用验庙;
  • 由于是預(yù)先編譯,因此具有很高的性能社牲。
  • 創(chuàng)建存儲(chǔ)過程
  • 命令行中創(chuàng)建存儲(chǔ)過程需要自定義分隔符粪薛,因?yàn)槊钚惺且?; 為結(jié)束符,而存儲(chǔ)過程中也包含了分號(hào)搏恤,因此會(huì)錯(cuò)誤把這部分分號(hào)當(dāng)成是結(jié)束符汗菜,造成語(yǔ)法錯(cuò)誤。
  • 包含 in挑社、out 和 inout 三種參數(shù)。
  • 給變量賦值都需要用 select into 語(yǔ)句巡揍。
  • 每次只能給一個(gè)變量賦值痛阻,不支持集合的操作。

創(chuàng)建存儲(chǔ)過程

DROP PROCEDURE IF EXISTS `proc_adder`;DELIMITER ;;CREATE DEFINER=`root`@`localhost` PROCEDURE `proc_adder`(IN a int, IN b int, OUT sum int)BEGIN    DECLARE c int;    if a is null then set a = 0;    end if;    if b is null then set b = 0;    end if;    set sum  = a + b;END;;DELIMITER ;

使用存儲(chǔ)過程

set @b=5;call proc_adder(2,@b,@s);select @s as sum;

十一腮敌、游標(biāo)

  • 游標(biāo)(cursor)是一個(gè)存儲(chǔ)在 DBMS 服務(wù)器上的數(shù)據(jù)庫(kù)查詢阱当,它不是一條 SELECT 語(yǔ)句俏扩,而是被該語(yǔ)句檢索出來的結(jié)果集。
  • 在存儲(chǔ)過程中使用游標(biāo)可以對(duì)一個(gè)結(jié)果集進(jìn)行移動(dòng)遍歷弊添。
  • 游標(biāo)主要用于交互式應(yīng)用录淡,其中用戶需要對(duì)數(shù)據(jù)集中的任意行進(jìn)行瀏覽和修改。
  • 使用游標(biāo)的四個(gè)步驟:
  • 聲明游標(biāo)油坝,這個(gè)過程沒有實(shí)際檢索出數(shù)據(jù)嫉戚;
  • 打開游標(biāo);
  • 取出數(shù)據(jù)澈圈;
  • 關(guān)閉游標(biāo)彬檀;
DELIMITER $CREATE  PROCEDURE getTotal()BEGIN    DECLARE total INT;    -- 創(chuàng)建接收游標(biāo)數(shù)據(jù)的變量    DECLARE sid INT;    DECLARE sname VARCHAR(10);    -- 創(chuàng)建總數(shù)變量    DECLARE sage INT;    -- 創(chuàng)建結(jié)束標(biāo)志變量

十二、觸發(fā)器

觸發(fā)器是一種與表操作有關(guān)的數(shù)據(jù)庫(kù)對(duì)象瞬女,當(dāng)觸發(fā)器所在表上出現(xiàn)指定事件時(shí)窍帝,將調(diào)用該對(duì)象,即表的操作事件觸發(fā)表上的觸發(fā)器的執(zhí)行诽偷。

可以使用觸發(fā)器來進(jìn)行審計(jì)跟蹤坤学,把修改記錄到另外一張表中。

MySQL 不允許在觸發(fā)器中使用 CALL 語(yǔ)句 报慕,也就是不能調(diào)用存儲(chǔ)過程深浮。

BEGINEND

當(dāng)觸發(fā)器的觸發(fā)條件滿足時(shí),將會(huì)執(zhí)行 BEGINEND 之間的觸發(fā)器執(zhí)行動(dòng)作卖子。

?? 注意:在 MySQL 中略号,分號(hào) ; 是語(yǔ)句結(jié)束的標(biāo)識(shí)符,遇到分號(hào)表示該段語(yǔ)句已經(jīng)結(jié)束洋闽,MySQL 可以開始執(zhí)行了玄柠。因此,解釋器遇到觸發(fā)器執(zhí)行動(dòng)作中的分號(hào)后就開始執(zhí)行诫舅,然后會(huì)報(bào)錯(cuò)羽利,因?yàn)闆]有找到和 BEGIN 匹配的 END。

這時(shí)就會(huì)用到 DELIMITER 命令(DELIMITER 是定界符刊懈,分隔符的意思)这弧。它是一條命令,不需要語(yǔ)句結(jié)束標(biāo)識(shí)虚汛,語(yǔ)法為:DELIMITER new_delemiter匾浪。new_delemiter 可以設(shè)為 1 個(gè)或多個(gè)長(zhǎng)度的符號(hào),默認(rèn)的是分號(hào) ;卷哩,我們可以把它修改為其他符號(hào)蛋辈,如 $ - DELIMITER $ 。在這之后的語(yǔ)句,以分號(hào)結(jié)束冷溶,解釋器不會(huì)有什么反應(yīng)渐白,只有遇到了 $,才認(rèn)為是語(yǔ)句結(jié)束逞频。注意纯衍,使用完之后,我們還應(yīng)該記得把它給修改回來苗胀。

NEWOLD

  • MySQL 中定義了 NEW 和 OLD 關(guān)鍵字襟诸,用來表示觸發(fā)器的所在表中,觸發(fā)了觸發(fā)器的那一行數(shù)據(jù)柒巫。

  • 在 INSERT 型觸發(fā)器中励堡,NEW 用來表示將要(BEFORE)或已經(jīng)(AFTER)插入的新數(shù)據(jù);

  • 在 UPDATE 型觸發(fā)器中堡掏,OLD 用來表示將要或已經(jīng)被修改的原數(shù)據(jù)应结,NEW 用來表示將要或已經(jīng)修改為的新數(shù)據(jù);

  • 在 DELETE 型觸發(fā)器中泉唁,OLD 用來表示將要或已經(jīng)被刪除的原數(shù)據(jù)鹅龄;

  • 使用方法:NEW.columnName (columnName 為相應(yīng)數(shù)據(jù)表某一列名)

創(chuàng)建觸發(fā)器

提示:為了理解觸發(fā)器的要點(diǎn),有必要先了解一下創(chuàng)建觸發(fā)器的指令亭畜。

CREATE TRIGGER 指令用于創(chuàng)建觸發(fā)器扮休。

語(yǔ)法:

CREATE TRIGGER trigger_nametrigger_timetrigger_eventON table_nameFOR EACH ROWBEGIN  trigger_statementsEND;

說明:

  • trigger_name:觸發(fā)器名

  • trigger_time: 觸發(fā)器的觸發(fā)時(shí)機(jī)。取值為 BEFORE 或 AFTER拴鸵。

  • trigger_event: 觸發(fā)器的監(jiān)聽事件玷坠。取值為 INSERT、UPDATE 或 DELETE劲藐。

  • table_name: 觸發(fā)器的監(jiān)聽目標(biāo)八堡。指定在哪張表上建立觸發(fā)器。

  • FOR EACH ROW: 行級(jí)監(jiān)視聘芜,Mysql 固定寫法兄渺,其他 DBMS 不同。

  • trigger_statements: 觸發(fā)器執(zhí)行動(dòng)作汰现。是一條或多條 SQL 語(yǔ)句的列表挂谍,列表內(nèi)的每條語(yǔ)句都必須用分號(hào) ; 來結(jié)尾。

示例:

DELIMITER $CREATE TRIGGER `trigger_insert_user`AFTER INSERT ON `user`FOR EACH ROWBEGIN    INSERT INTO `user_history`(user_id, operate_type, operate_time)    VALUES (NEW.id, 'add a user',  now());END $DELIMITER ;

查看觸發(fā)器

SHOW TRIGGERS;

刪除觸發(fā)器

DROP TRIGGER IF EXISTS trigger_insert_user;

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末瞎饲,一起剝皮案震驚了整個(gè)濱河市口叙,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌嗅战,老刑警劉巖庐扫,帶你破解...
    沈念sama閱讀 222,252評(píng)論 6 516
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡形庭,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,886評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門厌漂,熙熙樓的掌柜王于貴愁眉苦臉地迎上來萨醒,“玉大人,你說我怎么就攤上這事苇倡「恢剑” “怎么了?”我有些...
    開封第一講書人閱讀 168,814評(píng)論 0 361
  • 文/不壞的土叔 我叫張陵旨椒,是天一觀的道長(zhǎng)晓褪。 經(jīng)常有香客問我,道長(zhǎng)综慎,這世上最難降的妖魔是什么涣仿? 我笑而不...
    開封第一講書人閱讀 59,869評(píng)論 1 299
  • 正文 為了忘掉前任,我火速辦了婚禮示惊,結(jié)果婚禮上好港,老公的妹妹穿的比我還像新娘。我一直安慰自己米罚,他們只是感情好钧汹,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,888評(píng)論 6 398
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著录择,像睡著了一般拔莱。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上隘竭,一...
    開封第一講書人閱讀 52,475評(píng)論 1 312
  • 那天塘秦,我揣著相機(jī)與錄音,去河邊找鬼货裹。 笑死嗤形,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的弧圆。 我是一名探鬼主播赋兵,決...
    沈念sama閱讀 41,010評(píng)論 3 422
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼搔预!你這毒婦竟也來了霹期?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,924評(píng)論 0 277
  • 序言:老撾萬榮一對(duì)情侶失蹤拯田,失蹤者是張志新(化名)和其女友劉穎历造,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,469評(píng)論 1 319
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡吭产,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,552評(píng)論 3 342
  • 正文 我和宋清朗相戀三年侣监,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片臣淤。...
    茶點(diǎn)故事閱讀 40,680評(píng)論 1 353
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡橄霉,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出邑蒋,到底是詐尸還是另有隱情姓蜂,我是刑警寧澤,帶...
    沈念sama閱讀 36,362評(píng)論 5 351
  • 正文 年R本政府宣布医吊,位于F島的核電站钱慢,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏卿堂。R本人自食惡果不足惜束莫,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 42,037評(píng)論 3 335
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望御吞。 院中可真熱鬧麦箍,春花似錦、人聲如沸陶珠。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,519評(píng)論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)揍诽。三九已至诀蓉,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間暑脆,已是汗流浹背渠啤。 一陣腳步聲響...
    開封第一講書人閱讀 33,621評(píng)論 1 274
  • 我被黑心中介騙來泰國(guó)打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留添吗,地道東北人沥曹。 一個(gè)月前我還...
    沈念sama閱讀 49,099評(píng)論 3 378
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像碟联,于是被迫代替她去往敵國(guó)和親妓美。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,691評(píng)論 2 361