SQl常用語句總結(持續更新……)


創建示例數據庫

USE master;
GO
IF DB_ID (N'mytest') IS NOT NULL
DROP DATABASE mytest;
GO
CREATE DATABASE mytest;
GO
USE mytest;
GO
IF OBJECT_ID(N'dbo.Orders') IS NOT NULL
DROP TABLE dbo.Orders;
GO
CREATE TABLE dbo.Orders
(
ProductID INT NOT NULL,
MadeFrom CHAR(20),
Sales MONEY NOT NULL
);

 刪除數據庫

use master -- 設置當前數據庫為master,以便訪問sysdatabases表
go
if exists(select * from sysdatabases where name='stuDB')
drop database stuDB
go
或者
IF DB_ID (N'mytest') IS NOT NULL
DROP DATABASE mytest;

創建數據表

標准語法
CREATE TABLE table_name(
   column1 datatype,
   column2 datatype,
   column3 datatype,
   .....
   columnN datatype,
   PRIMARY KEY( one or more columns )
);

示例
CREATE TABLE CUSTOMERS(
   ID   INT              NOT NULL,
   NAME VARCHAR (20)     NOT NULL,
   AGE  INT              NOT NULL,
   ADDRESS  CHAR (25) ,
   SALARY   DECIMAL (18, 2),       
   PRIMARY KEY (ID)
);

刪除表包含結構

Drop table tablename

 視圖

create view  視圖名字
as
查詢代碼

demo:
create view  view_user
as
select id from user
go
/*以上為創建一個視圖,視圖里面存儲的是user表的ID列*/

/*刪除視圖*/
if exusts(select * from sysobjects where name='視圖名字')/*如果數據庫中存在這個視圖,就刪除該視圖,查不查詢隨便你*/
drop view 視圖名字  /*執行刪除視圖語法*/ 

視圖注意事項:注意事項:
1.一個視圖可以嵌套另一個視圖,但最后不要超過3層
2.視圖定義中的select語句不能包括下列內容
*order by排序子句,除非在select語句中帶有一個top子句
*into關鍵字
*引用臨時表或表變量

存儲過程

存儲過程可以說是一個記錄集吧,它是由一些T-SQL語句組成的代碼塊,這些T-SQL語句代碼像一個方法一樣實現一些功能(對單表或多表的增刪改查),然后再給這個代碼塊取一個名字,在用到這個功能的時候調用他就行了。

存儲過程的好處:
1.由於數據庫執行動作時,是先編譯后執行的。然而存儲過程是一個編譯過的代碼塊,所以執行效率要比T-SQL語句高。
2.一個存儲過程在程序在網絡中交互時可以替代大堆的T-SQL語句,所以也能降低網絡的通信量,提高通信速率。
3.通過存儲過程能夠使沒有權限的用戶在控制之下間接地存取數據庫,從而確保數據的安全。

示例:

--查詢存儲過程

IF OBJECT_ID (N'PROC_SELECT_STUDENTS_COUNT', N'P') IS NOT NULL
    DROP procedure PROC_SELECT_STUDENTS_COUNT;
GO
CREATE procedure PROC_SELECT_STUDENTS_COUNT
AS 
    SELECT COUNT(ID) FROM Students
GO

--執行

EXEC PROC_SELECT_STUDENTS_COUNT

帶參數

--查詢存儲過程,根據城市查詢總數

IF OBJECT_ID (N'PROC_SELECT_STUDENTS_BY_CITY_COUNT', N'P') IS NOT NULL
    DROP procedure PROC_SELECT_STUDENTS_BY_CITY_COUNT;
GO
CREATE procedure PROC_SELECT_STUDENTS_BY_CITY_COUNT(@city nvarchar(50))
AS
    SELECT COUNT(ID) FROM Students WHERE City=@city
GO

-- 執行

EXEC PROC_SELECT_STUDENTS_BY_CITY_COUNT N'Beijing'

帶通配符

--3、查詢姓氏為李的學生信息,含通配符

IF OBJECT_ID (N'PROC_SELECT_STUDENTS_BY_SURNNAME', N'P') IS NOT NULL
    DROP procedure PROC_SELECT_STUDENTS_BY_SURNNAME;
GO
CREATE procedure PROC_SELECT_STUDENTS_BY_SURNNAME
    @surnName nvarchar(20)='李%' --默認值
AS 
    SELECT ID,Name,Age FROM Students WHERE Name like @surnName
GO

--執行

EXEC PROC_SELECT_STUDENTS_BY_SURNNAME
EXEC PROC_SELECT_STUDENTS_BY_SURNNAME N'李%'
EXEC PROC_SELECT_STUDENTS_BY_SURNNAME N'%李%'

帶輸出參數

--根據姓名查詢的學生信息,返回學生的城市及年齡

IF OBJECT_ID (N'PROC_SELECT_STUDENTS_BY_NAME', N'P') IS NOT NULL
    DROP procedure PROC_SELECT_STUDENTS_BY_NAME;
GO
CREATE procedure PROC_SELECT_STUDENTS_BY_NAME
    @name nvarchar(50),     --輸入參數
    @city nvarchar(20) out, --輸出參數
    @age  int output        --輸入輸出參數
AS 
    SELECT @city=City,@age=Age FROM Students WHERE Name=@name AND Age=@age
GO

--執行
declare @name nvarchar(50),
        @city nvarchar(20),
        @age int;
set @name = N'李明';
set @age = 20;
exec PROC_SELECT_STUDENTS_BY_NAME @name,@city out, @age output;
select @city, @age;

存儲過程實現增刪改

1、新增demo

 

--1、存儲過程:新增學生信息

IF OBJECT_ID (N'PROC_INSERT_STUDENT', N'P') IS NOT NULL
    DROP procedure PROC_INSERT_STUDENT;
GO
CREATE procedure PROC_INSERT_STUDENT
    @id int,
    @name nvarchar(20),
    @age int,
    @city nvarchar(20)
AS 
    INSERT INTO Students(ID,Name,Age,City) VALUES(@id,@name,@age,@city)
GO

--執行

EXEC PROC_INSERT_STUDENT 1001,N'張三',19,'ShangHai'

2、修改

--修改學生信息

IF OBJECT_ID (N'PROC_UPDATE_STUDENT', N'P') IS NOT NULL
    DROP procedure PROC_UPDATE_STUDENT;
GO
CREATE procedure PROC_UPDATE_STUDENT
    @id int,
    @name nvarchar(20),
    @age int,
    @city nvarchar(20)
AS 
    UPDATE Students SET Name=@name,Age=@age,City=@city WHERE ID=@id
GO

--執行

EXEC PROC_UPDATE_STUDENT 1001,N'張思',20,'ShangHai'

3、刪除

--根據id刪除記錄

IF OBJECT_ID (N'PROC_DELETE_STUDENT_BY_ID', N'P') IS NOT NULL
    DROP procedure PROC_DELETE_STUDENT_BY_ID;
GO
CREATE procedure PROC_DELETE_STUDENT_BY_ID
    @id int
AS 
    DELETE FROM  Students WHERE ID=@id
GO

--執行

EXEC PROC_DELETE_STUDENT_BY_ID 1001

存儲過程實現分頁

-- ROW_NUMBER分頁查詢

IF OBJECT_ID (N'PROC_SELECT_BY_PAGE', N'P') IS NOT NULL
    DROP procedure PROC_SELECT_BY_PAGE;
GO
CREATE procedure PROC_SELECT_BY_PAGE
    @startIndex int,
    @endIndex int
AS 
    SELECT  * FROM (SELECT ID,Name,Age,City,ROW_NUMBER() OVER(ORDER BY ID DESC) AS RowNumber FROM Students) AS Temp 
    WHERE Temp.RowNumber BETWEEN @startIndex AND @endIndex
GO

--執行

EXEC PROC_SELECT_BY_PAGE 1,10
--使用TOP分頁

IF OBJECT_ID (N'PROC_SELECT_BY_PAGE_WITH_TOP', N'P') IS NOT NULL
    DROP procedure PROC_SELECT_BY_PAGE_WITH_TOP;
