日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > C# >内容正文

C#

C# 学习笔记(18)操作SQL Server 中

發布時間:2025/4/16 C# 51 豆豆
生活随笔 收集整理的這篇文章主要介紹了 C# 学习笔记(18)操作SQL Server 中 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

C# 學習筆記(18)操作SQL Server 中

數據庫基礎操作

SQL語法可以參考 菜鳥教程 或者微軟官方的SQL示例
注意SQL不區分大小寫

1.基礎查詢

--最基礎的查詢語句, select * from table_name select * from studentTable




2.條件查詢

--條件查詢 select * from table_name where 條件 select * from studentTable where studentTable.gradeID = 5

3.條件查詢 between and

--條件查詢 select * from table_name where 條件 select * from studentTable where studentTable.cityID between 1 and 7 --查找 studentTable.cityID 在 1-7 范圍內的行

4.多條件查詢 and

--多條件查詢 select * from table_name where 條件 and 條件 select * from studentTable where studentTable.cityID between 1 and 7 and studentTable.gradeID = 7


5.字符匹配 like

--多條件查詢 select * from table_name where 條件 and 條件 studentTable.name like '%七%' studentTable.name中含有字符 七 的行 %為通配符 匹配0 - 多個字符 select * from studentTable where studentTable.cityID between 1 and 7 and studentTable.name like '%七%'




6.按需求提取列

--條件查詢 + 提取需要列 select table_name.列名1, table_name.列名2 from table_name where 條件 select studentTable.name as 姓名, gender as 性別, address as 地址 from studentTable where studentTable.gradeID = 5




7.聯合查詢

--聯合查詢 兩個表的數據組合 select * from studentTable inner join cityTable on cityTable.id = studentTable.cityID --將cityTable.id 等于 studentTable.cityID的兩個表的行合并成一行


8.多表聯合查詢

--聯合查詢 多個表的數據組合 select studentTable.id as 學生編號, studentTable.name as 姓名, genderTable.name as 性別, gradeTable.name as 班級, (provinceTable.province + cityTable.cityName + isNull(studentTable.address, '')) as 家庭地址 from studentTable inner join cityTable on cityTable.id = studentTable.cityID inner join provinceTable on cityTable.provinceID = provinceTable.id inner join genderTable on genderTable.id = studentTable.gender inner join gradeTable on gradeTable.id = studentTable.gradeID




9.嵌套查詢

--嵌套查詢 可以在查詢語句結果的基礎上多次進行篩選嵌套 select * from (select studentTable.id as 學生編號, studentTable.name as 姓名, genderTable.name as 性別, gradeTable.name as 班級, (provinceTable.province + cityTable.cityName + isNull(studentTable.address, '')) as 家庭地址 from studentTable inner join cityTable on cityTable.id = studentTable.cityID inner join provinceTable on cityTable.provinceID = provinceTable.id inner join genderTable on genderTable.id = studentTable.gender inner join gradeTable on gradeTable.id = studentTable.gradeID) as t1 where 性別 = '男'


10.排序

--對查詢結果排序 order by 列名 select * from studentTable where cityID = 7 order by studentTable.id desc --desc 遞減排序


11.分組

--對查詢結果分組, 然后使用count(*) 統計各個分組的行數 select cityID, count(*) as 數量 from studentTable group by cityID

group by cityID 會對相同的cityID值的行劃分成一組,如下圖cityID為7的共有4行,這四行劃分成了一組,也就是只能顯示一行,因此這個表中只能顯示cityID列 和 聚合函數生成的列,不能顯示姓名這樣的列(四個姓名顯示誰的?)

--對查詢結果分組, 然后使用count(*) 統計各個分組的行數 select cityID, count(*) as 數量 from studentTable group by cityID having cityID > 7 --having 限定cityID范圍 只對范圍內的cityID進行分組

索引

查詢時,where后面經常使用的列(非主鍵列)可以將其設置為索引,用空間來換取時間,當數據量大時可以顯著加快查詢時間



