一、認(rèn)識、入門
SQL是一門高級查詢語言
SQL Server是微軟開發(fā)的一個開發(fā)工具
1.使用前必須先打開兩個TCP/IP,然后再打開SQL Server(MSSQLSERVER)
2.數(shù)據(jù)庫名稱:1、. 2、127.0.0.1 3、localhost 都是代表主機(jī)的意思
3.四個系統(tǒng)數(shù)據(jù)庫:master(核心數(shù)據(jù)庫)、model(模型)、msdb(警告日志數(shù)據(jù)庫)、tempdb(臨時數(shù)據(jù)庫)
4.數(shù)據(jù)庫文件分為:.mdf/.ndf為數(shù)據(jù)庫文件 和.ldf 為日志文件
5.數(shù)據(jù)庫右鍵任務(wù)中的:(附加與分離)、(脫機(jī)與聯(lián)機(jī))、(導(dǎo)入數(shù)據(jù)與導(dǎo)出數(shù)據(jù))就不詳細(xì)講解了,可以去看一下其他教程
6.如何創(chuàng)建數(shù)據(jù)庫和刪除數(shù)據(jù)庫:兩種方式(鼠標(biāo)和代碼)
鼠標(biāo)即右鍵創(chuàng)建/刪除即可,代碼:create(創(chuàng)建)/drop(刪除) database(數(shù)據(jù)庫的意思) 數(shù)據(jù)庫名
7.三個俗語:(1)精度:除小數(shù)點以外的數(shù)字個數(shù) 例如(123.456-->6)? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?(2)小數(shù)位數(shù):小數(shù)點后面的數(shù)字個數(shù) 例如(123.456-->3)? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?(3)長度:字節(jié)長度 1個漢字=2個字節(jié) 例如(IKun打籃球--->10)
8.sql常用數(shù)據(jù)類型:int(整形)
小數(shù)(float、money)
字符串(varchar若超過8000個字節(jié)用text,nvarchar括號中的長度為字符長度,char則代表不管你輸入什么,里面都是有這么長的長度,比如char(10),你輸入一個1,那里面也是有10字節(jié)長度,nchar則是代表字符長度,varchar和char括號中的都是字節(jié)長度,當(dāng)然括號里面也可以填max,max代表8000個字節(jié))
日期時間(datetime)
布爾(bit)
圖像(image)
二、數(shù)據(jù)庫的相關(guān)操作
1.兩種方式創(chuàng)建/刪除表
鼠標(biāo):即右鍵創(chuàng)建或刪除
代碼:create(創(chuàng)建)/drop(刪除) table 表名
2.六大約束
(1)主鍵:pk(primary key)
設(shè)置主鍵后,該列同時擁有唯一索引和不為空約束,當(dāng)然一個表只能有一個主鍵,但是這個主鍵可以由多個列組成,那么這個主鍵我們稱為聯(lián)合主鍵,語法:primary key(列名,列名);若是鼠標(biāo)創(chuàng)建即ctrl+鼠標(biāo)左擊想設(shè)置為主鍵的列然后再右鍵即可,刪除也是如此
添加主鍵:alter table 表名 add constraint pk_(主鍵約束名) primary key(列名)
刪除主鍵:alter table 表名 drop constraint 主鍵約束名(增加時用的是什么名,這里就用什么名)
(2)空值約束:鼠標(biāo)右擊表的設(shè)計,找到對應(yīng)列名的不為null的勾上或取消
代碼:建表的同時在列名 數(shù)據(jù)類型后面寫上null/not null null可缺省
如果表已經(jīng)創(chuàng)建好了,那么要用代碼添加不為空約束的語法:
alter table 表名 alter column 列名 數(shù)據(jù)類型 not null
(3)默認(rèn)值約束:設(shè)計中點擊指定的列,下面有個默認(rèn)值綁定,在對應(yīng)的空填上你想要的默認(rèn)設(shè)置即可無需單引號;代碼:在建表的同時,在列名 數(shù)據(jù)類型后面寫上default 關(guān)鍵字 后寫你想要的默認(rèn)值即可
如果表已經(jīng)創(chuàng)建好了,那么要用代碼添加默認(rèn)值約束的語法:
alter table 表名 add constraint de_約束名 default '默認(rèn)值' for 列名
刪除默認(rèn)值約束的語法:alter table 表名 drop constraint 約束名(創(chuàng)建時用的是什么,這里就填什么)
不管哪種方式,默認(rèn)值都要與該列的數(shù)據(jù)類型匹配
?(4)外鍵約束:(Foreign key)
鼠標(biāo)右鍵列名,關(guān)系中創(chuàng)建外鍵約束即可
注:一定是從表的外鍵對應(yīng)主表的主鍵,另外兩個列名的數(shù)據(jù)類型和長度都要一致
創(chuàng)建語法:1.可以直接在創(chuàng)建表的同時寫上
?2.如果表已經(jīng)存在,那么創(chuàng)建外鍵的語法:
alter table 從表名 add constraint fk_(外鍵約束名) Foreign key(從表列名) references 主表(主表主鍵)
刪除語法:alter table 從表名 drop constraint 外鍵約束名(創(chuàng)建時寫的是什么,這里就是什么)
(5)檢查約束(check)
1.用于限制列中的值范圍
2.如果對單個列做check約束,那么該列只可以輸入特定數(shù)值
3.如果一個表定義check約束,那么此約束會在特定的列對值進(jìn)行限制
4.鼠標(biāo):右擊-->CHECK約束-->添加需要的條件語句 約束名可以用(sp_help 表名)查看
5.創(chuàng)建語法:
建表時:列名 數(shù)據(jù)類型 check(條件語句)
已有表時:alter table 表名 add constraint 約束名 check(條件)
刪除:alter table 表名 drop constraint 約束名
(6)唯一約束(unique)
作用:約束值不能重復(fù)
主鍵中包括了唯一索引,但unique可以有多個,主鍵只能有一個
鼠標(biāo):右擊-->索引/鍵-->選擇唯一鍵
創(chuàng)建語法:
建表時:列名 數(shù)據(jù)類型 unique
已有表時:alter table 表名 add constraint 約束名 unique(列名)
刪除:alter table 表名 drop constraint 約束名
三、增刪改查(查為重點)
1.增加(insert into)
顧名思義就是向表中增加數(shù)據(jù)
單行插入時:
insert into 表名(列名)? ? ? ? ? ? ? 或? ? insert? ? into 表名(列名)? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? values(數(shù)據(jù))? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?select 數(shù)據(jù)
多行插入時:
insert into 表名(列名)? ? ? ? ? ? ? 或? ? insert? ? into 表名(列名)? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? values(數(shù)據(jù)1),? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?select 數(shù)據(jù)1? ? ? ? union? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? (數(shù)據(jù)2)? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?select 數(shù)據(jù)2
注:列名和數(shù)據(jù)要保持三個一致:順序、個數(shù)、數(shù)據(jù)類型,如果你插入的是所有的列名,那么列名可以省略不寫,按照建表時的順序插入數(shù)據(jù);如果有主外鍵關(guān)系,必須先插入主表數(shù)據(jù),再插入從表數(shù)據(jù)
2.刪除(truncate、delete)
delete 【from】表名 where 條件
truncate table 表名 (因為truncate是刪除所有數(shù)據(jù),所以后面不能接where)
當(dāng)然delete也可以不接where字句來刪除所有數(shù)據(jù),但是那么效率很低,因為delete是一行一行地刪
注意:如果有主外鍵關(guān)系,必須先刪除從表數(shù)據(jù),才能刪除主表數(shù)據(jù)
3.改(update)
這里的改是指修改表中數(shù)據(jù),語法為:update 表名 set 要改的表達(dá)式 where 條件 (通過條件找到對應(yīng)的一行);一定要注意修改是否違反了六大約束
4.查(select)
這里的查是指查詢表中數(shù)據(jù),語法為:select 列名 from 表名?
(1)top:指前幾 例如 top 3* ,那么就是取前三的所有數(shù)據(jù); percent:百分比 例如top 50 percent ,那么就是取這個表的一半數(shù)據(jù)
(2)distinct :去除查詢結(jié)果中重復(fù)的行
(3)order by 列名 asc/desc:根據(jù)指定的列名排序,asc(缺省,升序),desc(降序),若要根據(jù)班級先升序,再根據(jù)學(xué)號再降序,則為order by 班級列名 asc,學(xué)號列名 desc
(4)is (not) null:(不)是空 在查詢列名為空的數(shù)據(jù)時,不能直接列名=null 而是列名 is null
(5)(not) in:(不)在...里 比如一個列名要等于多個值時,我們通常不用 列名=值1 or 列名=值2;而是用列名 in(值1,值2)
(6)(not)between...and:(不)在...和...之間,一般表示區(qū)間時,通常不用 列名>=值1 and 列名<=值2,表示在這兩個值的范圍內(nèi),我們一般用列名 between 值1 and 值2,當(dāng)然上面說到in,若in里面的值是(12,13,14),這種情況我們會優(yōu)先考慮用between 12 and 14
(7)like '%_':%代表任意字符,_代表單個字符,比如查詢姓李的學(xué)生,那么就是學(xué)生姓名 like '李%';如果是查詢名叫李子,姓可以是任意姓氏,那么就是 學(xué)生姓名 like '_李子'
(8)isnull(a,b):系統(tǒng)自帶函數(shù),a若為null,則查詢結(jié)果用b代替,要考慮數(shù)據(jù)類型,看是否需要將a轉(zhuǎn)換成b對應(yīng)的數(shù)據(jù)類型,還是將b轉(zhuǎn)換成a對應(yīng)的數(shù)據(jù)類型,視情況而定
四、內(nèi)置函數(shù)(下標(biāo)都是從1開始,一般配合select 使用)
1.字符串函數(shù):
(1)len:字符串長度
(2)substring:三個參數(shù),第一個是要截取的大字符串,第二個是指定下標(biāo)開始截取,第三個是截取長度為幾,返回一個截取得到的子字符串,例如substring('abcd',2,3)-->bcd
(3)replace:三個參數(shù),第一個是大字符串,第二個是大字符串中要被替換的子字符串,第三個是替換后的子字符串,例如replace('abcd','a','b')-->bbcd
(4)left/right:取左邊/右邊多少位的字符,例如left('abc',1)-->a,right('abc',1)-->c
(5)charindex:兩個參數(shù),第一個是要查找的子字符串,第二個是被查找的大字符串,返回子字符串第一次在大字符串出現(xiàn)的下標(biāo)數(shù),例如charindex('a','abc')-->1
(6)ltrim/rtrim:去除左/右邊的空格,這個單純用看不出效果,可以配合len嵌套查看字符串長度就可以看出效果了
(7)upper/lower:將英文字符串變得全大寫/小寫 例如:upper('abc')-->ABC lower('ABC'-->abc)
2.日期函數(shù):指定年用YY,月用MM,日用DD
(1)getdate():獲取系統(tǒng)時間,和sysdatetime()差不多
(2)year/month/day:獲取對應(yīng)日期的年/月/日
(3)datepart(YY/MM/DD,日期)YY代表年,MM代表月,DD代表日
(4)datename:其他功能和datepart差不多,但是有一個datename(WEEKDAY,日期)可以求出該日期的星期數(shù)
(5)datediff:三個參數(shù),可以求兩個日期之差,第一個參數(shù)可以指定求年差/月差/日差,后面兩個參數(shù)就是你要求的兩個日期
(6)dateadd:三個參數(shù),可以增加也可以減少(減少就填負(fù)數(shù)即可),也可以指定要增加年/月/日,第二個參數(shù)就是增加(減少)多少,第三個參數(shù)就是被增加(減少)的指定日期
3.數(shù)學(xué)函數(shù):
(1)abs:返回一個數(shù)的絕對值
(2)sqrt:返回一個數(shù)的平方根
(3)power:返回一個數(shù)的多少次方,兩個參數(shù),例如power(1,2)-->1的2次方
(4)ceiling/floor:向上取整/向下取整,例如ceiling(12.3)-->13,floor(12.3)-->12
(5)sign:返回值只有三個“1”,“0”,“-1”,若傳進(jìn)去的參數(shù)為負(fù)數(shù),得到的則為-1;正數(shù)則得到1;0則得到0
(6)round:四舍五入,兩個或三個參數(shù),一般用兩個 round(數(shù)字,要保留幾位小數(shù))
4.系統(tǒng)函數(shù):
(1)datalength:返回這個字符串的字節(jié)長度
(2)cast(列名 as 數(shù)據(jù)類型)/convert(數(shù)據(jù)類型,列名):轉(zhuǎn)換函數(shù),convert有兩到三個參數(shù),第三個參數(shù)只有在轉(zhuǎn)換時間類型的時候才能用到,可以去查閱其他資料獲得相關(guān)信息,一般我們用cast用的最多
五、高級查詢
1.統(tǒng)計查詢:(用這些聚合函數(shù)時,會自動忽略為null的列,要么單獨用,要么跟group by一起用,where 做分組前的篩選,having做分組后的篩選)
(1)max:獲得該列最大值
(2)min:獲得該列最小值
(3)sum:獲得該列總和
(4)avg:獲得該列平均值
(5)count:獲得該列有多少行
2.聯(lián)表查詢:
(1)內(nèi)連接:inner join
表1 as? a inner join 表2 as b on a表與b表之間的關(guān)系
(2)左外連接:left join
表1 as? a left?join 表2 as b on a表與b表之間的關(guān)系
(3)右外連接:right join
表1 as? a right join? 表2 as b on a表與b表之間的關(guān)系
(4)全外連接:full join
表1 as? a full?join? 表2 as b on a表與b表之間的關(guān)系
3.子查詢:
將一個select語句查詢的結(jié)果當(dāng)做另一個select語句的條件使用
(not)in查詢使用在返回的結(jié)果有多個時
若結(jié)果只有一個,可以使用關(guān)系運算符
any:至少;all:全部
六、視圖(view)
一張?zhí)摂M的表,具有安全性,不暴露列名;方便,不需要再寫多次select語句
直接將查詢結(jié)果當(dāng)做一張新的表給使用者查看
創(chuàng)建語法:create view 視圖名稱
? ? ? ? ? ? ? ? as
? ? ? ? ? ? ? ? select語句
查看語法:select * from 視圖名稱
刪除語法:drop view 視圖名稱
視圖和表的區(qū)別:
1.視圖是已經(jīng)編譯好的sql語句,是基于SQL語句的結(jié)果集的可視化表,而表不是
2.視圖(除過索引視圖)沒有實際的物理記錄,而基本表有
3.表是內(nèi)容,視圖是窗口
4.表占物理空間,而視圖只是邏輯概念的存在
5.視圖是查看數(shù)據(jù)表的一種方法,可以查詢數(shù)據(jù)表中某些字段構(gòu)成的數(shù)據(jù),只是一些SQL語句的集合。從安全角度說,視圖可以防止用戶接觸數(shù)據(jù)表,從而不知表結(jié)構(gòu)
6.表屬于全局模式的表,是實表;視圖數(shù)據(jù)局部模式的表,是虛表。
7.視圖的建立和刪除只影響視圖本身,不影響對應(yīng)的基本表
8.視圖不能包含order by子句,除非select語句的選擇列表中還有個top子句
9.視圖不能使用into關(guān)鍵字,視圖不能包含option子句
10.視圖不能對臨時表或表變量的引用。視圖最多可以有1024列
七、補(bǔ)充知識點:sp_rename 舊名,新名
這個語法可以更改表和視圖等等的名字,但是不能修改數(shù)據(jù)庫的名字
八、當(dāng)然還有一個存儲過程,存儲過程和視圖差不多,在這里我提一嘴
創(chuàng)建存儲過程:create proc或procedure 存儲過程名
? ? ? ? ? ? ? ? ? ? ? ? as
? ? ? ? ? ? ? ? ? ? ? ? ? select語句
? ?使用存儲過程:exec 存儲過程名
刪除存儲過程:drop proc或procedure 存儲過程名
當(dāng)然存儲過程可以帶有參數(shù),上面只是無參存儲過程,參數(shù)也分兩種:輸入?yún)?shù)和輸出參數(shù)
我們稱為input參數(shù)和output參數(shù)
輸入?yún)?shù):用于向存儲過程傳入值,類似java語言或c中的值傳遞
輸出參數(shù):用于調(diào)用存儲過程后,參會結(jié)果,類似java的按引用傳遞
帶一個輸入?yún)?shù)的存儲過程創(chuàng)建:(要求:列名與輸入?yún)?shù)相等)
? ? ? ? create proc 存儲過程名(@參數(shù)名 數(shù)據(jù)類型)
? ? ? ? as
? ? ? ? select 列名 from 表名 where 列名=@參數(shù)名?
帶兩個輸入?yún)?shù)的存儲過程:
? ? ? ? create proc 存儲過程名(
? ? ? ? @參數(shù)名 數(shù)據(jù)類型,
? ? ? ? @參數(shù)名 數(shù)據(jù)類型
? ? ? ? )
? ? ? ? as
? ? ? ? select 列名 from 表名 where 列名=@參數(shù)名 and 列名 = @參數(shù)名
帶output參數(shù)的存儲過程:
? ? ? ? 創(chuàng)建帶output參數(shù)的存儲過程:
? ? ? ? create procedure 存儲過程名(
? ? ? ? @參數(shù)名 數(shù)據(jù)類型,
? ? ? ? @參數(shù)名 數(shù)據(jù)類型 output
? ? ? ? )
? ? ? ? as
? ? ? ? select output參數(shù)名=列名 from 表名 where 列名=輸入?yún)?shù)名
? ? ? ? 執(zhí)行該存儲過程,注意:要3行代碼一起執(zhí)行
? ? ? ? declare @參數(shù)名 數(shù)據(jù)類型
? ? ? ? exec 存儲過程名 output參數(shù)的值(要與數(shù)據(jù)類型一致),@參數(shù)名(declare后面的參數(shù)名是什么,這就是什么)
? ? ? ? select?@參數(shù)名(declare后面的參數(shù)名是什么,這就是什么) as 別名
當(dāng)然你使用了存儲過程時肯定會覺得和視圖差不多,但其實差距非常大,可以去網(wǎng)上搜一搜它們的區(qū)別,不是我一兩句話能寫的完的
附:@代表局部變量,@@代表全局變量
九、索引(index)其實這個知識點并不重要,因為要幾百條、幾千條、甚至幾萬條數(shù)據(jù)才能看得出效果,感興趣的可以了解一下
存在目的:為了提高查詢效率
假設(shè)要查詢姓張的學(xué)生
未建立索引時,查詢指定的字段從a開始一直b、c、d.....到z 張
建立索引時,直接指定到z的序列去找
創(chuàng)建索引語法:create index 索引名稱 on 表名(字段)?文章來源:http://www.zghlxwxcb.cn/news/detail-434435.html
刪除索引:drop index 索引名稱 on 表名文章來源地址http://www.zghlxwxcb.cn/news/detail-434435.html
到了這里,關(guān)于SQL Server知識點歸納的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!