讀書筆記《sql必知必會(huì)》

檢索

最簡(jiǎn)單的查詢語(yǔ)句

select * from [TableName]

排序

降序

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

升序

select * from [TableName] order by [Field]

過濾

高級(jí)

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

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%'

常用通配符

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

創(chuàng)建計(jì)算字段

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

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

  1. 文本處理函數(shù)
函數(shù) 說明
LEFT 返回字符串左邊的字符
LENGTH 返回字符串長(zhǎng)度
  1. 數(shù)值處理
函數(shù) 說明
ABS 絕對(duì)值
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操作符中,以及用來填充計(jì)算列。

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

聯(lián)結(jié)表

笛卡爾積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';

如果需要?jiǎng)h除所有行,可使用TRUNCATE TABLE

TRUNCATE TABLE Customers;

復(fù)制

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í)行結(jié)果插入到表中(導(dǎo)出數(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ù)復(fù)制到一個(gè)新表,導(dǎo)入數(shù)據(jù)

SELECT *
INTO CustCopy
FROM Customers;

視圖

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

存儲(chǔ)過程

相當(dāng)于編程語(yǔ)言中的函數(shù),用于批量執(zhí)行語(yǔ)句。

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 所包裹的語(yǔ)句

使用存儲(chǔ)過程:

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

事務(wù)管理

事務(wù)處理是用來保證數(shù)據(jù)庫(kù)完整性的一種機(jī)制。
其中:
事務(wù)(transaction)指一組SQL語(yǔ)句;
回退(rollback)指撤銷指定SQL語(yǔ)句的過程;
提交(commit)指將未存儲(chǔ)的SQL語(yǔ)句結(jié)果寫入數(shù)據(jù)庫(kù)表;
保留點(diǎn)(savepoint)指事務(wù)處理中設(shè)置的臨時(shí)占位符(placeholder),可以對(duì)它發(fā)布回退(與回退整個(gè)事務(wù)處理不同)。

sql server為例:

提交事務(wù):

BEGIN TRANSACTION
...
COMMIT TRANSACTION

回退

DELETE FROM Orders;
ROLLBACK;

定義保留點(diǎn)

SAVE TRANSACTION delete1;

其他高級(jí)特性

約束

約束(constraint)是管理如何插入或處理數(shù)據(jù)庫(kù)數(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ā)器是特殊的存儲(chǔ)過程,它在特定的數(shù)據(jù)庫(kù)活動(dòng)發(fā)生時(shí)自動(dòng)執(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ā)器快,因此在可能的時(shí)候,應(yīng)該盡量使用約束。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容