聚合函數

微軟文檔

聚合函數功能
avg(列名)求列中各項的平均值
count(列名)獲取列的行數
max(列名)獲取列中的最大值
min(列名)獲取列中最小值
sum(列名)獲取列中各項之和 ,SUM 只能用于數字列。 Null 值會被忽略。
stdev(列名)返回指定列中所有值的標準偏差
stdevp(列名)返回指定列中所有值的總體標準偏差
var(列名)返回指定列中所有值的方差
varp(列名)返回指定列中所有值的總體統計方差

其他聚合函數操作類似

--查詢學生信息表 select * from studentTable --查詢學生信息表行數 select count(cityID) from studentTable --聚合函數參數前加 distinct 關鍵字后,重復的列只統計一次 select count(distinct cityID) from studentTable

開窗函數

上面的聚合函數查詢出來是一個值,當想要將這個值添加到表中,就需要將這個值變成一列然后添加到表中(不然只有一個值,放到表中的哪一列?),over()函數也就是開窗函數就是干這個的,將聚合函數查出來的結果變成一列

--開窗 select *, count(*) over() as 總行數 from studentTable


over()函數也可以填入以下三種關鍵字(可以全部用上,也可以只用其中一種)

  • PARTITION BY:將查詢結果集分為多個分區。
--開窗 select *, count(*) over(partition by cityID) as 總行數 from studentTable

先獲取 select * from studentTable 的查詢結果,然后根據cityID對查詢結果分組,最后對每組的行數進行count(*)統計并將數據變成一列添加到查詢結果中

  • ORDER BY:定義結果集的每個分區中行的邏輯順序。
--開窗 select *, count(*) over(order by cityID) from studentTable

先獲取 select * from studentTable 的查詢結果,然后根據 cityID 列的值進行排序分組(order by 有起始行和結束行參數,這里沒有填默認為第一行到當前行),最后對每組的行數進行count(*)統計并將數據變成一列添加到查詢結果中

最常用的就是給結果集加上序號,查詢結果最左側的序號是數據庫管理工具提供的,并不是查詢結果集的內容。id是主鍵,不可以當作行序號(例如身份證號,前面的人去了,排在后面的人身份證號并不會改變,主鍵也是如此,前面數據刪除后,主鍵號也不會改變,因此主鍵并不一定連續。)

--開窗 select *, ROW_NUMBER() over(order by id) as 行序號 from studentTable

  • ROWS/RANGE:通過指定分區中的起點和終點來限制分區中的行數。 它需要 ORDER BY 參數,如果指定了ORDER BY 參數,則默認值是從分區起點到當前元素

沒用過

添加信息時注意外鍵,例如cityID就是一個外鍵,添加時一定要確保城市信息表中存在該序號的主鍵,否則會添加失敗。

--向表 studentTable 中插入數據 數據順序 (gradeID, name, gender, cityID, address) insert into studentTable(gradeID, name, gender, cityID, address) Values(8,'法外狂徒張三', 1, 1, '寡婦村')

--向表 studentTable 中插入多條數據 數據順序 (gradeID, name, gender, cityID, address) insert into studentTable(gradeID, name, gender, cityID, address) Values(8,'法外狂徒張三', 1, 1, '寡婦村'), (5,'法外狂徒李四', 0, 1, '鰥夫村')

刪除時需要注意外鍵問題,比如要刪除cityTable中的一個城市信息,則需要保證外鍵(學生信息表中cityID沒有使用對應的城市),否則不能刪除,需要先刪除學生信息表使用該城市的學生信息,然后才能刪除cityTable中的城市信息。其實還是為了確保學生信息表中cityID列中所有城市都可以在cityTable中查詢到。

--刪除 studentTable 表中 名字是 法外狂徒張三的列 delete from studentTable where studentTable.name = '法外狂徒張三'

