[SQL SERVER系列]工作經常使用的SQL整理,實戰篇(二)[原創]


工作經常使用的SQL整理,實戰篇,地址一覽:

  工作經常使用的SQL整理,實戰篇(一)

  工作經常使用的SQL整理,實戰篇(二)

  工作經常使用的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) >=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整理,實戰篇(三)”~

  如果您有什么問題,歡迎在下面評論,我們一起討論,謝謝~

  如果您覺得還不錯,不妨點下右下方的推薦,有您的鼓勵我會繼續努力的~

 

 

 

 

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM