小男孩‘自慰网亚洲一区二区,亚洲一级在线播放毛片,亚洲中文字幕av每天更新,黄aⅴ永久免费无码,91成人午夜在线精品,色网站免费在线观看,亚洲欧洲wwwww在线观看

分享

SQL-更多新東西

 悟靜 2014-04-25

本文不是SQL教程,只是關(guān)于T-SQL的一點(diǎn)小結(jié)及吐槽。

對(duì)于SQL入門的學(xué)習(xí),推薦一本32開大小的小巧書目《SQL Server編程必知必會(huì)》,對(duì)于每個(gè)知識(shí)點(diǎn)介紹得很簡(jiǎn)單但很到位,如果你不想閱讀那些動(dòng)輒四五百頁的大作的話,這本書完全夠用。另外一本進(jìn)階的書目《The Art of SQL》很出名,那是我打算看的但還沒有看。

這里討論和所有例子都基于微軟對(duì)SQL的一個(gè)實(shí)現(xiàn)版本T-SQL。表是基于manage sutio自帶的Northwind數(shù)據(jù)庫(kù)。

對(duì)于初學(xué)者來說,只知道SQL不知道T-SQL,T-SQL是什么,感覺像方言。對(duì)頭,它就是個(gè)方言。

SQL的全稱是結(jié)構(gòu)化查詢語言Structured Query Language,專門設(shè)計(jì)來與數(shù)據(jù)進(jìn)行通信,就好比HTML被設(shè)計(jì)來展示網(wǎng)頁。它不是一種專利語言,不屬于哪個(gè)公司,好比你無法說出HTML是微軟的,還是IBM的。有專門的標(biāo)準(zhǔn)委員會(huì)來制定SQL語言的標(biāo)準(zhǔn)及對(duì)它進(jìn)行維護(hù)。而我們真正使用的,是各個(gè)數(shù)據(jù)庫(kù)管理軟件對(duì)它的一個(gè)實(shí)現(xiàn)。就是說SQL是標(biāo)準(zhǔn),其他人在遵守這一標(biāo)準(zhǔn)的前提下給出自己的一個(gè)實(shí)現(xiàn)版本。微軟的數(shù)據(jù)庫(kù)產(chǎn)品所實(shí)現(xiàn)的版本就叫Transact-SQL,簡(jiǎn)稱T-SQL,Oracle的是PL/SQL等。當(dāng)然,各個(gè)DBMS版本間會(huì)新增自己的一些特性,這也是為什么Oracle下寫的SQL腳本可能在SQL Server上不兼容的原因,但大部分語句都是可以在各平臺(tái)移植的。

SQL中的隨機(jī)

SQL中,大部分查詢都是通過SELECT語句返回,最熟悉的莫過于從一張表中進(jìn)行查詢返回結(jié)果,但其實(shí)還有一些返回是可以通過啟用函數(shù)的,比如GETDATE()。

GETDATE()方法返回當(dāng)前系統(tǒng)時(shí)間,準(zhǔn)確說是你的數(shù)據(jù)庫(kù)服務(wù)器的時(shí)間。如果有人問程序員What’s the time? 那我想《程序員裝逼指南》(如果有這本書的話)會(huì)告訴你,程序員才不會(huì)帶表或者看手機(jī)呢,他會(huì)優(yōu)雅地輸入SELECT GETDATE();

只是在單獨(dú)使用諸如GETDATE(),RAND()等函數(shù)時(shí)表忘了加上SELECT .

上面提到RAND()方法,它默認(rèn)生成的是0到1且后面拖了一長(zhǎng)串精度的浮點(diǎn)數(shù)。同時(shí)它也可以接收一個(gè)種子值,如果指定了種子值,居然每次產(chǎn)生的隨機(jī)數(shù)都是一樣的!真的是坑爹的隨機(jī)函數(shù).

