SQL Server 資料庫基礎筆記分享(上)

来源:https://www.cnblogs.com/OneManStep/archive/2018/07/14/9309237.html
-Advertisement-
Play Games

前言 本文是個人學習SQL Server 資料庫時的以往筆記的整理,內容主要是對資料庫的基本增刪改查的SQL語句操作和約束,視圖,存儲過程,觸發器的基本瞭解。 註:內容比較基礎,適合入門者對SQL Server 資料庫的瞭解!!! 正文 1.主鍵: 主鍵的作用:保證表中的每條數據的唯一性 特點: 主 ...


前言

本文是個人學習SQL Server 資料庫時的以往筆記的整理,內容主要是對資料庫的基本增刪改查的SQL語句操作約束,視圖,存儲過程,觸發器的基本瞭解。

註:內容比較基礎,適合入門者對SQL Server 資料庫的瞭解!!!

正文

1.主鍵:

主鍵的作用:保證表中的每條數據的唯一性
特點: 主鍵不能重覆 不能為空
分類:
邏輯主鍵:選擇為表中增加的那些“自動編號”列或者“GUID”列為主鍵(沒有實際業務上的意義)的主鍵 (建議使用邏輯主鍵)
業務主鍵:選擇表中那些在業務中有實際意義的列作為主鍵
》》》》》》》》》選擇主鍵的策略,選什麼樣的列作為主鍵《《《《《《《《《
1》主鍵,建議選擇那些一般不會被修改的列
2》選擇單列,不選擇多列(不用組合主鍵)
3》選擇那些簡單列(整數列(自動編號))

 

2.char(),nchar(),varchar()之間的區別

》》》》》》》》》char(10)與varchar(10)的區別《《《《《《《《《
char(10) 固定長度,表示在資料庫中存儲的時候占用10個位元組的空間,如果超出10個則報錯,如果不夠10個則用空格補全。
varchar(10) 可變長度,表示該列最多可以存儲10個位元組,如果實際存儲不夠10個位元組,則會在存儲的時候自動計算一下實際的存儲個數,而動態的改變長度。【節省空間】

》》》》》》》》》char(10)與nchar(10)的區別《《《《《《《《《

char(10) 可以存儲10個字母或者5個漢字。 用來存儲數據的時候,英文站1個位元組,中文站2個位元組。

nchar(10) 表示可以存儲10個字母或10個漢字,因為每個字元都是按照unicode方法來存儲的。當使用nchar(10),來存儲數據的時候無論存儲的是中文還是英文都是每個字元占2個。

 

3. 創建資料庫

--創建一個資料庫
create database School

--刪除資料庫
drop database School

--創建資料庫的時候,指定一些資料庫的相關參數。
create database School
on primary --主數據文件
(
name='School',
size=10mb,
filename='c:school.mdf',
filegrowth=10%,
maxsize=100mb
)
log on --日誌文件
(
name='School_log',
filename='c:school.ldf',
size=5mb,
filegrowth=5mb,
maxsize=50mb
)

--切換資料庫
use school
go

4. 創建表

--創建表
create table Class
(
ClassId int identity(1,1) primary key,
ClassName varchar(50) not null,
ClassDesc varchar(50) not null
)

--刪除表
drop table Class

--向Class表中插入數據
insert into Class(ClassName,ClsDesc)values('大三','三年');

--insert into...values.. 這種寫法每次只能插入一條數據

--向Class表中插入多條數據
--重覆數據不重覆插入,union關鍵字本身就具有去掉重覆的意思
--union | union all (重覆插入)
insert into Class
select '大三','三年' union
select '三五','間諜' union
select '一一','多久' union
select '六七','得到'


--將Class表中的數據備份到Student表中
--這種寫法會將Class表中的所有數據插入到Student表中
--前提是Student表不存在,如果這個表存在則報錯。
select * into Student from Class


--向一個已經存在的表中插入數據,數據的來源是Class表
insert into Student(ClassName,ClsDesc)
select ClassName,ClsDesc from Class

 

--查詢表中數據
select * from Class

5.update 數據

--將所有年齡小於20歲的人的年齡都改成19(tage是Class表後加屬性)
update Class set tage=19 where tage<20

--將年齡為19歲的並且性別為0的人的姓名兩邊★改為☆
update Class set ClassName =replace (tname,'★','☆') where tage=19 and tgender=0

6.刪除數據

delete from Class --刪除所有數據 自動編號沒有恢復到預設值 可以根據條件來刪除
truncate table Class --重新設置了自動編號 刪除只能一次性都清空,不能根據條件來刪除 清除速度(性能)比delete語句快的多


delete from Class where tage=19 or tage is null --刪除19歲或者空值

》》》》》》》》》刪除重覆數據只保留一條(id最小的一條)《《《《《《《《《
》》》》》》》》》刪除表中多餘的重覆記錄,重覆記錄是根據單個欄位(peopleId)來判斷,只留有rowid最小的記錄 《《《《《《《《《
delete from people
where peopleName in (select peopleName from people group by peopleName having count(peopleName) > 1)
and peopleId not in (select min(peopleId) from people group by peopleName having count(peopleName)>1)

 

7.條件查詢,模糊查詢

--查詢數學沒有及格的學生的學號
select
fid as 學號,
fmath as 分數
from MyStudent where fmath<60

--查詢年齡在20-30歲之間的男學生
select
fname as 姓名 from MyStudent where fage between 20 and 30 and fgender='男'

--查詢班級id 1 2 3 的所有學生
select * from MyStudent where classid in (1,2,3)

--查詢所有姓趙的同學 (通配符%表示:任意多個任意字元)
select * from MyStudent where fname like '趙%'

--查詢出姓名中只要包含一個‘民’字即可。
select * from MyStudent where fname like '%民%'

--查詢所有姓趙的同學,並且姓名字數是3個
--通配符 _ :表示任意的單個字元。
select * from MyStudent where fname like '趙__'
select * from MyStudent where fname like '趙%' and len(fname)=3

--查詢出姓名中包含‘民’或‘用’的同學
--通配符[]:表示中括弧中的任意個字元,只選一個匹配
--通配符 ^a :表示除了a這個字元都行。
select * from MyStudent where fname like '%[民用]%'

8.聚合函數

--查詢數學成績最高低分
select max(fMath) as 數學成績最高分 from MyStudent
select min(fMath) as 數學成績最低分 from MyStudent

--平均分(計算平均分的時候對空值不處理)
select avg(fMath) as 平均分 from MyStudent

--求數據記錄中的總條數(總人數)
select count(*) as 班級總人數 from MyStudent


select
最高分=(select max(fMath) as 數學成績最高分 from MyStudent),
最低分=(select min(fMath) as 數學成績最低分 from MyStudent),
平均分=(select avg(fMath) as 平均分 from MyStudent)


--分數評級
--90以上 優秀
--80以上 良好
--70以上 中
--70以下 差
select chengji,
評級=
case
when shuxue>=90 then '優秀'
when shuxue>=80 then '良好'
when shuxue>=70 then '中'
else '差'
end
from Student

9.null 問題

--請查詢出學生表中所有數學成績為null的人的信息
--null在資料庫中表示unknow(不知道),判斷一個值是否為null,也就不能用=或者<>來判斷
select * from MyStudent where fMath=null 錯誤(不返回任何數據)

正確 select * from MyStudent where fMath is null

--查詢所有fmath為非null的值
select * from MyStudent where fMath is not null


--null值與任何數據運算後得到的還是null值。
update MyStudent set fage=fage+1 where fid=1

10.分組group by

--統計出mystudent表中,男女同學的個數

select
fgender as 性別, --這時,count(*)統計的是每一組的記錄條數, 不是總條數
count(*) as 人數
from MyStudent group by fgender --先執行group by語句分組,分完組在統計每 組個數。 分出來幾個組,那麼count(*)就統 計幾次


--查詢班級的男同學的人數大於2的信息

