讀書筆記《sql必知必會》

檢索

最簡單的查詢語句

select * from [TableName]

排序

降序

select * from [TableName] order by [Field] desc

升序

select * from [TableName] order by [Field]

過濾

高級

利用多列組合進行過濾(拼接字段):

SELECT RTRIM(vend_name) + ' (' + LTRIM(vend_country) + ')'
AS vend_title
FROM Vendors
ORDER BY vend_name;

其中RTRIM函數(shù)去掉值右邊所有空格色解,LTRIM函數(shù)去掉值左邊左右空格。

通配符

SELECT * FROM Persons
WHERE City LIKE 'Ne%'

常用通配符

通配符 描述
% 替代一個或多個字符
_ 僅替代一個字符
[charlist] 字符列中的任何單一字符
[^charlist]或[!charlist] 不在字符列中的任何單一字符

創(chuàng)建計算字段

select prod_id, quantity, quantity*item_price as expanded price
from OrderItems

數(shù)據(jù)處理函數(shù)

  1. 文本處理函數(shù)
函數(shù) 說明
LEFT 返回字符串左邊的字符
LENGTH 返回字符串長度
  1. 數(shù)值處理
函數(shù) 說明
ABS 絕對值
COS 余弦
EXP 指數(shù)值
PI 圓周率
  1. 聚集函數(shù)
函數(shù) 說明
AVG 平均值
COUNT 行數(shù)
MAX 最大值
MIN 最小值
SUM 求和

分組

select vend_id, COUNT(*) as num_prods
from Products
group by vend_id

過濾分組使用HAVING操作符

select cust_id, COUNT(*) as orders
from Orders
group by cust_id
having count(*) >= 2;

子查詢

子查詢常用于WHERE子句的IN操作符中该镣,以及用來填充計算列勇婴。

select cust_name, cust_contact
from Customers
where cust_id IN (select cust_id from Order where prod_id = 'RGAN01')

聯(lián)結表

笛卡爾積A x B

select vend_name, prod_name, prod_price
from Vendors, Products
where Vendors.vend_id = Products.vend_id

內(nèi)聯(lián)積(inner join)

select vend_name, prod_name, prod_price
from Vendors inner join Products
on Vendors.vend_id = Products.vend_id;

表別名

SELECT cust_name, cust_contact
FROM Customers AS C, Orders AS O, OrderItems AS OI
WHERE C.cust_id = O.cust_id
AND OI.order_num = O.order_num
AND prod_id = 'RGAN01';

組合查詢

合并

select * from A union select * from B

表操作

新增表

CREATE TABLE Products
(
prod_id CHAR(10) NOT NULL,
vend_id CHAR(10) NOT NULL,
prod_name CHAR(254) NOT NULL,
prod_price DECIMAL(8,2) NOT NULL,
prod_desc VARCHAR(1000) NULL,
quantity INTEGER NOT NULL DEFAULT 1,
);

更新表

新增字段

ALTER TABLE Vendors
ADD vend_phone CHAR(20);

刪除字段

ALTER TABLE Vendors
DROP COLUMN vend_phone;

刪除表

DROP TABLE CustCopy;

更新

UPDATE Customers
SET cust_email = 'kim@thetoystore.com'
WHERE cust_id = '1000000005';

刪除

DELETE FROM Customers
WHERE cust_id = '1000000006';

如果需要刪除所有行,可使用TRUNCATE TABLE

TRUNCATE TABLE Customers;

復制

INSERT INTO Customers(cust_id,
cust_name,
cust_address,
cust_city,
cust_state,
cust_zip,
cust_country)
VALUES('1000000006',
'Toy Land',
'123 Any Street',
'New York',
'NY',
'11111',
'USA');

將select執(zhí)行結果插入到表中(導出數(shù)據(jù))

INSERT INTO Customers(cust_id,
cust_contact,
cust_email,
cust_name,
cust_address,
cust_city,
cust_state,
cust_zip,
cust_country)
SELECT cust_id,
cust_contact,
cust_email,
cust_name,
cust_address,
cust_city,
cust_state,
cust_zip,
cust_country
FROM CustNew;

將數(shù)據(jù)復制到一個新表,導入數(shù)據(jù)

SELECT *
INTO CustCopy
FROM Customers;

視圖

作為視圖,它不包含任何列或數(shù)據(jù)州弟,包含的是一個查詢。

存儲過程

相當于編程語言中的函數(shù),用于批量執(zhí)行語句婆翔。

CREATE PROCEDURE MailingListCount (
ListCount OUT INTEGER
)
IS
v_rows INTEGER;
BEGIN
SELECT COUNT(*) INTO v_rows
FROM Customers
WHERE NOT cust_email IS NULL;
ListCount := v_rows;
END;

參數(shù)列表: ListCount OUT INTEGER
函數(shù)體: BEGIN END 所包裹的語句

使用存儲過程:

var ReturnValue NUMBER
EXEC MailingListCount(:ReturnValue);
SELECT ReturnValue;

事務管理

事務處理是用來保證數(shù)據(jù)庫完整性的一種機制拯杠。
其中:
事務(transaction)指一組SQL語句;
回退(rollback)指撤銷指定SQL語句的過程啃奴;
提交(commit)指將未存儲的SQL語句結果寫入數(shù)據(jù)庫表潭陪;
保留點(savepoint)指事務處理中設置的臨時占位符(placeholder),可以對它發(fā)布回退(與回退整個事務處理不同)最蕾。