但其實(shí)很多時(shí)候我們需要讓這個(gè)產(chǎn)生的隨機(jī)數(shù)更符合我們的需要一點(diǎn),比如只想要一個(gè)0到10之間的隨機(jī)數(shù),這時(shí)候可以聯(lián)想到CEILING()和FLOOR()這兩個(gè)函數(shù),前者返回大于等于給定參數(shù)的最小整數(shù),后者相反,返回小于等于給定參數(shù)的最大整數(shù)。有點(diǎn)繞口,比如CEILING(0.3),那么比0.3大的整數(shù)就是1,2,3….最小的是1,返回1.  而FLOOR(1.5)呢,對(duì)頭,返回1.

接著上面的思路,要返回0到10之間的一個(gè)隨機(jī)數(shù),我們需要做的就是把RAND()返回的數(shù)先乘以10,這樣返回的就是幾點(diǎn)幾的一個(gè)數(shù),再用CEILING()或者FLOOR()就可以只取到一個(gè)整數(shù)部分的數(shù)字。

 用CEILING()還是FLOOR(), 抑或兩者沒有區(qū)別。必需有區(qū)別,用CEILING()你永遠(yuǎn)得不到0這個(gè)數(shù),而且FLOOR()又永遠(yuǎn)得不到10這個(gè)數(shù)。

還有種方法就是使用字符串處理函數(shù)LEFT()或者RIGHT(),將RAND()返回的數(shù)同樣乘10后用LEFT()取左邊一位就是我們想要的了,RIGHT()同理。

想到這里,甚至可以用SUBSTRING(),它接收三個(gè)參數(shù),第一個(gè)是字符串,所以首先我們需要把RAND()返回的數(shù)通過CONVERT()轉(zhuǎn)成字符型,第二參數(shù)是要取的子字符串的開始位置,第三個(gè)參數(shù)為子字符串長(zhǎng)度。

除非你真的是閑的,否則沒有必需用這種方法來做,這里只是提供一種思路,說明科學(xué)的道路其實(shí)很寬闊的。

至于要返回1到100,10到100隨機(jī)數(shù)等的情況,相信通過各位碼農(nóng)的智慧也是完全可能的了,這里就不贅述鳥。

SQL主要功能不是返回?cái)?shù)字,更多是返回表中的行。同樣,也可以實(shí)現(xiàn)從表中返回隨機(jī)抽取的數(shù)據(jù)行。

通過NEWID()這個(gè)方法用如下語句輕松實(shí)現(xiàn)。

NEWID()是個(gè)什么樣的函數(shù),可以實(shí)驗(yàn)一把來看看:

返回一串字符類似于GUID,唯一的標(biāo)識(shí)。每次運(yùn)行返回的都是一個(gè)不同的值。在上面的例子中,從ORDERS表中取三條數(shù)據(jù),數(shù)據(jù)是通過NEWID()產(chǎn)生的值到表中取到的,當(dāng)然就是隨機(jī)的了。

其實(shí),SQL SERVER有個(gè)專門從大量數(shù)據(jù)中返回隨機(jī)樣本的函數(shù)TABLESAMPLE(),通過參數(shù)可以指定返回多少條隨機(jī)樣本數(shù)據(jù)或者百分之幾的數(shù)據(jù):

但詭異的是,居然提示語法錯(cuò)誤。這有點(diǎn)讓人摸不著北。后來發(fā)現(xiàn),TABLESAMPLE() 是SQL SERVER 2005 新增的內(nèi)容,而Northwind數(shù)據(jù)庫(kù)又是2005版本以前自帶的一個(gè)樣本數(shù)據(jù)庫(kù),所以它只能兼容級(jí)別為80,也就是說在這個(gè)數(shù)據(jù)庫(kù)上能執(zhí)行2000或更老的SQL SERVER所以支持的命令但無法執(zhí)行更新的命令。像SQL SERVER 2005之后的版本中都用Adventureworks數(shù)據(jù)庫(kù)代替了Northwind的。于是轉(zhuǎn)到Adventureworks數(shù)據(jù)庫(kù)進(jìn)行嘗試。

 

