C# 学习笔记(18)操作SQL Server 中
C# 學習筆記(18)操作SQL Server 中
數據庫基礎操作
SQL語法可以參考 菜鳥教程 或者微軟官方的SQL示例
注意SQL不區分大小寫
查
1.基礎查詢
--最基礎的查詢語句, select * from table_name select * from studentTable2.條件查詢
--條件查詢 select * from table_name where 條件 select * from studentTable where studentTable.gradeID = 53.條件查詢 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
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 = 57.聯合查詢
--聯合查詢 兩個表的數據組合 select * from studentTable inner join cityTable on cityTable.id = studentTable.cityID --將cityTable.id 等于 studentTable.cityID的兩個表的行合并成一行
8.多表聯合查詢
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.排序
11.分組
group by cityID 會對相同的cityID值的行劃分成一組,如下圖cityID為7的共有4行,這四行劃分成了一組,也就是只能顯示一行,因此這個表中只能顯示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 * from studentTable 的查詢結果,然后根據cityID對查詢結果分組,最后對每組的行數進行count(*)統計并將數據變成一列添加到查詢結果中
- ORDER BY:定義結果集的每個分區中行的邏輯順序。
先獲取 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
這種經常使用但是又臭又長查詢就可以做出視圖
創建視圖后,就可以對視圖像表一樣操作,但是視圖并不是重新創建了一張表,只是把上面那一坨語句的查詢結果當作了表。
如果想要修改視圖,將創建視圖的關鍵字 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) as 女 from studentInfoTable group by 班級 --分組 order by 班級 desc --排序數據分頁
當數據量比較大時,由于內存大小有限,就需要對查詢結果進行分頁處理
進行分頁前,首先要對數據進行排序添加序號
--排序并添加序號 select *, ROW_NUMBER() over(order by id) as 行序號 from studentTable查詢結果最左側的序號是數據庫管理工具提供的,并不是查詢結果集的內容。id是主鍵,不可以當作行序號(例如身份證號,前面的人去了,排在后面的人身份證號并不會改變,主鍵也是如此,前面數據刪除后,主鍵號也不會改變,因此主鍵并不一定連續。)
創建一個存儲過程
總結
以上是生活随笔為你收集整理的C# 学习笔记(18)操作SQL Server 中的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: C# 学习笔记(17)操作SQL Ser
- 下一篇: C# 学习笔记(19)操作SQL Ser