常用SQL語句收藏

約束

約束是在修改一個表,或增加一個表記錄時,規定表的各個字段之間必須滿足的關係.
ALTER TABLE student
ADD CONSTRAINT age_negative CHECK (student.age >= 0 );
約束是表結構的一部分內容,此例的約束是檢查年齡字段不要爲負值.
Update student set age=-1;//將會報錯.
刪除一個約束:alter table student drop constraint age_negative;

主鍵

主鍵:
表通常具有包含唯一標識表中每一行的值的一列或一組列。這樣的一列或多列稱爲表的主鍵 (PK),用於強制表的實體完整性。在創建或修改表時,您可以通過定義 PRIMARY KEY 約束來創建主鍵。
一個表只能有一個 PRIMARY KEY 約束,並且 PRIMARY KEY 約束中的列不能接受空值。由於 PRIMARY KEY 約束可保證數據的唯一性,因此經常對標識列定義這種約束。
create table dbo.test6
(
col1 nvarchar(25) NOT NULL DEFAULT 'abc', 
col2 int DEFAULT 23 primary key
);
首先將原來的主鍵刪除,再建聯合主鍵
alter table test6 ADD CONSTRAINT  constraint_1 PRIMARY KEY (col1,col2);在兩個字段上建聯合主鍵.

外鍵

外鍵 (FK) 是用於建立和加強兩個表數據之間的鏈接的一列或多列。當創建或修改表時可通過定義 FOREIGN KEY 約束來創建外鍵。
在外鍵引用中,當一個表的列被引用作爲另一個表的主鍵值的列時,就在兩表之間創建了鏈接。這個列就成爲第二個表的外鍵。
ALTER TABLE student 
ADD CONSTRAINT FK_class FOREIGN KEY (class)
 REFERENCES class (class) ; 
刪除外鍵:alter table student drop CONSTRAINT  FK_CLASS
建立外鍵時,要注意幾點:外鍵在外表中要是主鍵或索引. 兩個表的此字段名稱最好一樣.其他注意事項,項目參考相關數據庫的聯機幫助文檔.例如:外鍵在外表中重新生成,或重新組織後,或外鍵的索引被刪除後,引起的後果.需要仔細調試.

遊標

set ANSI_NULLS ON
set QUOTED_IDENTIFIER ON
go
ALTER PROCEDURE [dbo].[get_avage_age] 
	-- Add the parameters for the stored procedure here
	@class_name nchar(10),
	@CheckDate [datetime]
AS
BEGIN
	-- SET NOCOUNT ON added to prevent extra result sets from
	-- interfering with SELECT statements.
	SET NOCOUNT ON;
	select avg(age) from student where class=@class_name and time<@CheckDate
    -- Insert statements for procedure here

DECLARE @cur_age   as int 
DECLARE @avg_age as numeric(8) 
DECLARE @count as int
DECLARE curObject CURSOR FOR 
 select age from student
 where class=@class_name and born<@CheckDate order by age
set @avg_age=0
set @count=0
OPEN  curObject
FETCH NEXT FROM curObject INTO @cur_age
WHILE(@@FETCH_STATUS=0)
BEGIN     
  set @avg_age=@avg_age+@cur_age
  set @count=@count+1 
  FETCH NEXT FROM curObject INTO @cur_age
END
set @avg_age=@avg_age/@count
SELECT	'AVAGE AGE' = @avg_age,'Student Sum' = @count
close curObject
deallocate curObject
	
END
在此存儲過程中, 使用遊標來讀取結果集中每個記錄的字段值,再求平均值,看看與avg函數的功能是否一樣的


使用遊標逐條更新記錄

DECLARE @cur_age   as int 
DECLARE @avg_age as numeric(8) 
DECLARE @count as int
DECLARE curObject CURSOR FOR 
 select age from student
 where class=@class_name and born<@CheckDate order by age
 FOR UPDATE OF age,english
set @avg_age=0
set @count=0
OPEN  curObject
FETCH NEXT FROM curObject INTO @cur_age
WHILE(@@FETCH_STATUS=0)
BEGIN     
  set @avg_age=@avg_age+@cur_age
  set @count=@count+1 
  update student set english=@count where current of curObject
  FETCH NEXT FROM curObject INTO @cur_age
END
set @avg_age=@avg_age/@count
SELECT	'AVAGE AGE' = @avg_age,'Student Sum' = @count
close curObject
deallocate curObject
根據遊標更新表,還有很多選項, 涉及到的細節請具體參考相關數據庫的聯機幫助!



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章