果然是兼容性的問題,那么能不能在老版本SQL SERVER中創(chuàng)建的數(shù)據(jù)庫(kù)上執(zhí)行呢,其實(shí)還是可以的,只要把數(shù)據(jù)庫(kù)的兼容性改到更高即可:

需要說明的是TABLESAMPLE()每次返回的結(jié)果數(shù)目是不一樣的,在給定的參數(shù)上下跳動(dòng),所以如果表本身的數(shù)據(jù)量很小的話,比如只有兩三百條,使用此命令一行結(jié)果也沒有返回是很正常的。

日期與時(shí)間

GETDATE()可以方便地獲得時(shí)間日期,DATEPART()則會(huì)返回指定的日期的某部分,比如只想要一條完事日期信息中的月分,星期等:

但我們看到返回的星期其實(shí)不夠人性化,貼心的顯示應(yīng)該是星期幾而不是本周的第幾天,這時(shí)就可以用DATENAME()了,它返回的是日期的名字。

其實(shí)更人性化一點(diǎn)的顯示應(yīng)該是這樣的,如果在中國(guó),應(yīng)該返回星期一,十月!

運(yùn)行Sp_helplanguage可以看到SQL SERVER中保存了各種語言對(duì)日期時(shí)間的顯示設(shè)置。當(dāng)然中文的習(xí)慣稱呼也可以在里面找到。

再看我們數(shù)據(jù)庫(kù)當(dāng)前的語言環(huán)境:

當(dāng)前語言環(huán)境是英語,所以返回的是英文的日期相關(guān)名稱,那思路應(yīng)該就是把默認(rèn)語言環(huán)境改成中文。

可以看到,現(xiàn)在系統(tǒng)默認(rèn)語言已經(jīng)設(shè)置成了簡(jiǎn)體中文,NOW,就是見證奇跡的時(shí)刻。

繁體中文:

  一個(gè)有意思的事情是,讓你看一下日語情況下的所有星期:

是不是很有意思,華夏博大精深的五行在日本那里成了星期。如果我不是這么晚研究SQL這么入神,我也不知道今天是火什么日。

對(duì)于上面所執(zhí)行的語句,我不得不多說幾句,首先行1設(shè)置系統(tǒng)默認(rèn)語言為日本兒語,行2行3定義了兩個(gè)變量一個(gè)保存當(dāng)前日期,另一個(gè)用作下面循環(huán)輸出星期時(shí)的計(jì)數(shù)器,在對(duì)這兩個(gè)變量進(jìn)行初始化時(shí)有個(gè)技巧,一般是用SET來進(jìn)行變量初始化,但一次只能初始化一個(gè),而SELECT語句里可以初始化多個(gè)變量。以前我甚至不知道SELECT可以進(jìn)行變量初始化??!行6開始循環(huán)函數(shù),每輸出一次后把日期加一天并且計(jì)數(shù)器加一,這里日期加一天又用了個(gè)默默無聞的函數(shù)DATEADD(),你可以指定一個(gè)數(shù)加到一個(gè)日期上的哪部分,這里是加一天。

還有個(gè)常見的問題就是,很多時(shí)候我們只希望返回日期中的時(shí)間,或者日期中的日期不帶時(shí)間。

實(shí)現(xiàn)的方法很多,但基本上都是先把日期轉(zhuǎn)換成字符后操作。對(duì)于字符你就可以用LEFT()或者RIGHT()抑或者SUBSTR()來取一個(gè)日期數(shù)據(jù)中的任何部分了。

對(duì)于實(shí)現(xiàn)這個(gè)功能,一個(gè)印度阿三給出了如下的解法:

注意,上面那樣需要SQL SERVER 2008及以上。

無可否認(rèn),印度阿三的實(shí)力就是那樣讓人肅然起敬。如果你很不幸的干上了程序員這一行,終有一天你會(huì)感嘆既生我,何生印度阿三。

其實(shí)對(duì)于一個(gè)日期中想取天,月等,有直接的函數(shù)可用:

其實(shí)這三個(gè)函數(shù)就是DATEPART()的簡(jiǎn)化而以,因?yàn)槟阃耆梢杂肈ATEPART()來完成。