--having是group by的條件對分組後的數據進行篩選(與where類似,都是篩選,只不過having是用來篩選分組後的組的)
select
classid as 班級號,
count(*) as 班級人數
from TblStudent
where fgender='男'
group by classid
having count(*)>2

》》》》》》》》》語句執行順序《《《《《《《《《

select
--distinct / top 之類的關鍵字
fgender as 性別, --5》選擇列
count(*) as 人數
from MyStudent --1》先從表中拿到數據
where fage>30 --2》從MyStudent的數據中篩選出所有年齡大於30歲的任的信息
group by fgender --3》按照性別分組,分完組得到一個新的結果集
having count(*)>500 --4》基於分組以後的結果集,然後再篩選,篩選出那些組中記錄大於500的組
order by 人數 asc --6》最後把顯示出來的結果排序


--語句執行順序
from > where > group by > having > select > order by

11.日期函數

--請查詢出所有入職一年以上的員工信息
select * from TblStudent
where dateadd(year,1,tsday)<getdate()


--計算兩個時間差
--查詢90年距今是多少年
select datediff(year,'1990-9-9',getdate())


--查詢一個日期的特定部分
select year(getdate())
select datepart(year,getdate())

--輸出所有數據中通話時間最長的5條記錄。
select top 5 *,'通話時長(秒)'=datediff(second,Startdatetime,Enddatetime) from Calltecords order by datediff(second,Stardatetime,enddatetime) desc

後記