GO
CREATE procedure PROC_SELECT_BY_PAGE_WITH_TOP
    @pageIndex int,
    @pageSize int
AS 
    SELECT TOP(@pageSize) * FROM Students 
    WHERE ID >=(SELECT MAX(ID) FROM (SELECT TOP(@pageSize*(@pageIndex-1) + 1) ID FROM Students ORDER BY ID) AS Temp)    
GO

--執行

EXEC PROC_SELECT_BY_PAGE_WITH_TOP 1,2

事務

事務是什么?事務關鍵在與其原子性。原子性概念是指可以把一些事情當作一個執行單元來看待。從數據庫角度看待。他是指應該全部執行或者全部不執行一條或多條語句的最小組合。當處理數據時候經常確保一件事發生另一件事也隨之發生。或者二件事都不發生。實際上可能達到程度是有幾十件事情或者更多的事情都必須一起發生或者都不發生。來看一個一個經典事例。這個事例各大書籍講事務都有。就是你去銀行轉帳給朋友。轉了100元sql如下:你的帳號扣了100元,你朋友帳號加了100元。看起來很完美。其實有個BUG存在,你的帳號被扣100元后在執行你朋友帳號加100元時候,數據出現錯誤,沒有添加進去。 

 

ACID事務

如果你的系統被設計為使用ACID事務,則不會出現上面那種情況。ACID事務

1.原子性:事務會全部執行,要么全部不執行。

2.一致性:需要遵循所有約束以及其他數據庫完整性規則,並且完全的更新所有相關的對象(數據和索引頁)

3.隔離性:每一個事務與其他任何事務完全的隔離。一個事務動作不會受其它事務動作干擾。

4.持久性:完成事務后,它的作用結果永久保存在系統內部。數據是“安全的”。這是指不會在停電或者系統故障或設備故障不會導致數據寫入一半的情況發生。

事務簡單操作簡介

你需要一種辦法確保第一條SQL語句執行,第二條也跟着執行。實際上不存在這樣一種可完全控制可能。從硬件故障到違反數據完整性規則簡單事情。都有可能發生錯誤。然而幸運的是;有一種可能達到相同的目地方法-基本忘記從前發生什么事。至少可以強制這個概念:如果某件事沒有發生,那什么不會發生,至少事務的作用范圍內部就是這樣。

如何標志標志是開始和結束,回滾

BEGIN TRAN : 設置為起點

COMMIT TRAN :讓事務成為數據中心永久的,不可逆的一部分

ROLLBACK TRAN:不考慮所有更改,本質上想說忘記以前發生的一卻

SAVE TRAN:創建一個特定標識符,只允許部分回滾

BEGIN TRAN 事務開始很好理解,它唯一目的就是表示一個執行單元開始。高級部分不討論了,因為面向DBA的高級特性。

COMMIT TRAN  提交事務一個終點,當發出COMMIT TRAN命令時候,可以認為該事務是持久性

ROLLBACK TRAN 每當考慮ROLLBACK TRAN 時候表示。表示該執行單元有錯誤。或者回到起點重新開始。(忘記過去,重新開始)

SAVE TRAN 保存事務創建書簽。創建書簽在數據回滾時候,回滾到每個書簽上。記住ROLLBACK在回滾會清除所有書簽。如果保存了5個書簽,一旦執行ROLLBACK,5個書簽全部清空。

demo

 Create Procedure  MyProcedure
    AS
       Begin
           Set    NOCOUNT    ON; 
           Set XACT_ABORT on; --這句話非常重要
           
           Begin  Tran   --開始事務
           
           insert into userinfo(username,userpwd,RegisterTime) values('admin','admin',getdate())
           insert into userinfo(username,userpwd,RegisterTime) values('jack','jack',getdate())

           Commit Tran       --提交事務
       End

注意:

SET XACT_ABORT ON是設置事務回滾的!
當為ON時,如果你存儲中的某個地方出了問題,整個事務中的語句都會回滾
為OFF時,只回滾錯誤的地方

歡迎關注我的微信公眾號:互聯網碎片搜集


免責聲明!

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



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