只是DATEPART()更靈活,能取到的部分更多。

根據(jù)筆劃排序

如果你注意到了SQL SERVER里面有個(gè)collation屬性的話,這個(gè)功能實(shí)現(xiàn)起來不那么難。并且對(duì)于中文環(huán)境的開發(fā)者來說,這樣的功能可能會(huì)時(shí)不時(shí)的碰到。

右擊任何一個(gè)數(shù)據(jù)庫(kù),查看其屬性,你會(huì)發(fā)現(xiàn)在選項(xiàng)里可以看到collation這個(gè)屬性并且可以進(jìn)行設(shè)置。

 

Collation所規(guī)定的就是一種字符集的排序規(guī)則。這個(gè)東西通常是被很多開發(fā)人員忽略而不知的。在這里所以設(shè)定的值會(huì)應(yīng)用到所選數(shù)據(jù)庫(kù)的默認(rèn)排序規(guī)則上。通常對(duì)于一種語言比如中文,不止一種規(guī)則,通過點(diǎn)開下拉列表你可以看到里面分得很細(xì),包括簡(jiǎn)體繁體,香港大陸臺(tái)灣新加坡等,其中帶’stroke’就是涉及筆劃的。

除了通過上面的屬性窗口可以了解到collation外,還可以通過SELECT * FROM   Fn_helpcollations(); 查看數(shù)據(jù)庫(kù)服務(wù)器所支持的字符集。

如你看到的這個(gè)Chinese_PRC_CS_AI_WS,前面CHINESES_PRC(中國(guó)大陸)當(dāng)然是指國(guó)家地區(qū)了,而后面跟的后綴,也有其基體的含義,可以從SQL Server的幫助文檔中了解到,這里不說開了。正是后面這些后綴對(duì)排序起了很大的作用。

如果你只是臨時(shí)想在檢索結(jié)果中對(duì)列以筆劃排序,可以在SELECT語句后通過COLLATE指定相應(yīng)的collation(為了演示臨時(shí)建了個(gè)表并插入了中文數(shù)據(jù)):

在我的映像中筆劃順序貌似是橫豎撇捺折,這里看來我碰到了點(diǎn)認(rèn)知上的疑惑。

同樣,你在列表中可以看到帶‘pingyin’的,那就是以拼音排序。

以拼音排序的結(jié)果:

Soundex

我也是在想系統(tǒng)地學(xué)習(xí)一下SQL然后看了本兒書后才發(fā)現(xiàn)原來還有這么個(gè)神奇的函數(shù)。

SOUNDEX將字符轉(zhuǎn)換成表示其發(fā)音的字母與數(shù)字的組合,所以用它進(jìn)行字符串的匹配是基于字符串的讀音而不是字符本身,夠強(qiáng)大吧。其實(shí)SOUNDEX并不屬于SQL里的概念,但T-SQL提供了對(duì)它的支持。下面來做個(gè)實(shí)驗(yàn)。

在Categories表中CategoryName最后列有個(gè)seafood,我在其后面添加了四列,按照英語音標(biāo)習(xí)慣這些讀音都和seafood差不多,看是否能通過soundex把它們檢索出來。

執(zhí)行下面的名句后及結(jié)果如圖:

可以看到,檢索出了3行新增用來實(shí)驗(yàn)的數(shù)據(jù),效果還是非常令人滿意的。

從這里似乎可以窺見到語音搜索的端倪了:當(dāng)你點(diǎn)擊谷歌搜索框旁邊的話筒,它把你的聲音編碼成文本返回服務(wù)器然后通過上面類似的方法進(jìn)行數(shù)據(jù)檢索。這就是語音搜索。

當(dāng)然,這只是一種猜想,具體算法當(dāng)然要復(fù)雜得多。只是從這里可以看出,任何你需要的一個(gè)小功能都可以從一些不起眼但已經(jīng)存在的函數(shù)上來做文章。還有前面提到的漢字排序問題,如果你不知道這些知識(shí)點(diǎn),面對(duì)一些需要真的就無從下手。

保存特殊類型(img/mp3)

基本上我們?cè)赟QL SERVER中碰到和操作的都是文本,數(shù)字等類型的數(shù)據(jù),但圖片也是經(jīng)常要面對(duì)的一種文件類型,比如我們需要保存用戶的頭像。

對(duì)于圖片,可以保存在數(shù)據(jù)庫(kù),那就是保存它們的文本編碼形式,而不是文件本身。比如用戶上傳了一張圖片,其實(shí)從前端傳送到服務(wù)器的過程中也是以文本編碼的形式,SQL SERVER也確實(shí)提供了image這種格式來方便保存圖片到數(shù)據(jù)庫(kù)。

另外一種方案就是保存路徑。比如前端用戶上傳了圖片,服務(wù)器指定圖片保存到某個(gè)文件夾下,并且對(duì)圖片進(jìn)行一個(gè)統(tǒng)一有序的命名,然后將這個(gè)圖片的路徑和重命名后的信息可在到數(shù)據(jù)庫(kù)表中,以后使用是通過查找相應(yīng)的表獲得路徑及文件名,然后去調(diào)用真正的文件。

不說說第二種方案是更加合理的,試想誰也不可能把mp3甚至視頻文件編碼保存到數(shù)據(jù)庫(kù)表中的一列,那是怎樣的一個(gè)表!

不算格式化的格式化

對(duì)檢索出的結(jié)果一般是時(shí)間日期金錢等需要進(jìn)行一些格式化操作以符合閱讀習(xí)慣。這里不打算講開了。

一般,搜索出的id我們習(xí)慣要加上編號(hào)方便閱讀,比如XXXX號(hào),No.XXX ,但你如果嘗試通過這樣的語句直接加上想要顯示的字符串時(shí):

會(huì)出錯(cuò),OrderId不是字符串,一個(gè)不是字符串的元素想跟一個(gè)字符串連接當(dāng)然會(huì)出錯(cuò),需要將不是字符串的OrderId轉(zhuǎn)換成字符串后方可進(jìn)行上述操作。剛好有個(gè)STR()可以用來完成需要。

但STR()也不是一個(gè)長(zhǎng)久之計(jì),因?yàn)榕龅饺掌跁r(shí),它就無法轉(zhuǎn)換了。日期還需要轉(zhuǎn)換嘛,興許你會(huì)認(rèn)為日期本來就是字符串了,那我們可以先看一下:

所以以日期不是字符串,日期是一種專門的格式??粗褡址浴_@就叫長(zhǎng)得像也是錯(cuò)。

對(duì)于日期我們可以使用比較萬能的CONVERT()來進(jìn)行轉(zhuǎn)換。

或者你會(huì)問,在SQL里加字符串整理好我們需要的數(shù)據(jù)沒必需,完全可以在應(yīng)用程序中格式化,怎么加都行,但SQL是專門設(shè)計(jì)來處理數(shù)據(jù)的,它對(duì)這些操作的執(zhí)行效率非常高,如果你一開始就把數(shù)據(jù)整理好再送到應(yīng)用程序便可直接使用,將會(huì)使你的程序性能有較大提高(這也是SQL必知必會(huì)一書中的觀點(diǎn)).

聚合函數(shù)用在多列

你可以猜想一下 SELECT SUM(c1*c2) 的結(jié)果是什么?;蛘吣氵€沒有這樣的概念,SUM就是對(duì)一列的數(shù)據(jù)進(jìn)行求和嘛。AVG()也是對(duì)于一列求平均。但其實(shí)聚合函數(shù)是可以用在多列上的。

就比如上面的SELECT SUM(c1*c2),先是把c1列和c2列對(duì)應(yīng)的每行相乘,最后再把每行的乘積相加。

請(qǐng)看下面這個(gè)測(cè)試用列:

關(guān)于自增列