--將studentTable 表中 studentTable.name = '法外狂徒李四' 的行的 gender更新為1 update studentTable set studentTable.gender = 1 where studentTable.name = '法外狂徒李四'

添加視圖

在將列和表設計為最小狀態后,查詢需要的數據時不可避免的需要多個表聯合查詢,每次都要聯合查詢很是麻煩,SQL提供了視圖來解決這個問題

--聯合查詢 多個表的數據組合 select studentTable.id as 學生編號, studentTable.name as 姓名, genderTable.name as 性別, gradeTable.name as 班級, (provinceTable.province + cityTable.cityName + isNull(studentTable.address, '')) as 家庭地址 from studentTable inner join cityTable on cityTable.id = studentTable.cityID inner join provinceTable on cityTable.provinceID = provinceTable.id inner join genderTable on genderTable.id = studentTable.gender inner join gradeTable on gradeTable.id = studentTable.gradeID


這種經常使用但是又臭又長查詢就可以做出視圖

--創建視圖 studentInfoTable create view studentInfoTable as select studentTable.id as 學生編號, studentTable.name as 姓名, genderTable.name as 性別, gradeTable.name as 班級, (provinceTable.province + cityTable.cityName + isNull(studentTable.address, '')) as 家庭地址 from studentTable inner join cityTable on cityTable.id = studentTable.cityID inner join provinceTable on cityTable.provinceID = provinceTable.id inner join genderTable on genderTable.id = studentTable.gender inner join gradeTable on gradeTable.id = studentTable.gradeID

創建視圖后,就可以對視圖像表一樣操作,但是視圖并不是重新創建了一張表,只是把上面那一坨語句的查詢結果當作了表。

如果想要修改視圖,將創建視圖的關鍵字 create 改為 alter 即可

添加存儲過程

存儲過程和函數類似,可以像調用函數一樣調用存儲過程

--創建存儲過程 該存儲過程有一個參數 @gradeName 類型為 nvarchar(20) create proc GetStudentsInfoFromGrade@gradeName nvarchar(20) --參數 班級名稱 as begin--查詢指定班級的學生信息select * from studentInfoTable where 班級 = @gradeName end

--調用存儲過程 exec GetStudentsInfoFromGrade '一年級一班'


如果想要修改存儲過程,將創建存儲過程的關鍵字 create 改為 alter 即可

數據透視

數據透視,起始就是行列轉換,例如想要看每個班級中男女個數,可以將性別 男 女作為列名,班級作為行名。

--數據透視 select 班級, count(case when 性別 = '男' then 學生編號 end) as, count(case when 性別 = '女' then 學生編號 end) asfrom studentInfoTable group by 班級 --分組 order by 班級 desc --排序

數據分頁

當數據量比較大時,由于內存大小有限,就需要對查詢結果進行分頁處理

進行分頁前,首先要對數據進行排序添加序號

--排序并添加序號 select *, ROW_NUMBER() over(order by id) as 行序號 from studentTable

查詢結果最左側的序號是數據庫管理工具提供的,并不是查詢結果集的內容。id是主鍵,不可以當作行序號(例如身份證號,前面的人去了,排在后面的人身份證號并不會改變,主鍵也是如此,前面數據刪除后,主鍵號也不會改變,因此主鍵并不一定連續。)


創建一個存儲過程

--獲取一頁學生信息 create proc GetStudentInfoPage@pageIndex int, --要查詢的頁序號@pageSize int --頁大小 as beginselect * from (select *, ROW_NUMBER() over(order by id) as 行序號 from studentTable) as t1 --嵌套查詢where 行序號 between (@pageIndex-1)*@pageSize+1 and @pageIndex*@pageSize --根據頁序號和頁大小確定篩選條件 end --查詢第二頁 一頁兩個數據 exec GetStudentInfoPage 2, 2

總結

以上是生活随笔為你收集整理的C# 学习笔记(18)操作SQL Server 中的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。