SQL 必知必會(huì)
第1章 了解SQL
定義
- 結(jié)構(gòu)化查詢語言(Structured Query Language)
主鍵
-
定義
- 一行或一組列,其值能夠唯一標(biāo)識(shí)表中每一行
-
要求
- 任意兩行不能有相同的主鍵值
- 每一行都必須有一個(gè)主鍵值
- 主鍵列中的值不能更改或更新
- 主鍵值不能重用(一旦刪除,不能夠再賦予給以后的新行)
第2章 檢索數(shù)據(jù):SELECT
基本語法
- SELECT Col1,Col2, FROM table
選擇全部列
- 星號(hào) *
選擇不同行
-
DISTINCT
- 作用于所有行,不僅僅是跟在其后的一行:即只要兩行不是所有列完全相同,則會(huì)被檢索出來。
限制查詢結(jié)果行數(shù)
-
SQL SERVER: TOP 5
- SELECT TOP 5 student_name FROM Students
-
MYSQL :LIMIT 5 OFFESET 3
- SELECT prod_name FROM Products LIMIT 5 OFFSET 5
- 可以簡寫為LIMIT 3,5
- 索引序號(hào)從0開始
第3章 排序檢索數(shù)據(jù):ORDER BY
語句位置
- SELECT 語句的最后一條
指定排序列的方式
-
按列位置(序號(hào))排序
'位置'指的是SELECT語句后的列排序順序,而不是原表中的順序
序號(hào)從1開始
-
缺點(diǎn)
- 對(duì)SELECT 清單修改時(shí),如果沒有同時(shí)修改ORDER BY的序號(hào),容易出錯(cuò)。
-
指定準(zhǔn)確列名
- SELECT .....
ORDER BY col1,col2
- SELECT .....
指定順序
-
DESC/ASC
-
位置
- 對(duì)應(yīng)列名后
默認(rèn)為ASC,可省略
-
第4章 過濾數(shù)據(jù):WHERE
基本操作符
-
不等于:<>/!=
- MSSQL和MYSQL兩者都可使用
- 可以用于字符串匹配檢查
不大于,不小于:!>, !<
-
BETWEEN
- 支持字符串,日期/時(shí)間,數(shù)值的比較
-
NULL值的比較檢測
-
IS NULL/IS NOT NULL
- 專門用于NULL值得匹配
-
<=>
- 當(dāng)且僅當(dāng)兩個(gè)值都為NULL時(shí)才返回NULL
不能使用=/<>來對(duì)NULL值進(jìn)行比較或檢驗(yàn)
MYSQL的NULL值處理(RUNOOB)
-
第5章 高級(jí)數(shù)據(jù)過濾
AND
OR
- 注意:AND優(yōu)先級(jí)高于OR。多使用括號(hào)確立優(yōu)先級(jí),即使知曉優(yōu)先級(jí)。
IN
-
語法
- col in (a,b,c) 等價(jià)于col1 =a or col1 = b or col =c
-
優(yōu)點(diǎn)
- 比對(duì)應(yīng)的OR語句更快
- 更直觀
- 配合其他select查詢進(jìn)行嵌套
NOT
-
作用
- 否認(rèn)其后的條件
-
位置
- 位于其他判斷關(guān)鍵詞前:NOT IN
第6章 通配符:LIKE
%
-
作用
-
任意字符出現(xiàn)任意次數(shù)
任意字?jǐn)?shù):可以匹配0個(gè)字符
-
一個(gè)使用場景:字段后填補(bǔ)的空格的解決
- 在匹配字符串后再加一個(gè)%,來匹配空格
-
-
語法
- SELECT *
FROM Customers
WHERE cust_name LIKE 'F%'
- SELECT *
-
不匹配NULL
- '%'不會(huì)匹配為NULL的行
ACCESS 使用的是*
下劃線_
-
作用
- 僅匹配單個(gè)字符,且不可匹配0個(gè)字符
字符集匹配
-
[ ]
-
作用
- 匹配字符集
-
使用
-
SQL SERVER
- SELECT *
FROM Customers
WHERE cust_name LIKE '[FV]%';
- SELECT *
-
-
語法
- SELECT *
FROM Customers
WHERE cust_name RLIKE '^[FV]';
- SELECT *
-
-
正則表達(dá)式RLIKE(FOR MYSQL)
MYSQL不支持使用[]匹配字符集
MySQL 中使用 REGEXP 或 NOT REGEXP (或 RLIKE 和 NOT RLIKE) 和正則表達(dá)式來實(shí)現(xiàn)字符串匹配。
-
語法
- SELECT *
FROM course
WHERE Tno REGEXP '^[張王].*'
- SELECT *
RUNOOB鏈接
^
-
作用
- 對(duì)[ ]進(jìn)行否定:即不在方擴(kuò)內(nèi)的字母才能夠匹配
-
使用
- [^JMK]
注意點(diǎn)
-
使用技巧
- ① 不要過度使用通配符
- ② 盡量不要在搜索模式的開始使用通配符
- ③ 特別注意通配符位置的正確使用
- ④默認(rèn)不區(qū)分大小寫
第7章 創(chuàng)建計(jì)算字段
位置
- 緊貼在SELECT后
別名(ALIAS)
-
作用
- 一個(gè)字段或值的替換名
- 為拼接等字符操作創(chuàng)建的字段提供名稱
-
使用
-
AS
- MYSQL,MSSQL都可以省略 AS
-
拼接字段(concatenate)
-
SQL SERVER
- +(使用與Python相似)
-
Oracle,SQLite等
- ||
-
MySQL,MariaDB
-
Concat()語句
- SELECT CONCAT(id, name, work_date)
FROM employee_tbl;
- SELECT CONCAT(id, name, work_date)
-
算術(shù)計(jì)算
- +-*/
- ()改變計(jì)算順序
第8章 使用函數(shù)處理數(shù)據(jù)
DBMS差異:函數(shù)在各DBMS的通用度較低,只有少數(shù)函數(shù)通用。
-
可移植
- 代碼可在不同系統(tǒng)上運(yùn)行
- 眾多程序員建議只使用可移植的函數(shù)
-
建議
- 使用函數(shù)時(shí),盡量進(jìn)行注釋,以幫助其他DBMS系統(tǒng)的使用者理解。
使用函數(shù)
-
字符處理
-
TRIM/RTRIM/LTRIM
- 去除空格
-
UPPER/LOWER
- 轉(zhuǎn)化為大/小寫
-
LEFT/RIGHT
返回字符左/右指定長度的字符
-
使用
- LEFT('ZENG'',2)
返回: ‘ZE'
- LEFT('ZENG'',2)
-
SOUNDEX
匹配發(fā)音類似的項(xiàng)
-
使用
- SOUNDEX(colname) = SOUNDEX('charact')
-
-
日期和時(shí)間處理
- 可移植性最差
- ONENOTE有網(wǎng)頁裁剪
-
數(shù)值處理函數(shù)
-
ABS
- 絕對(duì)值
-
EXP
- 自然底數(shù)的指數(shù)函數(shù)
-
SQRT
- 平方根
-
PI
- 圓周率
-
COS/SIN/TAN
- 三角函數(shù)
MYSQL數(shù)值函數(shù)(RUNOOB)
-
第9章 匯總數(shù)據(jù)
匯集數(shù)據(jù)
-
COUNT
-
計(jì)行數(shù)
-
count(*)
- 返回總行數(shù)
-
count(col_name)
- 返回col_name中非空行數(shù)
-
-
MAX
MIN
AVG
SUM
MIN,MAX,AVG,SUM的括號(hào)內(nèi)都能進(jìn)行列之間的數(shù)值計(jì)算
聚集函數(shù)內(nèi)部的可用參數(shù)
-
DISTINCT
-
作用
- 聚集不同的值
-
用法
- AGG_FUNC(DISTINCT col_name)
-
-
TOP/TOP PERCENT
- 僅支持sqlserver
組合聚集函數(shù)
一個(gè)SELECT語句可以包含多個(gè)聚集函數(shù)
-
舉例
- SELECT COUNT(*) AS num_itesm,
MIN(prod_price) AS min_price
- SELECT COUNT(*) AS num_itesm,
第10章 分組數(shù)據(jù)
創(chuàng)建分組:GROUP BY
-
位置
- WHERE后,ORDER前
-
注意點(diǎn)
-
ONLY_FULL_GROUP_BY參數(shù)
-
參數(shù)為打開狀態(tài)時(shí)
- 除聚集語句(COUNT,SUM,MAX等),所有SELECT中出現(xiàn)的列名,都必須在GROUP BY中出現(xiàn)。
-
-
過濾分組:HAVING
-
與WHERE的關(guān)系
- 基本語法與WHERE一致,但位置位于GROUP BY后
- WHERE 過濾行,而HAVING過濾組
-
使用
一定是配合GROUP BY使用,一定是對(duì)分組進(jìn)行過濾
可以與WHERE共同使用(兩者對(duì)行和分組進(jìn)行過濾,不互斥)
-
舉例
- SELECT col1,FUC(col2)
FROM table1
WHERE col3>0
GROUP BY col1
HAVING FUNC(col2) >0 - SELECT order_num,SUM(quantity*item_price) as total_price
FROM OrderItems
GROUP BY order_num
HAVING total_price>1000
- SELECT col1,FUC(col2)
第11章 使用子查詢
定義
- 嵌套在其他查詢中的查詢
作用
-
利用子查詢進(jìn)行過濾
-
使用
- SELECT col1
FROM table1
WHERE col2 = (SELECT col2
FROM table2
WHERE con1)
- SELECT col1
-
注意
- 子查詢的SELECT只能用來返回單列,不能返回多個(gè)列
-
-
將子查詢做為一個(gè)字段
-
使用
- SELECT cust_name,
cust_state,
(SELECT COUNT(*)
FROM Orders
WHERE Orders.cust_id=Customers.cust_id) AS orders
FROM Customers
ORDER BY cust_name
- SELECT cust_name,
-
注意
- WHERE條件處要使用完全限定名
- 等價(jià)聯(lián)結(jié)語句
-
第12章 連接表
聯(lián)結(jié)表
-
內(nèi)聯(lián)結(jié)
-
使用
-
內(nèi)聯(lián)結(jié)(inner join)
-
SELECT vend_name,prod_name,prod_price
FROM Vendors INNER JOIN Products
ON Vendors.prod_id = Products.prod_id-
解釋
-
SELECT 的列后的各列名,來自兩個(gè)以上的不同表
FROM 各名來自的表名
WHERE語句指示匹配列(注意使用帶表名的完全限定名)- 缺少WHERE/ON的聯(lián)結(jié)條件語句,將返回m*n行的笛卡爾積表。m,n為兩表各自的行數(shù)。
-
-
-
-
等值語句
- SELECT vend_name,prod_name,prod_price
FROM Vendors,Products
WHERE Vendors.prod_id = Products.prod_id
- SELECT vend_name,prod_name,prod_price
-
聯(lián)結(jié)多個(gè)表
- 可以通過多個(gè)聯(lián)結(jié)連接多個(gè)表
-
-
可用于替代子查詢
-
子查詢
- SELECT cust_name,cust_contact
FROM Customers
WHERE Customers.cust_id in(
SELECT cust_id
FROM Orders
WHERE order_num in(
SELECT order_num
FROM OrderItems
WHERE prod_id='RGAN01'
)
)
- SELECT cust_name,cust_contact
-
等價(jià)內(nèi)聯(lián)結(jié)語句
- SELECT cust_name,cust_contact
FROM Customers
WHERE Customers.cust_id in(
SELECT cust_id
FROM Orders
WHERE order_num in(
SELECT order_num
FROM OrderItems
WHERE prod_id='RGAN01'
)
)
- SELECT cust_name,cust_contact
-
-
使用建議及注意
- 根據(jù)SELECT 需求的列選擇最少的表格及聯(lián)結(jié)
- 表格盡量少,使用的聯(lián)結(jié)盡量少。 以節(jié)省運(yùn)算力
- 需滿足引用完整性
-
第13章 高級(jí)聯(lián)結(jié)
表別名
在FROM語句中定義
SQL SERVER中,F(xiàn)ROM語句最先運(yùn)行,因此表別名可在SELECT語句中的任意階段被使用。
-
作用
- 縮短SQL語句
- 可以在一條語句中使用同一表多次,且避免歧義
使用不同類型的聯(lián)結(jié)
-
自聯(lián)結(jié)
需要自己控制返回的列,來避免列重復(fù)
-
使用場景
-
替代需要自身子查詢的場景
- SELECT *
FROM OrderItems oi1,OrderItems oi2
WHERE oi1.order_item=oi2.order_item AND
oi2.prod_id='BR01'
- SELECT *
-
-
自然聯(lián)結(jié)
- SELECT *
FROM Customers NATURAL JOIN Orders
- SELECT *
-
自然連接和內(nèi)聯(lián)結(jié)的關(guān)系和區(qū)別
- 自然聯(lián)結(jié)是特殊的內(nèi)聯(lián)結(jié),自然連接自動(dòng)尋找相同的列名作為匹配項(xiàng)
- 內(nèi)連接自己指定聯(lián)結(jié)列(ON/WHERE指定),SELECT 后為*。
- 兩者返回的列數(shù)相同。
- 但自然聯(lián)結(jié)不包含兩表用作匹配的列不相同的行,而inner join包含不同的列。
- INNER JOIN 配合USING(col list) 可以達(dá)到與natural join 相同的結(jié)果
- 小總結(jié):NATURAL JOIN=SELECT * FROM TABLE1,TABLE2 WHERE table1.同名columns=table2.同名columns
- 詳見diigo標(biāo)注部分
-
外聯(lián)結(jié)
-
與內(nèi)聯(lián)結(jié)區(qū)別
- 包含了那些在相關(guān)表中沒有關(guān)聯(lián)的行
-
使用
LEFT OUTER JOIN
RIGHT OUTER JOIN
-
FULL OUTER JOIN
- MSSQL 支持
- MYSQL,ACCESS,SQLite等不支持
-
第14章 組合查詢
UNION
-
作用
- 組合多個(gè)查詢結(jié)果
- 每個(gè)組合查詢都有等效的單個(gè)使用復(fù)WHERE的語句
-
使用
- SELECT col1,col2,FUNC(col3)
...
UNION
SELECT col1,col2,FUNC(col3)
- SELECT col1,col2,FUNC(col3)
-
使用注意點(diǎn)
- ①包含兩個(gè)及兩個(gè)以上的SELECT語句
- ②每個(gè)查詢都具有相同的列名或別名,表達(dá)式或聚集函數(shù)(不要求順序一致)
- ③列類型必須可兼容(不一定相同,但需要可相互轉(zhuǎn)換)
- ④查詢多個(gè)表時(shí),若表名不匹配可以使用別名,別名一致即可,不要求原列名一致。
- ⑤使用ORDER BY,只需在最后一個(gè)SELECT語句中指定排序方式即可作用在整個(gè)查詢結(jié)果上
UNION ALL
- UNION ALL保留各個(gè)SELECT語句中相同的行(UNION和等效的WHRER語句都默認(rèn)去除)
EXCEPT/MINUS
檢索只在第一個(gè)SELECT檢索的表中存在而不在第二個(gè)SELECT查詢結(jié)果中的行
-
舉例
- SELECT cust_id,cust_name,cust_contact
FROM Customers
WHERE cust_name='FUn4All'
EXCEPT
SELECT cust_id,cust_name,cust_contact
FROM Customers
WHERE cust_contact='Jim Jones'
- SELECT cust_id,cust_name,cust_contact
-
注意
- ①僅部分DBMS支持
- ②MSSQL使用EXCEPT
INTERCEPT
檢索在兩個(gè)表格中都存在的行(交集∩)
-
注意
- ①部分DBMS支持
- ②MSSQL支持
- ③可以使用FULL OUTER JOIN 代替
第15章 插入數(shù)據(jù)
INSERT
-
插入完整的行
-
實(shí)例
-
INSERT INTO table1(col1_name,col2_name,..,coln_name)
VALUES(col1_value,col2_value,...,coln_value);-
注意
- 兩個(gè)tuple的順序互相一致即可,不需要與原表的列順序一致
- table1后的表名tuple可以省略。但不建議,因?yàn)槭÷栽搕uple后VALUES的列tuple順序必須與table1的實(shí)際列順序一致。
-
-
-
-
插入部分行
-
允許條件
- 被省略的列允許NULL或者設(shè)置了默認(rèn)值
-
實(shí)例
- 與插入完整行相似,只是兩個(gè)tuple可以不完整。
- INSERT INTO后的tuple不可省略
-
-
注意
- 一個(gè)INSERT INTO 語句只能插入一行內(nèi)容
INSERT INTO ...SELECT
-
實(shí)例
-
INSERT INTO table1(col1_name,col2_name,..,coln_name)
SELECT col1_value,col2_value,...,coln_value
FROM table2
WHERE...-
注意
- SELECT語句后的列名序列不需要使用括號(hào)
- 兩個(gè)列名序列的名稱不要求一致
- 兩個(gè)列名序列的位置必須正確
-
-
-
注意
- INSERT INTO...SELECT是特殊的INSERT INTO 語句??梢愿鶕?jù)SELECT返回結(jié)果的行數(shù)插入數(shù)據(jù)。即可以一次性插入多行。
SELECT INTO
-
作用
- 將SELECT選出的表插入一個(gè)新創(chuàng)立的table1中
-
實(shí)例
-
SELECT col_name_tuple
INTO table1
FROM table2,table3
WHERE...
GROUP BY...
ORDER BY...-
注意
- 所有SELECT語句中可用的子語句和方法都可以用
- table1是在該語句中新創(chuàng)立的表
-
-
-
使用場景
- 測試新的SQL語句前,創(chuàng)立一個(gè)新的表格用做測試
-
MYSQL不支持SELECT INTO
-
MYSQL 如何創(chuàng)建一個(gè)表的復(fù)制?:
- show create table orders + insert into ... SELECT
-
第16課 更新和刪除數(shù)據(jù)
更新數(shù)據(jù)
-
UPDATE SET
-
實(shí)例
- UPDATE table1
SET col_name1 = col_value1,
col_name2 = col_value2
WHERE cons
- UPDATE table1
-
-
UPDATE SELECT
-
基本格式
- UPDATE A a INNER JOIN B b ON b.key_id = a.key_id
SET a.val = 2
WHERE b.satisfy = 1
- UPDATE A a INNER JOIN B b ON b.key_id = a.key_id
-
LEFT JOIN/RIGHT JOIN 配合GOURP BY 來修改表格
- UPDATE course c
RIGHT JOIN (
SELECT Cno,AVG(score) avg_score
FROM sc
GROUP BY Cno
HAVING avg_score>=75
) sc
ON c.Cno=sc.Cno
SET c.Tno="厲害老師";
- UPDATE course c
-
SELECT *
FROM course;
- UPDATE FROM
刪除數(shù)據(jù)
-
刪除某表中的部分?jǐn)?shù)據(jù)
-
DELETE FROM
- DELETE FROM table
WHERE cons
- DELETE FROM table
-
-
刪除全部數(shù)據(jù)
DELETE FROM table1
-
TRUNCATE table1
- 比DELETE更快
使用更新和刪除注意點(diǎn)
- 建議UPDATE或刪除前使用SELECT進(jìn)行測試,保證進(jìn)行正確的操作(對(duì)WHERE語句)
- 務(wù)必考慮并實(shí)施引用完整性的數(shù)據(jù)庫
- 部分DBMS有強(qiáng)制使用WHERE的選項(xiàng),盡量使用
第17章 創(chuàng)建和操縱表
創(chuàng)建表
-
實(shí)例
- CREATE TABLE table_name
(col1_name char(10) NOT NULL,
col2_name DECIMAL(8,2) NULL,
...
coln_name (data_type) (NULL/NOT NULL)
)
- CREATE TABLE table_name
-
注意點(diǎn)
大部分DBMS NULL/NOT NULL一項(xiàng)默認(rèn)NULL,因此NULL可省略
-
設(shè)定默認(rèn)值:對(duì)應(yīng)列的NULL/NOT NULL后添加DEFAULT default_value(常使用日期函數(shù)做為默認(rèn)值)
-
日期函數(shù)
-
MSSQL
- GETDATE()
-
MYSQL
- CURRENT_DATE()
-
-
注意一個(gè)字段的名稱,類型,是否為空之間是不需要空格的。
-
建議
- 盡量給定DEFAULT值,而定義為NULL
更新表
-
注意點(diǎn)
- 盡量在創(chuàng)立表時(shí),就考慮好未來需求,減少表的修改。
- 大多數(shù)表支持新增列或者更改無內(nèi)容填充的列的操作
- 大多數(shù)表不支持 刪除或更改表中的列,重新命名表中的列,對(duì)已有內(nèi)容填充的表的修改
-
示例
-
新增列
- ALTER TABLE table1
ADD col_name data_type NULL/NOTNULL - 大多數(shù)DBMS支持
- ALTER TABLE table1
-
刪除列
- ALTER TABLE table1
DROP col_name - DBMS 支持通用度不高
- ALTER TABLE table1
-
修改表
- ALTER CHANGE
- ALTER MODIFY
-
修改表名
- ALTER TABLE testalter_tbl RENAME TO alter_tbl;
-
復(fù)雜表更改的一般流程
- 按照新需求創(chuàng)建一個(gè)新的表格
- 復(fù)制原表仍需要的數(shù)據(jù)內(nèi)容到新表(UPDATE SELECT)
- 檢查插入數(shù)據(jù)后的新表
- 更改原表表名或直接刪除
- 將新表更改為原表表名
- 根據(jù)需要,重新建立觸發(fā)器,儲(chǔ)存過程,索引和外鍵
-
注意點(diǎn)
- ALTER的使用需盡量小心,更改前做好備份
RUNNOOB關(guān)于ALTER TABLE
-
刪除表
-
DROP table1
- 遵循引用完整性的等關(guān)系規(guī)則
-
MYSQL
- DROP TABLE table_name
重命名表格
-
sp_rename 儲(chǔ)存過程
- MSSQL
-
RENAME
- MSSQL,SQLite外的大多數(shù)DBMS
第18課 使用視圖
視圖作用
- 重用SQL語句,簡化操作
- 權(quán)限管理,只允許查看視圖內(nèi)容,而非整個(gè)表
- 展示與原表不同的數(shù)據(jù)格式和內(nèi)容
注意
- 每次使用視圖,都會(huì)重新運(yùn)行一次查詢。因此復(fù)雜視圖會(huì)影響性能
限制規(guī)則
命名唯一
可進(jìn)行權(quán)限管理
可以嵌套(但嵌套會(huì)提高復(fù)雜度,占用更多運(yùn)算力)
-
眾多DBMS進(jìn)制在視圖的定義時(shí)的查詢語句中使用ORDER BY
- SQL SERVER不允許。但是如果SELECT語句后添加TOP 關(guān)鍵字,則可以使用。
部分DBMS將視圖設(shè)置為只讀,即不可更新視圖內(nèi)容并寫入底層原表
部分DBMS允許創(chuàng)建一種視圖,視圖限制原表內(nèi)容修改會(huì)導(dǎo)致視圖行數(shù)減少的操作
參照具體的DBMS
創(chuàng)建視圖
- CREATE VIEW view_name AS
SELECT 語句
使用建議
- 創(chuàng)建不綁定特定數(shù)據(jù)的視圖(如限定某個(gè)id為具體值),而在使用視圖時(shí)再進(jìn)行限定。
第19課 使用儲(chǔ)存過程
定義
- 為以后使用而保存的一條或多條SQL語句。可以視為批處理(但不只是批處理)
使用
-
計(jì)Customers中帶郵件的行數(shù)
-
創(chuàng)建
- CREATE PROCEDURE MailingListCounting
AS
DECLARE @cnt INTEGER
SELECT @cnt = COUNT(*)
FROM Customers
WHERE NOT cust_email IS NULL
- CREATE PROCEDURE MailingListCounting
-
使用
- DECLARE @RETURNVALUE INT
@RETURNVALUE = MailingListCounting
SELECT @RETURNVALUE
- DECLARE @RETURNVALUE INT
-
-
在ORDERS表單插入新訂單
-
創(chuàng)建方法①
- CREATE PRODUCE NewOrder @cust_id CHAR(10)
AS
DECLARE @order_num INTEGER
SELECT @order_num=MAX(order_num)
FROM Orders
SELECT @order_num = @order_num+1
INSERT INTO Orders(order_num,order_date,cust_id)
VALUES(@order_num,GETDATE(),@cust_id)
- CREATE PRODUCE NewOrder @cust_id CHAR(10)
-
RETURN @order_num
- 創(chuàng)建方法②
- CREATE PRODUCE NewOrder @cust_id CHAR(10)
AS
INSERT INTO Orders(cust_id)
VALUES(cust_id)
SELECT cust_num = @@IDENTITY
- 方法②的日期由創(chuàng)建表格時(shí)的DEFAULT GETDATE()給出
order_num由標(biāo)識(shí)字段(identity field)給出
注意點(diǎn)
- 使用頻率遠(yuǎn)高于創(chuàng)建,創(chuàng)建與使用權(quán)限可分隔
第20課 管理事務(wù)處理
事務(wù)處理
-
可回退的語句
- INSERT
- UPDATE
- DELETE
-
不可回退的語句
- SELECT
- DROP
- CREATE
控制事務(wù)處理
-
事務(wù)(TRANSCATION)
- BEGIN TRANSCATION
...
COMMIT TRANSCATION - 省略號(hào)部分,要么全部執(zhí)行,如果中間某句出錯(cuò),則全部不執(zhí)行
- BEGIN TRANSCATION
-
回滾(ROLLBACK)
-
作用
- 使數(shù)據(jù)庫回到上次COMMIT或者TRANCATION的狀態(tài)
-
-
保留點(diǎn)(SAVE)
-
實(shí)例
- SAVE TRANSACTION delete1;
-
ROLLBACK TRANSACTION delete1:
- 注意
- 每個(gè)回滾點(diǎn)的名稱必須唯一(本實(shí)例為delete1)
- 常用回滾條件:
IF @@ERROR <>0 ROLLBACK TRANSCATION delete1;
補(bǔ)充
ONLY_FULL_GROUP_BY
-
Mysql的WHERE 語句的聯(lián)結(jié)Group by似乎不要求聚合函數(shù)外的所有列。但JOIN ON 要求有
SELECT c.cust_id,c.cust_name,c.cust_state,COUNT(o.order_num) nums
FROM Customers c,Orders o
WHERE c.cust_id=o.cust_id
GROUP BY c.cust_id;-
ANSWER
- sql_mode下的ONLY_FULL_GROUP_BY默認(rèn)打開
大小寫區(qū)分
- 默認(rèn)大小寫不區(qū)分,但可以通過設(shè)置更改為敏感
注釋
-
符號(hào)
-
單行注釋
- -- comments
-
多行注釋
- /* comments1
comments2 */
- /* comments1
-
數(shù)值型補(bǔ)零前后的值大小相同
- 3.49,3.490大小相同,條件篩選不用區(qū)分
MSSQL語句順序
-
運(yùn)行順序
- (1) FROM < left_table>
(3) < join_type> JOIN < right_table> (2) ON < join_condition>
(4) WHERE < where_condition>
(5) GROUP BY < group_by_list>
(6) WITH {cube | rollup}
(7) HAVING < having_condition>
(8) SELECT (9) DISTINCT (11) < top_specification> < select_list>
(10) ORDER BY < order_by_list>
- FORM: 對(duì)FROM的左邊的表和右邊的表計(jì)算笛卡爾積。產(chǎn)生虛表VT1
ON: 對(duì)虛表VT1進(jìn)行ON篩選,只有那些符合<join-condition>的行才會(huì)被記錄在虛表VT2中。
JOIN: 如果指定了OUTER JOIN(比如left join、 right join),那么保留表中未匹配的行就會(huì)作為外部行添加到虛擬表VT2中,產(chǎn)生虛擬表VT3, rug from子句中包含兩個(gè)以上的表的話,那么就會(huì)對(duì)上一個(gè)join連接產(chǎn)生的結(jié)果VT3和下一個(gè)表重復(fù)執(zhí)行步驟1~3這三個(gè)步驟,一直到處理完所有的表為止。
WHERE: 對(duì)虛擬表VT3進(jìn)行WHERE條件過濾。只有符合<where-condition>的記錄才會(huì)被插入到虛擬表VT4中。
GROUP BY: 根據(jù)group by子句中的列,對(duì)VT4中的記錄進(jìn)行分組操作,產(chǎn)生VT5.
CUBE | ROLLUP: 對(duì)表VT5進(jìn)行cube或者rollup操作,產(chǎn)生表VT6.
HAVING: 對(duì)虛擬表VT6應(yīng)用having過濾,只有符合<having-condition>的記錄才會(huì)被 插入到虛擬表VT7中。
SELECT: 執(zhí)行select操作,選擇指定的列,插入到虛擬表VT8中。
DISTINCT: 對(duì)VT8中的記錄進(jìn)行去重。產(chǎn)生虛擬表VT9.
ORDER BY: 將虛擬表VT9中的記錄按照<order_by_list>進(jìn)行排序操作,產(chǎn)生虛擬表VT10.
LIMIT:取出指定行的記錄,產(chǎn)生虛擬表VT11, 并將結(jié)果返回。
- 理解:FROM 中定義的別名,可以全局引用
-
書寫順序
- SELECT DISTINCT
FROM
JOIN
ON
WHERE
GROUP BY
HAVING
ORDER
LIMIT
- SELECT DISTINCT
因此別名在SELECT創(chuàng)建,則只能在SELECT和ORDER BY語句中使用。
NULL不是空字符串
- NULL是沒有值,而“”可以理解為0長度的字符串