對(duì)于自增列,我們知道一般用來當(dāng)表的主鍵,并且它的值被指定為按給定的種子值自動(dòng)遞增下去,在你向表中插入一行數(shù)據(jù)后,它自動(dòng)增加,確定的說它會(huì)去找還沒有被使用的數(shù)中最小的數(shù)來做為自己的值。但是我們對(duì)表中數(shù)據(jù)進(jìn)行了刪除某行的操作后,比如我們有5條數(shù)據(jù),有一列ID它的值是從1到5由SQL SERVER生成的,我們執(zhí)行delete將ID為5的行刪除,但我們?cè)俅尾迦霐?shù)據(jù)時(shí),ID是6而不會(huì)是5. 雖然5已經(jīng)被刪了但5已經(jīng)被使用過了,所以新插入的行不再取5而從5后面一個(gè)開始。

那我非要接著之前的序號(hào)開始插入行呢,答案是不行的。曾經(jīng)我也思考過這個(gè)問題,相信很多人開始也尋求過這個(gè)問題的答案,都無功而返。

后來想了一下把問題想通了,這樣的設(shè)計(jì)是很合理的。 接著上面的情境,假如我們刪除了ID為2的行呢,如果僅僅為了保持ID這個(gè)序號(hào)值的連續(xù)性,那2后面所有行都要自動(dòng)將自己的ID減一,然后我們插入的數(shù)據(jù)呢再接著最后一行的ID(現(xiàn)在變?yōu)?)插入。那可以想象,這是個(gè)多么耗費(fèi)資源而又沒有任何意義的事情。變更了一行就要變更所有行,如果數(shù)據(jù)量大,那我們僅僅是做一個(gè)插入操作就要等半天。更不用說在高訪問量的服務(wù)器上怎么辦了。

HAVING or WHERE

HAVING or WHERE:其實(shí)這兩個(gè)關(guān)鍵字的功能是一樣的,甚至語法也完全一樣,唯一不同的是前者對(duì)分組進(jìn)行過濾。后者對(duì)行進(jìn)行過濾,也是我們用得最多的,似乎忽略了HAVING的存在。何時(shí)用HAVING,當(dāng)你需要在分組內(nèi)進(jìn)行過濾時(shí)就需要它,因?yàn)閃HERE其實(shí)是沒有分組的概念的。

究其根本,WHERE 是先過濾,再分組,HAVING先分組,再過濾。

結(jié)果集中重復(fù)的行

UNION完成多條WHERE語句相同的功能,結(jié)果集都已經(jīng)自動(dòng)去除了重復(fù)的行,如果需要返回全部的行,需要使用UNION ALLl 。

對(duì)于上面這句話,我們一點(diǎn)點(diǎn)來看。

比如對(duì)于Orders表,先看一下里面有什么:

現(xiàn)在我們想返回Orderid=10249的那條數(shù)據(jù)和所有OrderId小于 10252的數(shù)據(jù)。

很明顯可以用兩條帶WHERE的語句來完成。

通過UNION可以把上面兩條獨(dú)立的SELECT語句組合起來,但組合前請(qǐng)先注意一下,上面一個(gè)返回了1行數(shù)據(jù),另一個(gè)返回了4行數(shù)據(jù)。

組合后返回了相同的數(shù)據(jù),只是OrderId為10249那行因?yàn)橹貜?fù)被自動(dòng)去除了。如果確實(shí)需要保留完整的查詢結(jié)果不希望去掉重復(fù)行,可以用UNION ALL, 此時(shí)為原汁原味的把兩個(gè)SELECT語句返回的結(jié)果相連接,真的是1加1等于二。

注意到我在后面一條SELECT語句使用了ORDER BY,看似它是屬于第二條SELECT 語句的,只對(duì)第二條語句檢索出來的結(jié)果進(jìn)行排序,其實(shí)不是,它對(duì)連接后的整體進(jìn)行排序。

如果你使用WHERE,則無法做到保留重復(fù)行。

用選擇的結(jié)果來填充

用CREATE TALBE 創(chuàng)建一張表后,為了插入數(shù)據(jù),你不得不寫一大堆SQL語句。當(dāng)然,除了這種手動(dòng)寫INSERT 語句來填充表的情況外,還有更加便捷的方式,可以把另一張表的數(shù)據(jù)全部或者有選擇地返回然后填充到新表。當(dāng)然,前提是兩張表的結(jié)構(gòu)要一樣,不然相應(yīng)字段對(duì)應(yīng)不上如何填充。

