|
1.UNION操作符 union操作符用來(lái)合并兩個(gè)或多個(gè)select語(yǔ)句的結(jié)果,要注意union內(nèi)部的每個(gè)select語(yǔ)句必須擁有相同數(shù)量的列,而且列也必須擁有相似的數(shù)據(jù)類型和相同的列順序。下面是我的數(shù)據(jù)表的截圖一個(gè)小例子。
那現(xiàn)在對(duì)數(shù)據(jù)表進(jìn)行聯(lián)合操作,這里我們聯(lián)合這兩個(gè)表的bookName。 select bookName from myrank
union
select bookName from mybook;
從結(jié)果可以看出bookName這列顯示的是兩張表的聯(lián)合的數(shù)據(jù),而且你如果仔細(xì)看會(huì)發(fā)現(xiàn)其實(shí)應(yīng)該是有重復(fù)數(shù)據(jù)的,而結(jié)果沒(méi)有顯示說(shuō)明重復(fù)數(shù)據(jù)被過(guò)濾掉了。如果想顯示重復(fù)數(shù)據(jù)可在union后添加All關(guān)鍵字。 select bookName from myrank
union all
select bookName from mybook;
2.select into與insert into select操作符 通過(guò)select into語(yǔ)句我們可以將一個(gè)表的信息復(fù)制到另一個(gè)表中,新創(chuàng)建的表中的列名會(huì)和原來(lái)的表的列名一樣。 --將mybook表的數(shù)據(jù)復(fù)制到mybookcopy表中,mybookcopy表無(wú)需我們創(chuàng)建,執(zhí)行這條語(yǔ)句后會(huì)自動(dòng)創(chuàng)建mybookcopy表
select * into mybookcopy from mybook;
--復(fù)制多個(gè)表的列到新表中
select mybook.bookName,myuser.userName into newtable from mybook join myuser on mybook.userID=myuser.userId
insert into select語(yǔ)句則是從一個(gè)表中復(fù)制數(shù)據(jù)然后插入到另一個(gè)已存在的表中,目標(biāo)表中原有的行不會(huì)受到任何影響。 insert into myrank(userId) select userID from mybook
3.約束 約束用于規(guī)定表中的數(shù)據(jù)規(guī)則,如果存在違反約束的數(shù)據(jù)行為,行為將會(huì)被約束終止。在SQl中有以下六個(gè)約束: NOT NULL:這個(gè)應(yīng)該很熟悉,就是不能為空 UNIQUE:保證列的每行都必須有唯一的值 PRIMARY KEY:主鍵,可以理解為是not null和unique的結(jié)合,確保這個(gè)表的某列有唯一標(biāo)識(shí) FOREIGN KEY:外鍵,它標(biāo)識(shí)這個(gè)列是另外一個(gè)表的主鍵,用于保證這兩個(gè)表之間的參照完整性 CHECK:創(chuàng)建列中的值的范圍,保證列中的值符合指定的條件 DEFAULT:規(guī)定列的默認(rèn)值 接下來(lái)是這6大操作的sql語(yǔ)句,每條語(yǔ)句上都有它的解釋。 --創(chuàng)建表時(shí)在列的后面加上NOT NULL關(guān)鍵字則添加了非空的約束
create table mytable
(
myID int NOT NULL,
myName nvarchar(32) NOT NULL
)
--創(chuàng)建表時(shí)在列的后面加上UNIQUE關(guān)鍵字則添加了唯一的約束
create table mytable2
(
myID int NOT NULL UNIQUE,
myName nvarchar(32) NOT NULL
)
--當(dāng)表被創(chuàng)建好后,可以使用alter來(lái)新增唯一性約束
alter table mytable2 add constraint nameunique unique(myName)
--使用alter和drop來(lái)刪除唯一性約束
alter table mytable2 drop nameunique
--將mytable2刪除后重新創(chuàng)建,并設(shè)置myID為主鍵
create table mytable2
(
myID int NOT NULL,
myName nvarchar(32) NOT NULL,
constraint myprimary primary key(myID)
)
--而且在這個(gè)地方我還發(fā)現(xiàn)當(dāng)刪除數(shù)據(jù)表后,如果馬上新建名字和字段一樣的表會(huì)直接將剛剛刪除的表重新顯示,原有的數(shù)據(jù)還在,只是添加了主鍵
--刪除主鍵
alter table mytable2 drop myprimary
--新增主鍵
alter table mytable2 add constraint myprimary primary key(myID,myName)
--首先刪除上面mytable2的主鍵,創(chuàng)建mytable3,并設(shè)置myName為主鍵
create table mytable3
(
myName nvarchar(32) NOT NULL PRIMARY KEY,
age int NOT NULL
)
--然后設(shè)置mytable2的myName為外鍵,刪除方式和上面差不多,也是采用drop關(guān)鍵字
alter table mytable2 add constraint myforeign foreign key(myName) references mytable3(myName)
最后一個(gè)default約束我差不多搞了一上午才解決。本來(lái)我是按照菜鳥(niǎo)教程上寫(xiě)的,結(jié)果發(fā)現(xiàn)并不可以,百度到w3c又發(fā)現(xiàn)菜鳥(niǎo)其實(shí)是復(fù)制w3c的,而百度基本前兩頁(yè)頁(yè)又全是那些復(fù)制菜鳥(niǎo)或者根本沒(méi)有具體例子的。好了,首先是我要?jiǎng)h除default約束,前面我都是給約束起了名字的,刪除時(shí)可以直接刪除約束。在default約束這里我是直接在創(chuàng)建表時(shí)指定的,使用菜鳥(niǎo)上的drop default并不可以,最后知道如果我在創(chuàng)建表時(shí)就添加約束則會(huì)有一個(gè)默認(rèn)約束,數(shù)據(jù)庫(kù)系統(tǒng)會(huì)自動(dòng)給這個(gè)約束命名,可以使用下面的方法得到這個(gè)約束的名字: select c.name from sysconstraints a
inner join syscolumns b on a.colid=b.colid
inner join sysobjects c on a.constid=c.id
where a.id=object_id('mytable3')
and b.name='myName'
得到名字后再去刪除。第二個(gè)問(wèn)題是我要修改約束,最后在微軟官網(wǎng)上才知道原來(lái)如果要修改default約束,必須要先刪除已有的約束然后再設(shè)置新的約束。我不知道是不是版本問(wèn)題,菜鳥(niǎo)上是ALTER TABLE Persons ALTER COLUMN City DROP DEFAULT,但是在我的SQL 2008上并沒(méi)有什么用,最后看到一位前輩使用add才添加成功。 4.create index、auto increment和null操作 當(dāng)數(shù)據(jù)表的數(shù)據(jù)很多時(shí),我們可以利用索引在不讀取整個(gè)表的情況下更快地查找數(shù)據(jù)。我們可以在表中創(chuàng)建索引,它是看不到的,只能利用加速搜索/查詢。但是使用索引也有缺點(diǎn),更新一個(gè)包含索引的表比更新一個(gè)沒(méi)有索引的表花費(fèi)更多的時(shí)間,因?yàn)樗饕旧硪残枰隆S捎谒饕羞@個(gè)缺點(diǎn),因此一般較好的做法是僅僅在常常被搜索的列上使用索引。我在敲完教程上的索引后竟然發(fā)現(xiàn)沒(méi)有講如何使用索引,把教程上的例子敲完我會(huì)再去深入學(xué)習(xí)下索引。auto increment從名字可以看到是自增的意思,這樣可以保證在新記錄插入表中時(shí)生成一個(gè)唯一的數(shù)字。 --創(chuàng)建索引,可以使用重復(fù)的值 create index myIdindex on mytable3(myId); --創(chuàng)建不允許有重復(fù)值,一個(gè)索引只能對(duì)應(yīng)這唯一的一行 create unique index myuniqueIndex on mytable3(myId); --使用drop可以刪除索引、表、數(shù)據(jù)庫(kù)等 drop index myIdindex on mytable3; drop index mytable3.myuniqueIndex; --tip:如果我們需要清空表里的數(shù)據(jù)而不刪除表本身 truncate table myrank; --alter table可用于在已有的表中添加、刪除和修改列 alter table mybook add bookOther nvarchar(32); alter table mybook alter column bookOther nvarchar(64); alter table mybook drop column bookOther; --設(shè)置auto-increment主鍵字段,identity是設(shè)置主鍵的關(guān)鍵字,第一個(gè)1表示從1開(kāi)始,第二個(gè)1表示每條記錄遞增1 create table mytable4 ( myId int identity(1,1) primary key, myname nvarchar(16) ) null代表未知數(shù)據(jù),在sql里我們不能用“=”來(lái)判斷是否為null,必須使用is null和is not null來(lái)進(jìn)行判斷。另外有時(shí)候我們需要對(duì)某一列的數(shù)據(jù)進(jìn)行算術(shù)運(yùn)算,可是這個(gè)時(shí)候這列的某些數(shù)據(jù)還是null,這樣就無(wú)法完成操作。既然有這個(gè)需求那肯定是有解決方案的,sql里有一個(gè)isnull函數(shù),可將為null的某列的值設(shè)置一個(gè)默認(rèn)值。下面是sql語(yǔ)句: insert into mytable4 values('hh'); insert into mytable4 (myname) values (null); --查找為空的行和不為空的行 select * from mytable4 where myname is null; select * from mytable4 where myname is not null; --isnull()函數(shù),這樣如果某行的myname為null,則會(huì)輸出fyz select myId,ISNULL(myname,'fyz') as myaname from mytable4;
|
|
|