面向抽象編程
接口-抽象類-父類-具體類
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