下面拿NorthWind中的Region表為列,我們新建一張結(jié)構(gòu)跟他一樣的表,并插入一些數(shù)據(jù)先。

但先看一下Region表是個(gè)什么情況先:

之所以選它就是因?yàn)楹?jiǎn)單,除了一個(gè)自增的主鍵列,只包含一列數(shù)據(jù)格式為文本的列。

下面我們就用這張RegionNew表中的數(shù)據(jù)來填充原來的Region表,確切地說是往Region表中再插入一些數(shù)據(jù)。先看INSERT INTO語句。

 但如你所見,出錯(cuò)了。原因是原來的Region表中的RegionDescription列允許空值,而我們新建的表中有一行的對(duì)應(yīng)列為空值。這就是前面提到的,兩張表的結(jié)構(gòu)必需要一致才能進(jìn)行這樣的導(dǎo)入操作,這里的一致不是說表名列名完全一樣,列名其實(shí)可以不一樣,只順序?qū)Φ木托?,一致是指兩張表列?shù)相同并且相應(yīng)列保存的數(shù)據(jù)類型要一致。

把RegionNew表中的NULL改后再執(zhí)行一下,如果如下 :

數(shù)據(jù)已經(jīng)插入了。在新建RegionNew這張表時(shí),你也看到了我并沒有讓ID列自動(dòng)從1開始,而是通過SET IDENTITY_INSERT語句來讓我可以手動(dòng)編寫ID列的值。不那樣的話RegionNew表中的ID列就會(huì)是1,2,3,這將會(huì)在你進(jìn)行導(dǎo)入到Region表時(shí)發(fā)生沖突,因?yàn)檫@些數(shù)字已經(jīng)在Region中使用過了。

INSERT SELECT是用一張表填充另一張表,派生出一個(gè)SELECT的變種語法SELECT INTO. 使用此語句時(shí)目標(biāo)表可以不存在,INTO后只需指定一個(gè)表名,系統(tǒng)會(huì)自動(dòng)創(chuàng)建,當(dāng)然,也可以跟一張已經(jīng)存在的表,已經(jīng)存在的表同樣需要滿足相應(yīng)列的要求。

現(xiàn)在把更新后的Region表選擇出來導(dǎo)入到一張新表中,在進(jìn)行這個(gè)操作前這張表并不存在。

執(zhí)行完上述語句后在數(shù)據(jù)庫(kù)中新建了一張名為Mew的喵星表,并且擁有了Region表的全部數(shù)據(jù)。同時(shí)你可以加上WHERE等過濾語句來選擇性地導(dǎo)入數(shù)據(jù):

再發(fā)散一下,你還可以在SELECT時(shí)指定多張其他表這樣就可以從多個(gè)不同來源把數(shù)據(jù)匯總到一張表上,這個(gè)功能確實(shí)是很贊的。在你需要一些臨時(shí)表備份表進(jìn)行分析時(shí)非常有用。

到這里,你可以把SELECT INTO理解為導(dǎo)出,而INSERT SELECT 視為一種導(dǎo)出操作。

重命名表

系統(tǒng)提供了一個(gè)存儲(chǔ)過程來實(shí)現(xiàn)對(duì)表重命名 EXEC SP_RENAME ‘oldtablename’,’newtablename’; 重命名還不簡(jiǎn)單嘛,直接點(diǎn)擊表就可以了,但命令是用在編程當(dāng)中的,所以在寫SQL腳本時(shí)會(huì)非常有用。

    本站是提供個(gè)人知識(shí)管理的網(wǎng)絡(luò)存儲(chǔ)空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點(diǎn)。請(qǐng)注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購(gòu)買等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊一鍵舉報(bào)。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評(píng)論

    發(fā)表

    請(qǐng)遵守用戶 評(píng)論公約

    類似文章 更多