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