工作經常使用的SQL整理,實戰篇,地址一覽:
接着上一篇“工作經常使用的SQL整理,實戰篇(一)”繼續討論,這一篇中主要討論增刪改查,連接,分組和排序,通配符,視圖,存儲過程和事務,游標,觸發器這些東西。
6.增刪改查
插入
--插入用戶表數據
insert into Tse_User(UserID, UserName, RealName, Email, Mobile)
values(111, 'zhangsan', 'zhangsan', 'zs@126.com', '')
--插入產品表數據
INSERT INTO Tse_Product(ProductID, ProductName, Price, Storage)
VALUES('PD00030', 'Benz', 500500.0, 30000)
--插入訂單表數據
declare @OrderID VARCHAR(64)
--將年,月,日,時,分,秒,毫秒以字符串形式連接起來作為訂單號
SET @OrderID = DATENAME(YEAR, GETDATE()) + DATENAME(MONTH, GETDATE()) +DATENAME(DAY, GETDATE())+
DATENAME(HOUR, GETDATE()) + DATENAME(MINUTE, GETDATE())+DATENAME(SECOND, GETDATE()) +DATENAME(MILLISECOND, GETDATE())
INSERT INTO Tse_Order(OrderID, UserID, ProductID, Number, PostTime)
VALUES(@OrderID, 115, 'PD00040', 10, GETDATE())
修改
Update Tse_User set RealName = '李四' where UserID = 112
刪除
Delete from Tse_User Where UserID = 111
簡單查詢
select * from Tse_User with(nolock)
select * from Tse_Order with(nolock) where ID >= 2
7.連接
內連接
--左右表匹配的行
SELECT * FROM Tse_Order AS O WITH(NOLOCK)
INNER JOIN Tse_User AS U WITH(NOLOCK) ON O.UserID = U.UserID
WHERE U.UserID = 111
左連接(左外連接)
--左邊表中所有行,右邊匹配左邊, 右邊為空的補NULL
SELECT * FROM Tse_User AS U WITH(NOLOCK)
LEFT JOIN Tse_Order AS O WITH(NOLOCK) ON U.UserID = O.UserID
右連接(右外連接)
--右邊表中所有行,左邊匹配右邊,左邊為空的補NULL
SELECT * FROM Tse_Order AS O WITH(NOLOCK)
RIGHT JOIN Tse_Product AS P WITH(NOLOCK) ON O.ProductID = P.ProductID
全連接
--左右表所有行,為空的補NULL
SELECT * FROM Tse_Order AS O WITH(NOLOCK)
FULL JOIN Tse_Product AS P WITH(NOLOCK) ON O.ProductID = P.ProductID
8.分組和排序
按UserID分組
SELECT UserID, COUNT(0) AS Number FROM Tse_Order WITH(NOLOCK) GROUP BY UserID
按UserID分組,訂單數量大於等於3
SELECT UserID, COUNT(0) AS Number FROM Tse_Order WITH(NOLOCK) GROUP BY UserID HAVING COUNT(0) >=3
按UserID分組,訂單數量大於等於1,按訂單數量升序
SELECT UserID, COUNT(0) AS Number FROM Tse_Order WITH(NOLOCK) GROUP BY UserID HAVING COUNT(0) >=1 ORDER BY Number ASC
9.通配符
LIKE:匹配多個未知字符
_:匹配一個未知字符
--匹配126郵箱的
SELECT * FROM Tse_User WITH(NOLOCK) WHERE Email LIKE '%@126.com'
--匹配所有包含@的郵箱
SELECT * FROM Tse_User WITH(NOLOCK) WHERE Email LIKE '%@%'
--匹配16開頭,后面跟一個任意字符的郵箱
SELECT * FROM Tse_User WITH(NOLOCK) WHERE Email LIKE '%@16_.com'
--匹配除126以外的所有郵箱
SELECT * FROM Tse_User WITH(NOLOCK) WHERE Email NOT LIKE '%@126.com'
10.視圖
刪除視圖
IF EXISTS (SELECT * FROM SYSOBJECTS WHERE Name = 'V_Tse_TotalInfo')
DROP VIEW V_Tse_TotalInfo
創建視圖
--包含用戶表,產品表和訂單表關聯后的所有信息
CREATE VIEW V_Tse_TotalInfo
AS
SELECT O.OrderID, O.UserID, O.ProductID, O.PostTime, U.UserName, U.RealName,
U.Email, U.Mobile, P.ProductName, P.Price FROM Tse_Order AS O WITH(NOLOCK)
INNER JOIN Tse_User AS U WITH(NOLOCK) ON O.UserID = U.UserID
INNER JOIN Tse_Product AS P WITH(NOLOCK) ON O.ProductID = P.ProductID
11.存儲過程和事務
創建存儲過程,先刪除訂單表(外鍵表)中的記錄,再刪除產品表(主鍵表)中的記錄
CREATE PROCEDURE [dbo].[SC_Tse_DeleteProduct] ( @ProductID VARCHAR(64), @Result int output ) AS BEGIN SET NOCOUNT ON; BEGIN TRAN --開始事務 BEGIN DELETE FROM Tse_Order WHERE ProductID = @ProductID DELETE FROM Tse_Product WHERE ProductID = @ProductID IF (@@ERROR <> 0) BEGIN SET @Result = -999 ROLLBACK TRAN --回滾 END ELSE BEGIN SET @Result = 888 COMMIT TRAN --提交 END END END
12.游標
獲取所有產品的名字,以‘|’分隔,包含在輸出參數@Names中
CREATE PROCEDURE SC_Tse_GetProductNames ( @Names varchar(max) OUTPUT ) AS BEGIN SET NOCOUNT ON; declare @ProductName varchar(64) declare curTest cursor for (select ProductName from Tse_Product) open curTest --打開游標 fetch next from curTest into @ProductName while @@fetch_status = 0 --獲取成功 begin if (@ProductName is not null and @ProductName <> '') begin if (@Names is null or @Names = '') begin set @Names = @ProductName end else begin set @Names = @Names + '|'+ @ProductName end end fetch next from curTest into @ProductName end close curTest --關閉游標 deallocate curTest --釋放游標 END
13.觸發器
因為用戶編號在訂單表中為外鍵,所以,直接刪除某個用戶時,如果該用戶下了訂單,就會提示有外鍵不能刪除。針對這種情況,可以考慮使用觸發器。
創建觸發器,刪除用戶表中用戶時,會自動先刪除訂單表中的訂單
CREATE TRIGGER TR_Tse_DelUser ON Tse_User INSTEAD OF DELETE --代替默認的刪除 AS BEGIN SET NOCOUNT ON DELETE FROM Tse_Order WHERE UserID IN (SELECT UserID FROM Deleted) DELETE FROM Tse_User WHERE UserID IN (SELECT UserID FROM Deleted) END
使用觸發器,添加訂單時,產品表庫存相應減少
CREATE TRIGGER TR_Tse_ADDOrder ON Tse_Order AFTER INSERT AS BEGIN UPDATE Tse_Product SET Storage = Storage - (SELECT Number FROM INSERTED) WHERE ProductID IN (SELECT ProductID FROM INSERTED) END
關於SQL定時作業部門的介紹,請看“工作經常使用的SQL整理,實戰篇(三)”~
如果您有什么問題,歡迎在下面評論,我們一起討論,謝謝~
如果您覺得還不錯,不妨點下右下方的推薦,有您的鼓勵我會繼續努力的~