下篇分享視圖、觸發器等,分頁查詢、子查詢、連表查詢等

 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 有三張百萬級數據表 知識點表(ex_subject_point)9,316條數據 試題表(ex_question_junior)2,159,519條數據 有45個欄位 知識點試題關係表(ex_question_r_knowledge)3,156,155條數據 測試資料庫為:mysql (5.... ...
  • 由於Oracle授權問題,Maven3不提供oracle JDBC driver 可以到maven中央倉庫去下載依賴,網址:http://repo.spring.io/plugins-release/com/oracle/ojdbc6/11.2.0.3/ 複製到本地倉庫對應目錄即可 ...
  • MySQL5.7下麵,誤操作導致的drop table db1.tb1; 的恢復方法: 0、停業務數據寫入。【iptables封禁】 1、從備份伺服器上拉取最新的一個全備文件,恢復到一個臨時的伺服器上,解壓並啟動mysqld。 2、在這台新的slave上執行如下命令: 2.1 先配置好複製關係, c ...
  • 資料庫崩潰恢復表結構的方法 如果資料庫發生崩潰,無法登陸資料庫,想要快速恢復表結構的話有一個很方便的方法。 通過mysqlfrm工具就可以快速解析.frm文件,找到create table 語句。 安裝mysqlfrm 安裝mysqlfrm的話,需要兩個安裝包。mysql-utilities和mys ...
  • 分散式文件系統概述 相對於傳統的本地文件系統而言,分散式文件系統(Distribute File System)是一種通過網路實現文件在多台主機上進行分散式存儲的文件系統。分散式文件系統的設計一般採用“客戶/服務機”模式,客戶端以特定的通信協議通過網路與伺服器建立連接,提出文件訪問請求,客戶端和服務 ...
  • 1.為什麼要重寫SQL語句 ProxySQL在收到前端發送來的SQL語句後,可以根據已定製的規則去匹配它,匹配到了還可以去重寫這個語句,然後再路由到後端去。 什麼時候需要重寫SQL語句? 對於下麵這種簡單的讀、寫分離,當然用不上重寫SQL語句。 這樣的讀寫分離,實現起來非常簡單。如下: 但是,複雜一 ...
  • 前言 本文是個人學習SQL Server 資料庫時的以往筆記的整理,內容主要是對資料庫的基本增刪改查的SQL語句操作和約束,視圖,存儲過程,觸發器的基本瞭解。 註:內容比較基礎,適合入門者對SQL Server 資料庫的瞭解!!! 正文 1.子查詢 --把一個查詢結果作為另外一個查詢的查詢源 sel ...
  • show dbs 查看有哪些資料庫創建資料庫 : use db_test插入集合user : db.createCollection("user")插入文檔 : db.user.insert({"name":"zhangsan","age":20}) db.admin.insert({"user": ...
一周排行
    -Advertisement-
    Play Games
  • Timer是什麼 Timer 是一種用於創建定期粒度行為的機制。 與標準的 .NET System.Threading.Timer 類相似,Orleans 的 Timer 允許在一段時間後執行特定的操作,或者在特定的時間間隔內重覆執行操作。 它在分散式系統中具有重要作用,特別是在處理需要周期性執行的 ...
  • 前言 相信很多做WPF開發的小伙伴都遇到過表格類的需求,雖然現有的Grid控制項也能實現,但是使用起來的體驗感並不好,比如要實現一個Excel中的表格效果,估計你能想到的第一個方法就是套Border控制項,用這種方法你需要控制每個Border的邊框,並且在一堆Bordr中找到Grid.Row,Grid. ...
  • .NET C#程式啟動閃退,目錄導致的問題 這是第2次踩這個坑了,很小的編程細節,容易忽略,所以寫個博客,分享給大家。 1.第一次坑:是windows 系統把程式運行成服務,找不到配置文件,原因是以服務運行它的工作目錄是在C:\Windows\System32 2.本次坑:WPF桌面程式通過註冊表設 ...
  • 在分散式系統中,數據的持久化是至關重要的一環。 Orleans 7 引入了強大的持久化功能,使得在分散式環境下管理數據變得更加輕鬆和可靠。 本文將介紹什麼是 Orleans 7 的持久化,如何設置它以及相應的代碼示例。 什麼是 Orleans 7 的持久化? Orleans 7 的持久化是指將 Or ...
  • 前言 .NET Feature Management 是一個用於管理應用程式功能的庫,它可以幫助開發人員在應用程式中輕鬆地添加、移除和管理功能。使用 Feature Management,開發人員可以根據不同用戶、環境或其他條件來動態地控制應用程式中的功能。這使得開發人員可以更靈活地管理應用程式的功 ...
  • 在 WPF 應用程式中,拖放操作是實現用戶交互的重要組成部分。通過拖放操作,用戶可以輕鬆地將數據從一個位置移動到另一個位置,或者將控制項從一個容器移動到另一個容器。然而,WPF 中預設的拖放操作可能並不是那麼好用。為瞭解決這個問題,我們可以自定義一個 Panel 來實現更簡單的拖拽操作。 自定義 Pa ...
  • 在實際使用中,由於涉及到不同編程語言之間互相調用,導致C++ 中的OpenCV與C#中的OpenCvSharp 圖像數據在不同編程語言之間難以有效傳遞。在本文中我們將結合OpenCvSharp源碼實現原理,探究兩種數據之間的通信方式。 ...
  • 一、前言 這是一篇搭建許可權管理系統的系列文章。 隨著網路的發展,信息安全對應任何企業來說都越發的重要,而本系列文章將和大家一起一步一步搭建一個全新的許可權管理系統。 說明:由於搭建一個全新的項目過於繁瑣,所有作者將挑選核心代碼和核心思路進行分享。 二、技術選擇 三、開始設計 1、自主搭建vue前端和. ...
  • Csharper中的表達式樹 這節課來瞭解一下表示式樹是什麼? 在C#中,表達式樹是一種數據結構,它可以表示一些代碼塊,如Lambda表達式或查詢表達式。表達式樹使你能夠查看和操作數據,就像你可以查看和操作代碼一樣。它們通常用於創建動態查詢和解析表達式。 一、認識表達式樹 為什麼要這樣說?它和委托有 ...
  • 在使用Django等框架來操作MySQL時,實際上底層還是通過Python來操作的,首先需要安裝一個驅動程式,在Python3中,驅動程式有多種選擇,比如有pymysql以及mysqlclient等。使用pip命令安裝mysqlclient失敗應如何解決? 安裝的python版本說明 機器同時安裝了 ...