sql sever 2008基础知识
下面是一些總結(jié),如果執(zhí)行時(shí)發(fā)現(xiàn)錯(cuò)誤,可以查看錯(cuò)誤消息進(jìn)行解決,也可上網(wǎng)查資料
數(shù)據(jù)庫(kù)的組成:
主數(shù)據(jù)文件:有且只有一個(gè),擴(kuò)展名為.mdf。
次數(shù)據(jù)文件:可以沒(méi)有,也可以有任意個(gè)。擴(kuò)展名為.ndf。
日志文件: ? 至少有一個(gè),擴(kuò)展名為.ldf。
數(shù)據(jù)庫(kù)的相關(guān)操作:
1.創(chuàng)建:
請(qǐng)看代碼例子:
create database testone --創(chuàng)建數(shù)據(jù)庫(kù),名為testone,注意數(shù)據(jù)庫(kù)名、數(shù)據(jù)文件的邏輯名、數(shù)據(jù)文件的物理名可以各不相同。寫(xiě)的時(shí)候最好這樣 on primary( --申明主數(shù)據(jù)文件name='testone', --主數(shù)據(jù)文件邏輯名filename='d:\sql server shujuku\testone.mdf',--主數(shù)據(jù)文件物理名,即在硬盤的位置size=10MB, --初始大小maxsize=unlimited, --最大值,unlimited表示不限制大小filegrowth=1MB --自動(dòng)增長(zhǎng) ) log on( --申明日志文件name='testone_log', --日志文件邏輯名filename='d:\sql server shujuku\testone_log.ldf',--日志文件物理名size=1MB,maxsize=unlimited,filegrowth=10% ) go? 2.查看數(shù)據(jù)庫(kù)信息:
請(qǐng)看代碼例子:
exec sp_helpdb 測(cè)試 --可以查看數(shù)據(jù)庫(kù)數(shù)據(jù)文件信息? ? 3.打開(kāi):
請(qǐng)看代碼例子:
use testone? 4.修改(右擊數(shù)據(jù)庫(kù)點(diǎn)擊屬性也能操作):
請(qǐng)看代碼例子:
alter database testone --alter,表示改變的意思,modify表示修改 modify name=測(cè)試alter database 測(cè)試 add file(name=測(cè)試_log02,filename='d:\sql server shujuku\測(cè)試_log02.ldf' --即使該文件不存在,數(shù)據(jù)庫(kù)會(huì)自動(dòng)生成的 )alter database 測(cè)試 remove file 測(cè)試_log2? 5.刪除:
請(qǐng)看代碼例子:
drop database lisql ?sever中的數(shù)據(jù)類型:
常用的數(shù)據(jù)類型有:
int ? ?java與之對(duì)應(yīng)的int 類型。
float ?java與之對(duì)應(yīng)的float類型。
char ?一個(gè)字符占一個(gè)字節(jié),空間不足斬?cái)辔膊?#xff0c;空間多余空格填充。java與之對(duì)應(yīng)的String類型。
?varchar ?一個(gè)字符占一個(gè)字節(jié),空間不足斬?cái)辔膊?#xff0c;空間多余不用空格填充。java與之對(duì)應(yīng)的String類型。
nchar ? ?一個(gè)字符占兩個(gè)字節(jié),空間不足斬?cái)辔膊?#xff0c;空間多余空格填充。java與之對(duì)應(yīng)的String類型。
?nvarchar ?一個(gè)字符占兩個(gè)字節(jié),空間不足斬?cái)辔膊?#xff0c;空間多余不用空格填充。java與之對(duì)應(yīng)的String類型。
記憶方法:"var" 表示變的意思,就是空間多余不用空格填充;有"n" 表示一個(gè)字符占兩個(gè)字節(jié)。
注意:一個(gè)字母相當(dāng)于一個(gè)字符,而一個(gè)漢字可以理解為兩個(gè)字符,也就是說(shuō)char(2)只能放下一個(gè)漢字。
?datetime ? java與之對(duì)應(yīng)的可以是java.sql.Date,也可以是string類型,但是要以日期格式。
?表的相關(guān)操作:
1.表的創(chuàng)建:
? ? 語(yǔ)法基本格式:
? create table 表名
( 列名 ?數(shù)據(jù)類型[(長(zhǎng)度)] ?[null |not null] ?[identity(初始值,步長(zhǎng))] [約束], ? ?
? ........ ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ??
)
?列名書(shū)寫(xiě)習(xí)慣:作為主鍵的應(yīng)該寫(xiě)在最前頭,如果不在最前頭或是組合主鍵,列名為:"列名_pk"。作為外鍵或是組合外鍵,列名為:"列名_fk"。
?沒(méi)寫(xiě)not null 默認(rèn)表示null,identity表示自增長(zhǎng),不用插入數(shù)值。
? ? 約束:
主鍵約束:[constraint 約束名] primary key
外鍵約束:[constraint 約束名] foreign key references 參照表(參照列)[on delete cascade | on update cascade]
唯一鍵約束:[constraint 約束名] unique(列名)
檢查約束:[constraint 約束名] check(檢查表達(dá)式)
默認(rèn)值約束:[constraint 約束名] default 默認(rèn)值
constraint 表示約束的意思。references表示參考的意思。cascade表示串聯(lián)的意思,[on delete cascade | on update cascade]表示級(jí)聯(lián)操作。
加上"constraint 約束名"是便于約束之間的區(qū)別,便于以后的刪除。注意約束名是相對(duì)于數(shù)據(jù)庫(kù),而非表,也就是說(shuō)一個(gè)數(shù)據(jù)庫(kù)不可能有同樣的約束名。
約束名命名規(guī)范:主鍵:pk,外鍵:fk,唯一鍵:uq,檢查:ck,默認(rèn):df。例如:表名"成績(jī)",有列名"學(xué)號(hào)","課程號(hào)",
如果讓學(xué)號(hào)做主鍵,那么命名為:pk_cj_xh,如果讓學(xué)號(hào)和課程號(hào)組合主鍵,那么命名為:pk_cj_xh_kch。
如果這樣有命名沖突,查看錯(cuò)誤消息,進(jìn)行合理的編號(hào),如:pk_cj01_xh01。
?如果是組合主鍵,格式為:[constraint 約束名] primary key(列名1[,...])。
?如果是組合外鍵,格式為:[constraint 約束名] foreign key(列名1[,...])?references?參照表(參照列1[,...])[on delete cascade | on update cascade]。前提是參照表要有與之對(duì)應(yīng)的組合鍵。
?如果是組合唯一鍵,格式為:[constraint 約束名] unique(列名1[,...])。
? ? ? 請(qǐng)看代碼例子:
use 測(cè)試 create table xs(學(xué)號(hào) char(10) not null primary key,姓名 varchar(20) not null,成績(jī) smallint not null )? ?2.查看表的信息:
? ? ? ? ?請(qǐng)看代碼例子:
exec sp_help xs --可以查看表中列的屬性和約束等信息? ? 3.修改表:
a.修改表名和列名,請(qǐng)看代碼例子:
exec sp_rename "cj","成績(jī)表" --修改表名 exec sp_rename "成績(jī)表.學(xué)號(hào)","xh" --修改表中的列名b.添加列、修改列的屬性、刪除列(一個(gè)alter table 命令一次只能對(duì)表進(jìn)行一項(xiàng)修改操作),請(qǐng)看代碼例子:
? 如果你想改變字段的位置,可以通過(guò)表的"設(shè)計(jì)"進(jìn)行操作
alter table cj add 年齡 int not null --增加列alter table cj alter column 年齡 int null --修改列的屬性,注意只能修改字段的數(shù)據(jù)類型和能否為null,identity(初始值,步長(zhǎng)),約束都不能操作,--但添加列時(shí)候可以操作 alter table cj drop column 年齡 --刪除列 注意保證該列沒(méi)有索引和約束
c.添加約束和刪除約束(沒(méi)有修改的,刪了再添加=修改)(一個(gè)alter table 命令一次只能對(duì)表進(jìn)行一項(xiàng)修改操作)
添加主鍵約束:
alter table 表名?
add?[constraint 約束名] primary key(列名1[,...])
添加外鍵約束:
alter table 表名?
add?[constraint 約束名] foreign key(列名1[,...])?references?參照表(參照列1[,...])[on delete cascade | on update cascade]
?添加唯一鍵約束:
alter table 表名
?add?[constraint 約束名] unique(列名1[,...])
? ? ? ? ? ? 添加檢查約束:
alter table 表名
[with nocheck] ? ? --加了這,表示對(duì)表中現(xiàn)有的數(shù)據(jù)不檢查,沒(méi)加,表示會(huì)檢查。
add?[constraint 約束名] check(檢查表達(dá)式)
添加默認(rèn)值約束:
alter table 表名
add?[constraint 約束名] default 默認(rèn)值 for?列名1[,...]
刪除約束: ?alter table 表名 ?
drop 約束名
? ? ? ?4.刪除表:
drop table 表名 ? ? ? ? ? ?--注意如果其它表的外鍵引用了該表,那么就要先刪除其他表中引用該表的外鍵。
--drop table 命令一次可以刪除多個(gè)表,表名之間用逗號(hào)隔開(kāi)。
添、刪、查、改(如果是字符串類型的加上單引號(hào))
添:
? ? ? ?1.插入表中所有列的數(shù)據(jù):
代碼例子:
insert cj values('小李',100)? ? ? 2.插入表中指定列的數(shù)據(jù):
代碼例子:
insert cj(姓名) values('力王')? ? ? 3.批量插入:
代碼例子:
insert cj values('小李',100),('小王',99)改:
代碼例子:
update cj set 姓名='小李' where 成績(jī)=99 --沒(méi)有where字句,則所有的姓名都為"小李"刪:
代碼例子:
delete cj where 成績(jī)=99 --沒(méi)有where字句,則將刪除表中所有記錄,可以用truncate table 表名 命令,效率更快。查:
代碼例子:
select distinct 姓名 as 名字,成績(jī) as 分?jǐn)?shù) into 成績(jī)單 from cj select top 10 * from cj --查詢表中前十條記錄 select top 10 percent * from cj --查詢表前面10%的記錄解釋:distinct 表示過(guò)濾掉重復(fù)的記錄,姓名 as 名字 表示將字段名"姓名" 換成別名"名字",into 成績(jī)單表示生成一個(gè)
與cj表結(jié)構(gòu)一樣的表,如果是"#into"則表示生成的是與cj表結(jié)構(gòu)一樣的臨時(shí)表,表名為"成績(jī)單",然后將查詢的記錄插入到該表中。
查詢條件中常用的運(yùn)算符
? ?比較:=,!=或<>,>,<,>=,<= ? 設(shè)置多重條件:and,or,not ? 確定范圍[not] between...and... ? 測(cè)試空值 :is[not]null
? ?確定集合:
? ? Exists:子查詢至少返回一行時(shí)條件為true。
? ? Not Exists:子查詢不返回任何一行時(shí)條件為true。
? ? In:與子查詢返回結(jié)果集中某個(gè)值相等。
? ? Not In:與子查詢返回結(jié)果集中任何一個(gè)值不相等。
? ? >ANY|some:比子查詢返回結(jié)果中的某些值大。
? ?<Any|some:比子查詢返回結(jié)果中的某些值小。
? ? >ALL:比子查詢返回結(jié)果中的所有值都大。
? ?<ALL:比子查詢返回結(jié)果中的所有值都小。
? ?字符匹配,用于模糊查詢 [not] like <匹配串>:
? 1.%:表示從0~n個(gè)任意字符。
? 2._:表示單個(gè)任意字符。
? 3.[]:表示方括號(hào)里列出的任意一個(gè)字符。
? 4.[^]:任意一個(gè)沒(méi)有在方括號(hào)里列出的字符。
? 排序:order by 子句:ASC(升序),DESC(降序),如:select * from cj order by 成績(jī) asc
? 注意:對(duì)于空值,若按升序排,含空值的元組將最后四暗示。若按降序排,空值的元組將最先顯示。默認(rèn)是按升序排列的。
? order by 子句中可以指定多個(gè)列,檢索結(jié)果首先按第一列進(jìn)行排序,第1列值相同的那些數(shù)據(jù)行,再按照第2列排序
? ?字符,漢字,數(shù)字都可以排序。order by 子句一般放在最后。
? 分組:group by 列名 [having 表達(dá)式]子句,該子句放在where子句后面。where是對(duì)表內(nèi)記錄進(jìn)行篩選的,group by 列名 [having 表達(dá)式]子句
? 表示對(duì)篩選的結(jié)果進(jìn)行分組,或者用[having 表達(dá)式]對(duì)組內(nèi)記錄再進(jìn)一步篩選。
?如:在xs表中篩選出分?jǐn)?shù)在90分以上,分專業(yè)統(tǒng)計(jì)出男生和女生的平均年齡及人數(shù),結(jié)果按性別排序。
select 專業(yè),性別,平均年齡=avg(datediff(yy,出生時(shí)間,getdate())),人數(shù)=count(*) from xs where ?分?jǐn)?shù)>90 group by 專業(yè),性別 order by 性別
該語(yǔ)句執(zhí)行的順序:1.where ?分?jǐn)?shù)>90 2.group by 專業(yè),性別 3.order by 性別
連接查詢(這里只講兩個(gè)表之間的連接,多表同理)
內(nèi)連接:
select 表名.列名,表名.列名... from 表名1,表名2 where 表名1.列名=表名2.列名 ? 或
select 表名.列名,表名.列名...from 表名1 join 表名2 on 表名1.列名=表名2.列名
外連接:
左外連接:select 表名.列名,表名.列名...from 表名1 left join 表名2 on 表名1.列名=表名2.列名
右外連接:select 表名.列名,表名.列名...from 表名1 right join 表名2 on 表名1.列名=表名2.列名
全外連接:select 表名.列名,表名.列名...from 表名1 full join 表名2 on 表名1.列名=表名2.列名
子查詢:
例子(在xs表中查詢和"劉鑫"在同一專業(yè)的所有男同學(xué)的信息):
select * from xs where 性別="男" and 姓名<>"劉鑫" and 專業(yè)=(select 專業(yè) from xs where 姓名="劉鑫")
視圖:是基于基表的情況下,進(jìn)行[連接]查詢所得到的一張?zhí)摫怼?梢酝ㄟ^(guò)視圖進(jìn)行查詢數(shù)據(jù),在沒(méi)有限制的情況下對(duì)視圖進(jìn)行修改數(shù)據(jù),相對(duì)應(yīng)的基表也會(huì)變動(dòng),同樣基表修改數(shù)據(jù),視圖也會(huì)發(fā)生改變。
創(chuàng)建:
create view 視圖名
[with encryption] ? ? ? ? ? ? --進(jìn)行加密,那么點(diǎn)擊"設(shè)計(jì)"和用"exec ?sp_helptext ?試圖名" 就沒(méi)用了
as --exec ?sp_helptext ?視圖名 表示查看視圖定義信息
select 語(yǔ)句
[with check option] ? ? ? ? ? ?--如果加了它,視圖創(chuàng)建好后,對(duì)視圖的insert,update操作得遵循當(dāng)初創(chuàng)建視圖是select語(yǔ)句where語(yǔ)句中的條件。要是不遵循的話,就會(huì)出錯(cuò)。如果沒(méi)加它,不用遵循當(dāng)初創(chuàng)建視圖是select語(yǔ)句where語(yǔ)句中的條件
inset 注意點(diǎn):
由于視圖只引用表中的部分字段,所以通過(guò)視圖插入數(shù)據(jù)時(shí)只能給視圖中引用的字段的賦值。而那些表中并未引用的字段,必須知道在沒(méi)有指定取值的情況下如何填充數(shù)據(jù),因此視圖中未引用的字段必須具備下列條件之一:
?1.?該字段允許空值,2.該字段有默認(rèn)值,3,自增長(zhǎng)。
查看視圖定義信息: ? ?exec ?sp_helptext ?視圖名
視圖的修改:跟創(chuàng)建差不多,只是用這個(gè)名字而已,alter view 視圖名 [with encryption] as select 語(yǔ)句 [with check option]
?視圖的刪除: drop view 視圖名1,視圖名2... ? ? ? ? ? ?--一次可以刪除多個(gè)視圖
? 索引(索引的排序是按照升序排序的):
1.索引的作用:加快數(shù)據(jù)查詢,加快表的連接、排序和分組工作。
2.建立索引的一般原則是:a.對(duì)經(jīng)常用來(lái)搜索數(shù)據(jù)記錄的字段建立索引。
b.對(duì)表中的主鍵字段建立索引
c.對(duì)表中的外鍵字段建立索引
d.對(duì)查詢中用來(lái)連接表的字段建立索引
e.對(duì)經(jīng)常用來(lái)作為排序基準(zhǔn)的字段建立索引
? 3.索引的分類:聚集索引和非聚集索引、唯一索引(索引列中的值具有唯一性)和非唯一索引(索引列中的值不具有唯一性)、單列索引和多列索引(復(fù)合索引)(一共有2*2*2=8種)
? 解釋:聚集索引和非聚集索引的區(qū)別:首先它們都發(fā)揮了索引的作用,但聚集索引的排序即記錄在存儲(chǔ)在磁盤的排序(我們?cè)诒碇锌吹降挠涗浀捻樞蚱鋵?shí)記錄插入的順序,不是存儲(chǔ)順序)。所以說(shuō),一個(gè)表只能有一個(gè)聚集索引,但可以有多個(gè)非聚集索引。當(dāng)表建立了主鍵約束,如果表中沒(méi)創(chuàng)建索引,SQL會(huì)自動(dòng)在主鍵字段建立聚集索引。
? 索引的創(chuàng)建(先建立聚集索引,再建立非聚集索引):
create [unique(唯一)] [clustered(聚集索引) |nonclustered(非聚集索引)] index 索引名 on 表名 (字段名[,...])
索引的查看:exec sp_helpindex 表名
索引的刪除:drop index 表名.索引名[,...]
? 注意:該命令不能刪除由主鍵約束或唯一鍵創(chuàng)建的索引,這些索引必須通過(guò)刪除主鍵約束或唯一鍵約束,由系統(tǒng)自動(dòng)刪除。
? ? ? 觸發(fā)器(DML觸發(fā)器):
創(chuàng)建:
create trigger 觸發(fā)器名
on ? {表名|視圖}
[with encryption]
{for|after|instead of} {[insert][,][update][,][delete]}
as
條件判斷語(yǔ)句
SQL語(yǔ)句
解釋:for|after 是同一個(gè)意思,表示先對(duì)表或視圖執(zhí)行添、刪、改等操作,然后再執(zhí)行條件判斷語(yǔ)句,再執(zhí)行SQL語(yǔ)句。
而instead of 則是先執(zhí)行條件判斷語(yǔ)句,再對(duì)表或視圖執(zhí)行添、刪、改等操作,而不用執(zhí)行SQL語(yǔ)句。
? 查看觸發(fā)器的定義信息: exec ? sp_helptext ?觸發(fā)器名,當(dāng)然加密的不能看到
? 觸發(fā)器的修改:其實(shí)就是用原來(lái)的名字,換用alter命令就可以了?
? 觸發(fā)器的刪除:drop trigger ?觸發(fā)器名
下面來(lái)介紹下SQL中常用的函數(shù):
? 聚合函數(shù):
avg([distinct]表達(dá)式) ? ?求平均值
sum([distinct]表達(dá)式) ? ?求和
max([distinct]表達(dá)式) ? ?求最大值
min([distinct]表達(dá)式) ? ? 求最小值
count?([distinct]表達(dá)式|*) ? ? ? ? ? 求個(gè)數(shù)
? 注意點(diǎn):解決count distinct多個(gè)字段的方法:
Distinct的作用是用于從指定集合中消除重復(fù)的元組,經(jīng)常和count搭檔工作,語(yǔ)法如下
COUNT( { [ ALL | DISTINCT ] expression ] | * } )
這時(shí),可能會(huì)碰到如下情況,你想統(tǒng)計(jì)同時(shí)有多列字段重復(fù)的數(shù)目,你可能會(huì)立馬想到如下方法:
select count( distinct col1 , col2 , col3 , .......) from table
但是,這樣是不允許的,因?yàn)閏ount是不能統(tǒng)計(jì)多個(gè)字段的,雖然distinct是可行的。
有種比較直接的方法就是把消除重復(fù)后在統(tǒng)計(jì)查詢:
select count(*) from (select distinct col1 ,col2 , col3 from table)A
? ? ?日期時(shí)間函數(shù):
getdate() ? ? ? 返回服務(wù)器的當(dāng)前系統(tǒng)日期和時(shí)間
datediff(日期元素,日期1,日期2) ? ? ? 返回兩個(gè)日期間的差值并轉(zhuǎn)換為指定日期元素的形式
year(日期) ? ? ? ? ?返回年份(整數(shù))
month(日期) ? ? ? ?返回月份(整數(shù))
day(日期) ? ? ? ? ? 返回日(整數(shù))
getutcdate() ? ? ?返回表示當(dāng)前UTC時(shí)間的日期值
?
日期元素及其縮寫(xiě)和取值范圍
? ? ? ? ?日期元素 ? ? ? ? ? ? ? ? ? ? ? ?縮寫(xiě) ? ? ? ? ? ? ? ? ? ? ? ? ? 取值
?year yy 0~9999
? month mm 1~12
? day dd 1~31
day ?of ?year dy ?? 1~366
?week ?wk 0~52
weekday ?dw 1~7
? hour ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? hh 0~23
minute ? ? ? ? ? ? ? ? ? ? ? ? ? ? mi 0~59
?
轉(zhuǎn)載于:https://www.cnblogs.com/lipengsheng-javaweb/p/4006086.html
總結(jié)
以上是生活随笔為你收集整理的sql sever 2008基础知识的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 初始化CSS
- 下一篇: GIMP中的新建Layer与更改Laye