sqlserver 綜合總結

面向抽象編程
接口-抽象類-父類-具體類
1、 複習T-SQL
	-> 數據庫的建立、表的建立和約束(DDL)
		-> 建庫
			if(db_id(數據庫名)) is not null
				drop database 數據庫名;
			create database 數據庫名;
		-> 建表
			if(object_id('表名', 'U')) is null
			create table 表名
			(
				字段 類型 [約束],
				字段 類型 [約束],
				字段 類型 [約束]
			);
		-> 建約束
			alter table 表名 add constraint 約束名 約束條件
			-> 主鍵約束(PK_表名_字段名)
				primary key(字段)
			-> 默認約束(DF_表名_字段名)
				default(值) for 字段
			-> 檢查約束(CK_表名_字段名)
				check(表達式)
			-> 唯一約束(UQ_表名_字段名)
				unique(字段)
			-> 外鍵約束(FK_外鍵表_主鍵表_字段名)
				* 
				alter table 外鍵表 add
				constraint FK_外鍵表_主鍵表_字段名
				foreign key(字段名) references 主鍵表(字段名);
			
	-> 數據庫操作語言(DML)
		-> 基本語言
			增
				insert into 表名(字段列表) values(值列表);-- 表是存在的
				select 字段列表 into 新表名 from 舊錶;	  -- 要求新表不存在
				insert into 表名(字段列表) select查詢;

			刪(主外鍵關聯的時候,刪除有時會出問題)

				delete from 表名 where 條件;
				truncate table 表名;	-- 所有的數據歸零
				
				drop database 數據庫;
				drop table 表名;
			改
				update 表名 set 字段=值, 字段=值, ... where條件;
			查(***)
				-> from子句
				-> where子句
				-> group by子句
				-> having子句
				-> select top distinct 以及運算表達式
				-> order by子句
				核心記住流程
		-> 高級部分
			case語法
				-> if else if結構
					case
						when 表達式1 then 顯示1
						when 表達式2 then 顯示2
						...
						else 顯示n
					end
				-> switch-case結構
					case 字段
						when 值1 then 顯示1
						when 值2 then 顯示2
						... 
						else 顯示n
					end
			連接
				-> 交叉聯接
					ANSI-89的語法:select * from 表1, 表2;
					ANSI-92的語法:select * from 表1 cross join 表2;
				-> 內連接
					ANSI-89的語法:select * from 表1, 表2 on 條件;
					ANSI-92的語法:select * from 表1 inner join 表2 on 條件;
				-> 外連接
					ANSI-92的語法:
						select * from 表1 left join 表2 on 條件;
						select * from 表1 right join 表2 on 條件;
				-> 自連接、多表連接
					表1
					inner join
					表2
					on 條件
					inner join
					表3
					on 條件
			
                         子查詢
				將一個查詢的結果作爲另一個查詢的條件
				分清出內部查詢(子查詢)和外部查詢
				-> 獨立標量子查詢	字段 = (子查詢)
				-> 獨立多值子查詢	字段 in (子查詢)
			表表達式
				-> 派生表
					將查詢的"結果集"作爲數據源 --不能使用order by 
					select * from
					(
						select
							row_number() over(order by stuId) as num,
							*
						from 
							Student
					) as tbl
					where
			 			tbl.num between @count * (@page - 1) + 1 and @count * @page;


2、 公用表表達式(CTE)
	就是將一個查詢得到的結果集用一個表的形式臨時存放,並用一個變量名指定
	後面再查詢直接使用變量名即可
	
	with 別名 
	as
	(
		結果集
	)
	查詢



3、 考慮派生表和CTE都是臨時的,而且比較臃腫,所以希望將常用的查詢結構定義到數據庫中
	每次使用的時候,直接使用數據庫中的這個對象,這個對象中記錄了這個複雜的查詢規範
	由數據庫執行查詢
	
	那麼就有了視圖(虛擬表)
	
	create view vw_視圖名
	as
		查詢
		
	注意:視圖不具備存儲數據的能力,但是使用的時候就好像一張表一樣



4、 (*介紹)內聯表值函數
	帶有參數的試圖
		create function fn_名字
		(@參數 類型, ...) returns table
		as
			return 查詢