sql server為例:

提交事務:

BEGIN TRANSACTION
...
COMMIT TRANSACTION

回退

DELETE FROM Orders;
ROLLBACK;

定義保留點

SAVE TRANSACTION delete1;

其他高級特性

約束

約束(constraint)是管理如何插入或處理數(shù)據(jù)庫數(shù)據(jù)的規(guī)則, 目的是維持引用完整性(referential integrity)依溯。

  1. 主鍵約束Primary Key
ALTER TABLE Vendors
ADD CONSTRAINT PRIMARY KEY (vend_id);
  1. 外鍵約束
ALTER TABLE Orders
ADD CONSTRAINT
FOREIGN KEY (cust_id) REFERENCES Customers (cust_id)
  1. 唯一約束
    與主鍵約束類似,用來保證一列(或一組列)中的數(shù)據(jù)是唯一的瘟则。唯一約束不能用來定義外鍵
ALTER TABLE Persons
ADD CONSTRAINT uc_PersonID UNIQUE (Id_P,LastName)
  1. 檢查約束
CREATE TABLE OrderItems
(
order_num INTEGER NOT NULL,
order_item INTEGER NOT NULL,
prod_id CHAR(10) NOT NULL,
quantity INTEGER NOT NULL CHECK (quantity > 0),
item_price MONEY NOT NULL
);
ADD CONSTRAINT CHECK (gender LIKE '[MF]')
  1. 刪除約束
ALTER TABLE Persons
DROP CONSTRAINT uc_PersonID

索引

索引用來排序數(shù)據(jù)以加快搜索和排序操作的速度誓沸。

CREATE INDEX prod_name_ind
ON PRODUCTS (prod_name);

觸發(fā)器

觸發(fā)器是特殊的存儲過程,它在特定的數(shù)據(jù)庫活動發(fā)生時自動執(zhí)行壹粟。

CREATE TRIGGER customer_state
ON Customers
FOR INSERT, UPDATE
AS
UPDATE Customers
SET cust_state = Upper(cust_state)
WHERE Customers.cust_id = inserted.cust_id;

一般來說,約束的處理比觸發(fā)器快宿百,因此在可能的時候趁仙,應該盡量使用約束。

?著作權歸作者所有,轉載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末垦页,一起剝皮案震驚了整個濱河市雀费,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌痊焊,老刑警劉巖盏袄,帶你破解...
    沈念sama閱讀 222,865評論 6 518
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異薄啥,居然都是意外死亡辕羽,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 95,296評論 3 399
  • 文/潘曉璐 我一進店門垄惧,熙熙樓的掌柜王于貴愁眉苦臉地迎上來刁愿,“玉大人,你說我怎么就攤上這事到逊∠晨冢” “怎么了?”我有些...
    開封第一講書人閱讀 169,631評論 0 364
  • 文/不壞的土叔 我叫張陵觉壶,是天一觀的道長脑题。 經(jīng)常有香客問我,道長铜靶,這世上最難降的妖魔是什么叔遂? 我笑而不...
    開封第一講書人閱讀 60,199評論 1 300
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上掏熬,老公的妹妹穿的比我還像新娘佑稠。我一直安慰自己,他們只是感情好旗芬,可當我...
    茶點故事閱讀 69,196評論 6 398
  • 文/花漫 我一把揭開白布舌胶。 她就那樣靜靜地躺著,像睡著了一般疮丛。 火紅的嫁衣襯著肌膚如雪幔嫂。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 52,793評論 1 314
  • 那天誊薄,我揣著相機與錄音履恩,去河邊找鬼。 笑死呢蔫,一個胖子當著我的面吹牛切心,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播片吊,決...
    沈念sama閱讀 41,221評論 3 423
  • 文/蒼蘭香墨 我猛地睜開眼绽昏,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了俏脊?” 一聲冷哼從身側響起全谤,我...
    開封第一講書人閱讀 40,174評論 0 277
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎爷贫,沒想到半個月后认然,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,699評論 1 320
  • 正文 獨居荒郊野嶺守林人離奇死亡漫萄,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,770評論 3 343
  • 正文 我和宋清朗相戀三年卷员,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片腾务。...
    茶點故事閱讀 40,918評論 1 353
  • 序言:一個原本活蹦亂跳的男人離奇死亡子刮,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出窑睁,到底是詐尸還是另有隱情挺峡,我是刑警寧澤,帶...
    沈念sama閱讀 36,573評論 5 351
  • 正文 年R本政府宣布担钮,位于F島的核電站橱赠,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏箫津。R本人自食惡果不足惜狭姨,卻給世界環(huán)境...
    茶點故事閱讀 42,255評論 3 336
  • 文/蒙蒙 一宰啦、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧饼拍,春花似錦赡模、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,749評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至叨吮,卻和暖如春辆布,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背茶鉴。 一陣腳步聲響...
    開封第一講書人閱讀 33,862評論 1 274
  • 我被黑心中介騙來泰國打工锋玲, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人涵叮。 一個月前我還...
    沈念sama閱讀 49,364評論 3 379
  • 正文 我出身青樓惭蹂,卻偏偏與公主長得像,于是被迫代替她去往敵國和親割粮。 傳聞我的和親對象是個殘疾皇子盾碗,可洞房花燭夜當晚...
    茶點故事閱讀 45,926評論 2 361

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