來源:PHP開源社區(qū)?
本文針對關(guān)系型數(shù)據(jù)庫的一般語法惦费。
限于篇幅,本文側(cè)重說明用法抢韭,不會展開講解特性薪贫、原理。
一刻恭、基本概念
數(shù)據(jù)庫術(shù)語
數(shù)據(jù)庫(database)?- 保存有組織的數(shù)據(jù)的容器(通常是一個文件或一組文件)瞧省。
數(shù)據(jù)表(table)?- 某種特定類型數(shù)據(jù)的結(jié)構(gòu)化清單。
模式(schema)?- 關(guān)于數(shù)據(jù)庫和表的布局及特性的信息鳍贾。模式定義了數(shù)據(jù)在表中如何存儲鞍匾,包含存儲什么樣的數(shù)據(jù),數(shù)據(jù)如何分解骑科,各部分信息如何命名等信息橡淑。數(shù)據(jù)庫和表都有模式。
列(column)?- 表中的一個字段纵散。所有表都是由一個或多個列組成的梳码。
行(row)?- 表中的一個記錄隐圾。
主鍵(primary key)?- 一列(或一組列),其值能夠唯一標識表中每一行掰茶。
SQL 語法
SQL(Structured Query Language)暇藏,標準 SQL 由 ANSI 標準委員會管理,從而稱為 ANSI SQL濒蒋。各個 DBMS 都有自己的實現(xiàn)盐碱,如 PL/SQL、Transact-SQL 等沪伙。
SQL 語法結(jié)構(gòu)
SQL 語法結(jié)構(gòu)包括:
子句- 是語句和查詢的組成成分瓮顽。(在某些情況下,這些都是可選的围橡。)
表達式- 可以產(chǎn)生任何標量值暖混,或由列和行的數(shù)據(jù)庫表
謂詞- 給需要評估的 SQL 三值邏輯(3VL)(true/false/unknown)或布爾真值指定條件,并限制語句和查詢的效果翁授,或改變程序流程拣播。
查詢- 基于特定條件檢索數(shù)據(jù)。這是 SQL 的一個重要組成部分收擦。
語句- 可以持久地影響綱要和數(shù)據(jù)贮配,也可以控制數(shù)據(jù)庫事務(wù)、程序流程塞赂、連接泪勒、會話或診斷。
SQL 語法要點
SQL 語句不區(qū)分大小寫宴猾,但是數(shù)據(jù)庫表名圆存、列名和值是否區(qū)分,依賴于具體的 DBMS 以及配置鳍置。
例如:SELECT?與?select?辽剧、Select?是相同的。
多條 SQL 語句必須以分號(;)分隔税产。
處理 SQL 語句時怕轿,所有空格都被忽略。SQL 語句可以寫成一行辟拷,也可以分寫為多行撞羽。
-- 一行 SQL 語句
UPDATE user SET username='robot', password='robot'WHERE username ='root';
-- 多行 SQL 語句
UPDATE user
SET username='robot', password='robot'
WHERE username ='root';
SQL 支持三種注釋
## 注釋1
-- 注釋2
/* 注釋3 */
SQL 分類
數(shù)據(jù)定義語言(DDL)
數(shù)據(jù)定義語言(Data Definition Language,DDL)是 SQL 語言集中負責數(shù)據(jù)結(jié)構(gòu)定義與數(shù)據(jù)庫對象定義的語言衫冻。
DDL 的主要功能是定義數(shù)據(jù)庫對象诀紊。
DDL 的核心指令是?CREATE、ALTER隅俘、DROP邻奠。
數(shù)據(jù)操縱語言(DML)
數(shù)據(jù)操縱語言(Data Manipulation Language, DML)是用于數(shù)據(jù)庫操作笤喳,對數(shù)據(jù)庫其中的對象和數(shù)據(jù)運行訪問工作的編程語句。
DML 的主要功能是訪問數(shù)據(jù)碌宴,因此其語法都是以讀寫數(shù)據(jù)庫為主杀狡。
DML 的核心指令是?INSERT、UPDATE贰镣、DELETE呜象、SELECT。這四個指令合稱 CRUD(Create, Read, Update, Delete)碑隆,即增刪改查恭陡。
事務(wù)控制語言(TCL)
事務(wù)控制語言 (Transaction Control Language, TCL) 用于管理數(shù)據(jù)庫中的事務(wù)。這些用于管理由 DML 語句所做的更改上煤。它還允許將語句分組為邏輯事務(wù)休玩。
TCL 的核心指令是?COMMIT、ROLLBACK劫狠。
數(shù)據(jù)控制語言(DCL)
數(shù)據(jù)控制語言 (Data Control Language, DCL) 是一種可對數(shù)據(jù)訪問權(quán)進行控制的指令哥捕,它可以控制特定用戶賬戶對數(shù)據(jù)表、查看表嘉熊、預(yù)存程序、用戶自定義函數(shù)等數(shù)據(jù)庫對象的控制權(quán)扬舒。
DCL 的核心指令是?GRANT阐肤、REVOKE。
DCL 以控制用戶的訪問權(quán)限為主讲坎,因此其指令作法并不復(fù)雜孕惜,可利用 DCL 控制的權(quán)限有:CONNECT、SELECT晨炕、INSERT衫画、UPDATE、DELETE瓮栗、EXECUTE削罩、USAGE、REFERENCES费奸。
根據(jù)不同的 DBMS 以及不同的安全性實體弥激,其支持的權(quán)限控制也有所不同。
(以下為 DML 語句用法)
二愿阐、增刪改查
增刪改查微服,又稱為 CRUD,數(shù)據(jù)庫基本操作中的基本操作缨历。
插入數(shù)據(jù)
INSERT INTO?語句用于向表中插入新記錄以蕴。
插入完整的行
INSERT INTO user
VALUES(10,'root','root','xxxx@163.com')
;
插入行的一部分
INSERT INTOuser(username, password, email)
VALUES('admin','admin','xxxx@163.com')
;
插入查詢出來的數(shù)據(jù)
INSERT INTOuser(username)
SELECT name
FROM account
;
更新數(shù)據(jù)
UPDATE?語句用于更新表中的記錄糙麦。
UPDATE user
SET username='robot', password='robot'
WHERE username ='root';
刪除數(shù)據(jù)
DELETE?語句用于刪除表中的記錄。
TRUNCATE TABLE?可以清空表丛肮,也就是刪除所有行赡磅。
刪除表中的指定數(shù)據(jù)
DELETE FROM user
WHERE username ='robot';
清空表中的數(shù)據(jù)
TRUNCATE TABLE user;
查詢數(shù)據(jù)
SELECT?語句用于從數(shù)據(jù)庫中查詢數(shù)據(jù)。
DISTINCT?用于返回唯一不同的值腾供。它作用于所有列仆邓,也就是說所有列的值都相同才算相同。
LIMIT?限制返回的行數(shù)伴鳖〗谥担可以有兩個參數(shù),第一個參數(shù)為起始行榜聂,從 0 開始搞疗;第二個參數(shù)為返回的總行數(shù)。
ASC?:升序(默認)
DESC?:降序
查詢單列
SELECT prod_name
FROM products;
查詢多列
SELECT prod_id, prod_name, prod_price
FROM products;
查詢所有列
ELECT *
FROM products;
查詢不同的值
SELECT DISTINCT
vend_id FROM products;
限制查詢結(jié)果
-- 返回前5行
SELECT * FROM mytable LIMIT5;
SELECT * FROM mytable LIMIT0,5;
-- 返回第3~5行
SELECT * FROM mytable LIMIT2,3;
三须肆、子查詢
子查詢是嵌套在較大查詢中的 SQL 查詢匿乃。子查詢也稱為內(nèi)部查詢或內(nèi)部選擇,而包含子查詢的語句也稱為外部查詢或外部選擇豌汇。
子查詢可以嵌套在?SELECT幢炸,INSERT,UPDATE?或?DELETE?語句內(nèi)或另一個子查詢中拒贱。
子查詢通常會在另一個?SELECT?語句的?WHERE?子句中添加宛徊。
您可以使用比較運算符,如?>逻澳,<闸天,或?=。比較運算符也可以是多行運算符斜做,如?IN苞氮,ANY?或?ALL。
子查詢必須被圓括號?()?括起來瓤逼。
內(nèi)部查詢首先在其父查詢之前執(zhí)行笼吟,以便可以將內(nèi)部查詢的結(jié)果傳遞給外部查詢。執(zhí)行過程可以參考下圖:
子查詢的子查詢
SELECT cust_name,cust_contact
FROM customers
WHERE cust_idIN(SELECT cust_id
FROM orders
WHERE order_num IN (SELECT order_num
FROM orderitems
WHERE prod_id ='RGAN01')
)
;
WHERE
WHERE?子句用于過濾記錄抛姑,即縮小訪問數(shù)據(jù)的范圍赞厕。
WHERE?后跟一個返回?true?或?false?的條件。
WHERE?可以與?SELECT定硝,UPDATE?和?DELETE?一起使用皿桑。
可以在?WHERE?子句中使用的操作符
SELECT語句中的WHERE子句
SELECT * FROM Customers
WHERE cust_name ='Kids Place';
UPDATE語句中的WHERE子句
UPDATE Customers
SET cust_name ='Jack Jones'
WHERE cust_name ='Kids Place';
DELETE語句中的WHERE子句
DELETE FROM Customers
WHERE cust_name ='Kids Place';
IN 和 BETWEEN
IN?操作符在?WHERE?子句中使用,作用是在指定的幾個特定值中任選一個值。
BETWEEN?操作符在?WHERE?子句中使用诲侮,作用是選取介于某個范圍內(nèi)的值镀虐。
IN 示例
SELECT *
FROM products
WHERE vend_idIN('DLL01','BRS01')
;
BETWEEN 示例
SELECT *
FROM products
WHERE prod_price BETWEEN3AND5;
AND、OR沟绪、NOT
AND刮便、OR、NOT?是用于對過濾條件的邏輯處理指令绽慈。
AND?優(yōu)先級高于?OR恨旱,為了明確處理順序,可以使用?()坝疼。
AND?操作符表示左右條件都要滿足搜贤。
OR?操作符表示左右條件滿足任意一個即可。
NOT?操作符用于否定一個條件钝凶。
AND 示例
SELECT prod_id, prod_name, prod_price
FROM products
WHERE vend_id ='DLL01'AND prod_price <=4;
OR 示例
SELECT prod_id, prod_name, prod_price
FROM products
WHERE vend_id ='DLL01'OR vend_id ='BRS01';
NOT 示例
SELECT *
FROM products
WHERE prod_price NOT BETWEEN3AND5;
LIKE
LIKE?操作符在?WHERE?子句中使用仪芒,作用是確定字符串是否匹配模式。
只有字段是文本值時才使用?LIKE耕陷。
LIKE?支持兩個通配符匹配選項:%?和?_掂名。
不要濫用通配符,通配符位于開頭處匹配會非常慢哟沫。
%?表示任何字符出現(xiàn)任意次數(shù)饺蔑。
_?表示任何字符出現(xiàn)一次。
% 示例
SELECT prod_id, prod_name, prod_price
FROM products
WHERE prod_name LIKE'%bean bag%';
_ 示例
SELECT prod_id, prod_name, prod_price
FROM products
WHERE prod_name LIKE'__ inch teddy bear';
四嗜诀、連接和組合
連接(JOIN)
如果一個?JOIN?至少有一個公共字段并且它們之間存在關(guān)系膀钠,則該?JOIN?可以在兩個或多個表上工作。
連接用于連接多個表裹虫,使用?JOIN?關(guān)鍵字,并且條件語句使用?ON?而不是?WHERE融击。
JOIN?保持基表(結(jié)構(gòu)和數(shù)據(jù))不變筑公。
JOIN?有兩種連接類型:內(nèi)連接和外連接。
內(nèi)連接又稱等值連接尊浪,使用 INNER?JOIN?關(guān)鍵字匣屡。在沒有條件語句的情況下返回笛卡爾積。
自連接可以看成內(nèi)連接的一種拇涤,只是連接的表是自身而已捣作。
自然連接是把同名列通過 = 測試連接起來的,同名列可以有多個鹅士。
內(nèi)連接 vs 自然連接
內(nèi)連接提供連接的列券躁,而自然連接自動連接所有同名列。
外連接返回一個表中的所有行,并且僅返回來自次表中滿足連接條件的那些行也拜,即兩個表中的列是相等的以舒。外連接分為左外連接、右外連接慢哈、全外連接(Mysql 不支持)蔓钟。
左外連接就是保留左表沒有關(guān)聯(lián)的行。
右外連接就是保留右表沒有關(guān)聯(lián)的行卵贱。
連接 vs 子查詢
連接可以替換子查詢滥沫,并且比子查詢的效率一般會更快。
內(nèi)連接(INNER JOIN)
SELECT vend_name, prod_name, prod_price
FROM vendors INNER JOIN products
ON vendors.vend_id = products.vend_id;
自連接
SELECT c1.cust_id, c1.cust_name, c1.cust_contact
FROM customers c1, customers c2
WHERE c1.cust_name = c2.cust_name
AND c2.cust_contact ='Jim Jones';
自然連接(NATURAL JOIN)
SELECT *
FROM Products
NATURAL JOIN Customers;
左連接(LEFT JOIN)
SELECT customers.cust_id, orders.order_num
FROM customers LEFT JOIN orders
ON customers.cust_id = orders.cust_id;
右連接(RIGHT JOIN)
SELECT customers.cust_id, orders.order_num
FROM customers RIGHT JOIN orders
ON customers.cust_id = orders.cust_id;
組合(UNION)
UNION?運算符將兩個或更多查詢的結(jié)果組合起來键俱,并生成一個結(jié)果集兰绣,其中包含來自?UNION?中參與查詢的提取行。
UNION?基本規(guī)則
所有查詢的列數(shù)和列順序必須相同方妖。
每個查詢中涉及表的列的數(shù)據(jù)類型必須相同或兼容狭魂。
通常返回的列名取自第一個查詢。
默認會去除相同行党觅,如果需要保留相同行雌澄,使用?UNION ALL。
只能包含一個?ORDER BY?子句杯瞻,并且必須位于語句的最后镐牺。
應(yīng)用場景
在一個查詢中從不同的表返回結(jié)構(gòu)數(shù)據(jù)。
對一個表執(zhí)行多個查詢魁莉,按一個查詢返回數(shù)據(jù)睬涧。
組合查詢
SELECT cust_name, cust_contact,cust_email
FROM customers
WHERE cust_stateIN('IL','IN','MI')
UNION
SELECT cust_name, cust_contact, cust_email
FROM customers
WHERE cust_name
='Fun4All';
JOIN vs UNION
JOIN vs UNION
JOIN?中連接表的列可能不同,但在?UNION?中旗唁,所有查詢的列數(shù)和列順序必須相同畦浓。
UNION?將查詢之后的行放在一起(垂直放置),但?JOIN?將查詢之后的列放在一起(水平放置)检疫,即它構(gòu)成一個笛卡爾積讶请。
五、函數(shù)
?? 注意:不同數(shù)據(jù)庫的函數(shù)往往各不相同屎媳,因此不可移植夺溢。本節(jié)主要以 Mysql 的函數(shù)為例。
文本處理
其中烛谊,SOUNDEX()可以將一個字符串轉(zhuǎn)換為描述其語音表示的字母數(shù)字模式风响。
SELECT *
FROM mytable
WHERESOUNDEX(col1)
= SOUNDEX('apple')
日期和時間處理
日期格式:YYYY-MM-DD
時間格式:HH:MM:SS
mysql> SELECTNOW();
2018-4-1420:25:11
數(shù)值處理
匯總
使用 DISTINCT 可以讓匯總函數(shù)值匯總不同的值。
SELECTAVG(DISTINCT col1)AS avg_col
FROM mytable
六丹禀、排序和分組
ORDER BY
ORDER BY?用于對結(jié)果集進行排序状勤。
ASC?:升序(默認)
DESC?:降序
可以按多個列進行排序鞋怀,并且為每個列指定不同的排序方式
指定多個列的排序方向
SELECT * FROM products
ORDER BY prod_price DESC, prod_name ASC;
GROUP BY
GROUP BY?子句將記錄分組到匯總行中。
GROUP BY?為每個組返回一個記錄荧降。
GROUP BY?通常還涉及聚合:COUNT接箫,MAX,SUM朵诫,AVG 等辛友。
GROUP BY?可以按一列或多列進行分組。
GROUP BY?按分組字段進行排序后剪返,ORDER BY?可以以匯總字段來進行排序废累。
分組
SELECT cust_name, COUNT(cust_address) AS addr_num
FROM Customers GROUP BY cust_name;
分組后排序
SELECT cust_name, COUNT(cust_address) AS addr_num
FROM Customers GROUP BY cust_name
ORDER BY cust_name DESC;
HAVING
HAVING?用于對匯總的?GROUP BY?結(jié)果進行過濾。
HAVING?要求存在一個?GROUP BY?子句脱盲。
WHERE?和?HAVING?可以在相同的查詢中邑滨。
HAVING?vs?WHERE
WHERE?和?HAVING?都是用于過濾。
HAVING?適用于匯總的組記錄钱反;而 WHERE 適用于單個記錄掖看。
使用 WHERE 和 HAVING 過濾數(shù)據(jù)
SELECT cust_name, COUNT(*)AS num
FROM Customers
WHERE cust_email IS NOT NULL
GROUP BY cust_name
HAVINGCOUNT(*)>
=1;
(以下為 DDL 語句用法)
七、數(shù)據(jù)定義
DDL 的主要功能是定義數(shù)據(jù)庫對象(如:數(shù)據(jù)庫面哥、數(shù)據(jù)表哎壳、視圖、索引等)尚卫。
數(shù)據(jù)庫(DATABASE)
創(chuàng)建數(shù)據(jù)庫
CREATE DATABASE test;
刪除數(shù)據(jù)庫
DROP DATABASE test;
選擇數(shù)據(jù)庫
USE test;
數(shù)據(jù)表(TABLE)
創(chuàng)建數(shù)據(jù)表
普通創(chuàng)建
CREATE TABLEuser(
idint(10)
unsigned NOT NULL COMMENT 'Id',
usernamevarchar(64)NOT NULL DEFAULT 'default' COMMENT '用戶名',
passwordvarchar(64)NOT NULL DEFAULT 'default' COMMENT '密碼',
emailvarchar(64)NOT NULL DEFAULT 'default' COMMENT '郵箱'
) COMMENT
='用戶表';
根據(jù)已有的表創(chuàng)建新表
CREATE TABLE vip_user AS
SELECT * FROM user;
刪除數(shù)據(jù)表
DROP TABLE user;
修改數(shù)據(jù)表
添加列
ALTER TABLE user
ADD ageint(3)
;
刪除列
ALTER TABLE user
DROP COLUMN age;
修改列
ALTER TABLE `user`
MODIFY COLUMN age tinyint;
添加主鍵
ALTER TABLE user
ADD PRIMARYKEY(id)
;
刪除主鍵
ALTER TABLE user
DROP PRIMARY KEY;
視圖(VIEW)
定義
視圖是基于 SQL 語句的結(jié)果集的可視化的表归榕。
視圖是虛擬的表,本身不包含數(shù)據(jù)吱涉,也就不能對其進行索引操作刹泄。對視圖的操作和對普通表的操作一樣。
作用
簡化復(fù)雜的 SQL 操作怎爵,比如復(fù)雜的聯(lián)結(jié)特石;
只使用實際表的一部分數(shù)據(jù);
通過只給用戶訪問視圖的權(quán)限鳖链,保證數(shù)據(jù)的安全性县匠;
更改數(shù)據(jù)格式和表示。
創(chuàng)建視圖
CREATE VIEW top_10_user_view AS
SELECT id, username
FROM user
WHERE id <10;
刪除視圖
DROP VIEW top_10_user_view;
索引(INDEX)
作用
通過索引可以更加快速高效地查詢數(shù)據(jù)撒轮。
用戶無法看到索引,它們只能被用來加速查詢贼穆。
注意
更新一個包含索引的表需要比更新一個沒有索引的表花費更多的時間题山,這是由于索引本身也需要更新。因此故痊,理想的做法是僅僅在常常被搜索的列(以及表)上面創(chuàng)建索引顶瞳。
唯一索引
唯一索引表明此索引的每一個索引值只對應(yīng)唯一的數(shù)據(jù)記錄。
創(chuàng)建索引
CREATE INDEX user_index
ONuser(id)
;
創(chuàng)建唯一索引
CREATE UNIQUE INDEX user_index
ONuser(id)
;
刪除索引
ALTER TABLE user
DROP INDEX user_index;
約束
SQL 約束用于規(guī)定表中的數(shù)據(jù)規(guī)則。
如果存在違反約束的數(shù)據(jù)行為慨菱,行為會被約束終止焰络。
約束可以在創(chuàng)建表時規(guī)定(通過 CREATE TABLE 語句),或者在表創(chuàng)建之后規(guī)定(通過 ALTER TABLE 語句)符喝。
約束類型
NOT NULL?- 指示某列不能存儲 NULL 值闪彼。
UNIQUE?- 保證某列的每行必須有唯一的值。
PRIMARY KEY?- NOT NULL 和 UNIQUE 的結(jié)合协饲。確保某列(或兩個列多個列的結(jié)合)有唯一標識畏腕,有助于更容易更快速地找到表中的一個特定的記錄。
FOREIGN KEY?- 保證一個表中的數(shù)據(jù)匹配另一個表中的值的參照完整性茉稠。
CHECK?- 保證列中的值符合指定的條件描馅。
DEFAULT?- 規(guī)定沒有給列賦值時的默認值。
創(chuàng)建表時使用約束條件:
CREATE TABLEUsers(
Id INT(10)
UNSIGNED NOT NULL AUTO_INCREMENT COMMENT '自增Id',
UsernameVARCHAR(64)NOT NULL UNIQUE DEFAULT 'default' COMMENT '用戶名',
PasswordVARCHAR(64)NOT NULL DEFAULT 'default' COMMENT '密碼',
EmailVARCHAR(64)NOT NULL DEFAULT 'default' COMMENT '郵箱地址',
EnabledTINYINT(4)DEFAULT NULL COMMENT '是否有效',
PRIMARYKEY(Id)
) ENGINE
=InnoDB AUTO_INCREMENT=2DEFAULT CHARSET=utf8mb4 COMMENT='用戶表';
(以下為 TCL 語句用法)
八而线、事務(wù)處理
不能回退 SELECT 語句铭污,回退 SELECT 語句也沒意義;也不能回退 CREATE 和 DROP 語句膀篮。
MySQL 默認是隱式提交嘹狞,每執(zhí)行一條語句就把這條語句當成一個事務(wù)然后進行提交。當出現(xiàn)START TRANSACTION?語句時各拷,會關(guān)閉隱式提交刁绒;當?COMMIT?或?ROLLBACK?語句執(zhí)行后嗓袱,事務(wù)會自動關(guān)閉娘纷,重新恢復(fù)隱式提交端辱。
通過?set autocommit=0?可以取消自動提交姜骡,直到?set autocommit=1?才會提交馆蠕;autocommit 標記是針對每個連接而不是針對服務(wù)器的滓侍。
指令
START TRANSACTION?- 指令用于標記事務(wù)的起始點绍傲。
SAVEPOINT?- 指令用于創(chuàng)建保留點憾儒。
ROLLBACK TO?- 指令用于回滾到指定的保留點规哲;如果沒有設(shè)置保留點跟啤,則回退到?START TRANSACTION?語句處。
COMMIT?- 提交事務(wù)唉锌。
-- 開始事務(wù)
START TRANSACTION;
-- 插入操作 A
INSERT INTO `user`
VALUES (1,'root1','root1','xxxx@163.com');
-- 創(chuàng)建保留點 updateA
SAVEPOINT updateA;
-- 插入操作 B
INSERT INTO `user`
VALUES (2,'root2','root2','xxxx@163.com');
-- 回滾到保留點 updateA
ROLLBACK TO updateA;
-- 提交事務(wù)隅肥,只有操作 A 生效
COMMIT;
(以下為 DCL 語句用法)
九、權(quán)限控制
GRANT 和 REVOKE 可在幾個層次上控制訪問權(quán)限:
整個服務(wù)器袄简,使用 GRANT ALL 和 REVOKE ALL腥放;
整個數(shù)據(jù)庫,使用 ON database.*绿语;
特定的表秃症,使用 ON database.table候址;
特定的列;
特定的存儲過程种柑。
新創(chuàng)建的賬戶沒有任何權(quán)限岗仑。
賬戶用 username@host 的形式定義,username@% 使用的是默認主機名聚请。
MySQL 的賬戶信息保存在 mysql 這個數(shù)據(jù)庫中荠雕。
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';
十、存儲過程
存儲過程可以看成是對一系列 SQL 操作的批處理良漱;
使用存儲過程的好處
代碼封裝舞虱,保證了一定的安全性;
代碼復(fù)用母市;
由于是預(yù)先編譯矾兜,因此具有很高的性能。
創(chuàng)建存儲過程
命令行中創(chuàng)建存儲過程需要自定義分隔符患久,因為命令行是以?;?為結(jié)束符椅寺,而存儲過程中也包含了分號,因此會錯誤把這部分分號當成是結(jié)束符蒋失,造成語法錯誤返帕。
包含 in、out 和 inout 三種參數(shù)篙挽。
給變量賦值都需要用 select into 語句荆萤。
每次只能給一個變量賦值,不支持集合的操作铣卡。
創(chuàng)建存儲過程
DROP PROCEDURE IF EXISTS `proc_adder`;
DELIMITER ;;
CREATE DEFINER=`root`@`localhost` PROCEDURE `proc_adder`(IN aint, IN bint, OUT sumint)
BEGIN
DECLARE cint;
ifa isnullthen set a =0;
endif;
ifb isnullthen set b =0;
endif;
set sum? = a + b;
END
;;
DELIMITER ;
使用存儲過程
set@b=5;
callproc_adder(2,@b,@s);
select@sas sum;
十一链韭、游標
游標(cursor)是一個存儲在 DBMS 服務(wù)器上的數(shù)據(jù)庫查詢,它不是一條 SELECT 語句煮落,而是被該語句檢索出來的結(jié)果集敞峭。
在存儲過程中使用游標可以對一個結(jié)果集進行移動遍歷。
游標主要用于交互式應(yīng)用蝉仇,其中用戶需要對數(shù)據(jù)集中的任意行進行瀏覽和修改旋讹。
使用游標的四個步驟:
聲明游標,這個過程沒有實際檢索出數(shù)據(jù)轿衔;
打開游標沉迹;
取出數(shù)據(jù);
關(guān)閉游標害驹;
DELIMITER $
CREATE? PROCEDUREgetTotal()
BEGIN
DECLARE total INT
;
-- 創(chuàng)建接收游標數(shù)據(jù)的變量
DECLARE sid INT;
DECLARE snameVARCHAR(10);
-- 創(chuàng)建總數(shù)變量
DECLARE sage INT;
-- 創(chuàng)建結(jié)束標志變量
DECLARE done INT DEFAULTfalse;
-- 創(chuàng)建游標
DECLARE cur CURSOR FOR SELECT id,name,age from cursor_table where age>30;
-- 指定游標循環(huán)結(jié)束時的返回值
DECLARE CONTINUE HANDLER FOR NOT FOUND SET done =true;
SET total =0;
OPEN cur;
FETCH cur INTO sid, sname, sage;
WHILE(NOT done)
DO
SET total = total +1;
FETCH cur INTO sid, sname, sage;
END WHILE;
CLOSE cur;
SELECT total;
END $
DELIMITER ;
-- 調(diào)用存儲過程
callgetTotal();
十二鞭呕、觸發(fā)器
觸發(fā)器是一種與表操作有關(guān)的數(shù)據(jù)庫對象,當觸發(fā)器所在表上出現(xiàn)指定事件時裙秋,將調(diào)用該對象琅拌,即表的操作事件觸發(fā)表上的觸發(fā)器的執(zhí)行。
可以使用觸發(fā)器來進行審計跟蹤摘刑,把修改記錄到另外一張表中进宝。
MySQL 不允許在觸發(fā)器中使用 CALL 語句 ,也就是不能調(diào)用存儲過程枷恕。
BEGIN和END
當觸發(fā)器的觸發(fā)條件滿足時党晋,將會執(zhí)行?BEGIN?和?END?之間的觸發(fā)器執(zhí)行動作。
?? 注意:在 MySQL 中徐块,分號?;?是語句結(jié)束的標識符未玻,遇到分號表示該段語句已經(jīng)結(jié)束,MySQL 可以開始執(zhí)行了胡控。因此扳剿,解釋器遇到觸發(fā)器執(zhí)行動作中的分號后就開始執(zhí)行,然后會報錯昼激,因為沒有找到和 BEGIN 匹配的 END庇绽。
這時就會用到?DELIMITER?命令(DELIMITER 是定界符,分隔符的意思)橙困。它是一條命令瞧掺,不需要語句結(jié)束標識,語法為:DELIMITER new_delemiter凡傅。new_delemiter?可以設(shè)為 1 個或多個長度的符號辟狈,默認的是分號?;,我們可以把它修改為其他符號夏跷,如?$?-?DELIMITER $?哼转。在這之后的語句,以分號結(jié)束拓春,解釋器不會有什么反應(yīng)释簿,只有遇到了?$,才認為是語句結(jié)束硼莽。注意庶溶,使用完之后,我們還應(yīng)該記得把它給修改回來懂鸵。
NEW和OLD
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ā)器的要點喳张,有必要先了解一下創(chuàng)建觸發(fā)器的指令。
CREATE TRIGGER?指令用于創(chuàng)建觸發(fā)器美澳。
語法:
CREATE TRIGGER trigger_name
trigger_time
trigger_event
ON table_name
FOR EACH ROW
BEGIN
trigger_statements
END;
說明:
trigger_name:觸發(fā)器名
trigger_time: 觸發(fā)器的觸發(fā)時機销部。取值為?BEFORE?或?AFTER。
trigger_event: 觸發(fā)器的監(jiān)聽事件制跟。取值為?INSERT舅桩、UPDATE?或?DELETE。
table_name: 觸發(fā)器的監(jiān)聽目標雨膨。指定在哪張表上建立觸發(fā)器擂涛。
FOR EACH ROW: 行級監(jiān)視,Mysql 固定寫法哥放,其他 DBMS 不同歼指。
trigger_statements: 觸發(fā)器執(zhí)行動作。是一條或多條 SQL 語句的列表甥雕,列表內(nèi)的每條語句都必須用分號?;?來結(jié)尾踩身。
示例:
DELIMITER $
CREATE TRIGGER `trigger_insert_user`
AFTER INSERT ON `user`
FOR EACH ROW
BEGIN
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;
文章來源:https://juejin.im/post/5c7e524af265da2d914db18f
如有侵權(quán)請聯(lián)系作者刪除