5、 SQL中的變量與流程控制
		-> SQL是一個腳本語言,可以認爲基本的編程語句都支持
		-> 定義變量
			declare @變量名 類型名;
		-> 賦值
			set @變量名 = 值;
		-> 補充
			使用select進行賦值
				select @變量=字段 from 表名...(支持多值查詢)
			使用子查詢進行賦值
				set @變量 = (單值子查詢); (只支持單值查詢)

                >sql 2008 新的語法
		declare  @name varchar(5)='大鑫';
                select @name;
	
		-> 判斷
			if(bool表達式)    begin end就等於程序中的大括號()
			begin
				-- 語句
			end
			else if(表達式)
			begin
				-- 語句
			end
			else
			begin
				-- 語句
			end
		-> 循環
			while(bool表達式)
			begin
				-- 語句
			end
                 循環練習
			--求1到100的和

			declare @jkSum int;
			declare @i int;
			set @jkSum = 0;
			set @i = 1;

			while (@i <= 100)
			begin
				set @jkSum = @jkSum + @i;
				--set @i = @i + 1;
                                ****--sql裏面循環執行後要把@i+1 賦值然後執行下一次循環提供的新值
				set @i += 1;
				end

			select @jkSum;
			go



6、 爲什麼要有事務,事務是什麼
	事務,就是SQL中一個獨立執行過程
		這結果是會影響到數據庫的數據結果的
		這個事務(執行過程)與其他的執行過程無關
		事務執行的時候是一個整體,要麼全部成功,也麼全部失敗
	事務的原子性、持久性、隔離性、一致性(不能違反約束)
		
	
	SQL中每一個SQL語句實際上都是一個事務(隱式事務)
	事務就是一個最小的執行單位
	
        常見的全局變量 @@version, @@error(最後一個錯誤的T_SQL的信息)
                       @@identity (最後的一個插入表的自增id)
	    //查詢中文的錯誤信息試圖
	    select * from sys.messages where  where language_id=2052;

	顯示聲明事務
		begin transaction -- 簡寫begin tran
			事務內部
		-- 提交事務或回滾事務
		commit transaction	-- 表示事務內部的所有事情執行成功
		rollback transaction	-- 表示撤銷事務內部所有的事情

	-> 使用try-catch塊處理事務中的異常錯誤
		begin try
		end try
		begin catch
		end catch

7、 存儲過程就是將一些列的執行步驟記錄到數據庫中,有點類似於方法
	-> 無參數,無返回值的存儲過程
	-> 有參數,無返回值的存儲過程
	-> 帶有默認參數的存儲過程
	-> 帶有默認參數與參數返回值的存儲過程
    聲明一個帶默認參數	@stuNameTemp nvarchar(20)='all'
    --->     []可以有,可以無
    --->     多條語句必須要加begin  end  如果是一條語句可以省略begin end         
    CREATE  PROC[EDURE]  USP_存儲過程名 
    @參數1  數據類型 [= 默認值] [OUTPUT],
    @參數n  數據類型 [= 默認值] [OUTPUT]
    AS
	BEGIN
      SQL語句
	END
	
	exec 存儲過程 參數;
        exec 存儲過程 參數名=參數;
        exec 存儲過程 參數,參數n output;
	

8、 使用ADO.net執行SQL的方法
	-> 沒有返回值的存儲過程
	-> 帶有參數返回值的存儲過程
	
		-> 連接字符串
		-> SQL語句(存儲過程的名字)
		-> 創建參數
			如果是執行參數返回值的存儲過程
			定義要返回的參數,不要賦值,設定Direction
		string sql = "usp_TransMoney";

            	SqlParameter[] ps = 
            	{	
               		 new SqlParameter("@from",from),
               		 new SqlParameter("@to", to),
               		 new SqlParameter("@money",money),
               		 new SqlParameter("@isAccess", SqlDbType.Int)
           	 };
          	ps[3].Direction = ParameterDirection.Output;
		-> 連接通道SqlConnection
		-> 創建執行對象SqlCommand(設定CommandType)
		-> 加入參數
		-> 打開連接
		-> 執行方法

9.觸發器
  ->特殊的存儲過程.  inserted表 和 deleted表  2個臨時表
  insert into back(cid,balance) output inserted.* 
  values('0004',10000); 

  for 或者 after 觸發器  是執行完才能觸發
  instead of  代替
  
  --添加一個觸發器,刪除所有數據後,在把數據插回來
  create trigger tr_DelUseInfo on 表名(bank)
  for  delete 
  as 
     insert into bank  select * from deleted;
  go
  
  
  



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