SQL數(shù)據(jù)操作基礎(chǔ)(初級(jí)) 2
發(fā)布時(shí)間:2008-09-17 閱讀數(shù): 次 來源:網(wǎng)樂原科技
使用ISQL執(zhí)行SELECT查詢
當(dāng)你安裝SQL Sever時(shí),你同時(shí)安裝了一個(gè)叫作ISQL/w的應(yīng)用程序。ISQL/w允許你執(zhí)行交互的SQL查詢。在把查詢包括到你的ASP網(wǎng)頁中之前,用ISQL/w對(duì)其進(jìn)行測(cè)試是非常有用的。
注意:
在這本書的第一部份,你學(xué)習(xí)了怎樣安裝和配置Microsoft SQL Sever 。如果沒有安裝SQL Sever或者SQL Sever不能運(yùn)行,請(qǐng)參閱第三章“安裝和使用SQL Sever”。
選擇任務(wù)上SQL Sever程序組中的ISQL_w以啟動(dòng)該程序。程序啟動(dòng)時(shí),首先會(huì)出現(xiàn)一個(gè)對(duì)話框,要求輸入服務(wù)器信息和登錄信息(見圖10.1)。在Sever框中,輸入你的SQL服務(wù)器的名字。如果服務(wù)器正運(yùn)行在本地計(jì)算機(jī)上,服務(wù)器名字就是你計(jì)算機(jī)的名字。在登錄信息框中,輸入一個(gè)登錄帳號(hào)和密碼或選擇使用“可信連接”,然后單擊Connect按鈕。
注意:
如果你將SQL Sever配置為使用完整安全或混合安全,那么你可以使用可信連接。如果你使用標(biāo)準(zhǔn)安全,你則需要提供用戶帳號(hào)和密碼。要了解更多信息,參見第三章。
如果一切正常,在你單擊連接按鈕后會(huì)出現(xiàn)一個(gè)查詢窗口,如圖10.2所示。(如果有異常,請(qǐng)參考第三章)
在執(zhí)行查詢之前,你需要選擇數(shù)據(jù)庫。安裝 SQL Sever時(shí)你已為自己創(chuàng)建了一個(gè)數(shù)據(jù)庫,SQL Sever還有許多系統(tǒng)數(shù)據(jù)庫,如master,model,msdb,和tempdb。
方便的是,SQL Sever帶有一個(gè)特殊的名為pubs的例子數(shù)據(jù)庫。庫 pubs中包含供一個(gè)虛擬的出版商使用的各個(gè)表。文檔中所有的例子程序都是針對(duì)這個(gè)庫來設(shè)計(jì)的。本書中的許多例子也使用這個(gè)數(shù)據(jù)庫。
在查詢窗口頂部的DB下拉框中選擇數(shù)據(jù)庫pubs,這樣你就選擇了數(shù)據(jù)庫。你所有的查詢都將針對(duì)這個(gè)庫中的各個(gè)表來執(zhí)行?,F(xiàn)在你可以執(zhí)行你的第一個(gè)查詢了。這真讓人興奮!
你的第一個(gè)查詢將針對(duì)一個(gè)名為autrors的表,表中包含所有為某個(gè)虛擬出版商工作的作者的相關(guān)數(shù)據(jù)。單擊查詢窗口并輸入以下的語句:
SELECT phone FROM authors WHERE au_name="Ringer"
輸入完成后,單擊執(zhí)行查詢按鈕(一個(gè)綠色三角形,看起來像VCR播放鍵)。單擊此按鈕后,任何出現(xiàn)在查詢窗口中的語句均會(huì)被執(zhí)行。查詢窗口會(huì)自動(dòng)變成結(jié)果顯示窗口,你可以看到查詢的結(jié)果(見圖10.3)。
你看到的查詢結(jié)果也許與圖10.3所示的不同。在SQL Sever的不同版本中,庫pubs中的數(shù)據(jù)會(huì)有所不同。對(duì)SQL Sever 6.5來說,將會(huì)找到兩條記錄。結(jié)果顯示窗口中應(yīng)顯示如下內(nèi)容:
phone
……………….
801 826_0752
801 826_0752
(2 row(s) affected)
你所執(zhí)行的SELECT語句從表authors中取出所有名字為Ringer的作者的電話號(hào)碼。你通過在WHERE子句中使用特殊的選擇條件來限制查詢的結(jié)果。你也可以忽略選擇條件,從表中取出所有作者的電話號(hào)碼。要做到這一點(diǎn),單擊Query標(biāo)簽,返回到查詢窗口,輸入以下的SELECT語句:
SELECT Phone FROM authors
這個(gè)查詢執(zhí)行后,會(huì)取出表authors中的所有電話號(hào)碼(沒有特定的順序)。如果表authors中包含一百個(gè)電話號(hào)碼,會(huì)有一百個(gè)記錄被取出,如果表中有十億個(gè)電話號(hào)碼,這十億條記錄都會(huì)被取出(這也許需要一些時(shí)間)。
表authrs的字段包括姓,名字,電話號(hào)碼,地址,城市,州和郵政編碼。通過在SELECT語句的第一部份指定它們,你可以從表中取出任何一個(gè)字段。你可以在一個(gè)SELECT語句中一次取出多個(gè)字段,比如:
SELECT au_fname ,au_lname, phone FROM authors
這個(gè)SELECT語句執(zhí)行后,將取出這三個(gè)列的所有值。下面是這個(gè)查詢的結(jié)果的一個(gè)示例(為了節(jié)省紙張,只顯示查詢結(jié)果的一部分,其余記錄用省略號(hào)代替):
au_fname au_lname phone
………………………………………………………………………….
Johnson White 408 496_7223
Marjorie Green 415 986_7020
Cheryl Carson 415 548_7723
Michael O’Leary 408 286_2428
…
(23 row(s) affected)
在SELECT語句中,你需要列出多少個(gè)字段,你就可以列出多少。不要忘了把字段名用逗號(hào)隔開。你也可以用星號(hào)(*)從一個(gè)表中取出所有的字段。這里有一個(gè)使用星號(hào)的例子:
SELECT * FROM authors
這個(gè)SELECT語句執(zhí)行后,表中的所有字段的值都被取出。你會(huì)發(fā)現(xiàn)你將在SQL查詢中頻繁使用星號(hào)。
技巧:
你可以使用星號(hào)來查看一個(gè)表的所有列的名字。要做到這一點(diǎn),只需要在執(zhí)行完SELECT語句后看一下查詢結(jié)果的列標(biāo)題。
操作多個(gè)表
到現(xiàn)在為止,你只嘗試了用一句SQL查詢從一個(gè)表中取出數(shù)據(jù)。你也可以用一個(gè)SELECT語句同時(shí)從多個(gè)表中取出數(shù)據(jù),只需在SELECT語句的FROM從句中列出要從中取出數(shù)據(jù)的表名稱即可:
SELECT au_lname ,title FROM authors, titles
這個(gè)SELECT語句執(zhí)行時(shí),同時(shí)從表authors和表titles中取出數(shù)據(jù)。從表authors中取出所有的作者名字,從表titles中取出所有的書名。在ISQL/w程序中執(zhí)行這個(gè)查詢,看一下查詢結(jié)果。你會(huì)發(fā)現(xiàn)一些奇怪的出乎意料的情況:作者的名字并沒有和它們所著的書相匹配,而是出現(xiàn)了作者名字和書名的所有可能的組合,這也許不是你所希望見到的。
出了什么差錯(cuò)?問題在于你沒有指明這兩個(gè)表之間的關(guān)系。你沒有通過任何方式告訴SQL如何把表和表關(guān)聯(lián)在一起。由于不知道如何關(guān)聯(lián)兩個(gè)表,服務(wù)器只能簡(jiǎn)單地返回取自兩個(gè)表中的記錄的所有可能組合。
要從兩個(gè)表中選出有意義的記錄組合,你需要通過建立兩表中字段的關(guān)系來關(guān)聯(lián)兩個(gè)表。要做到這一點(diǎn)的途徑之一是創(chuàng)建第三個(gè)表,專門用來描述另外兩個(gè)表的字段之間的關(guān)系。
表authors有一個(gè)名為au_id的字段,包含有每個(gè)作者的唯一標(biāo)識(shí)。表titles有一個(gè)名為title_id的字段,包含每個(gè)書名的唯一標(biāo)識(shí)。如果你能在字段au_id和字段title_id 之間建立一個(gè)關(guān)系,你就可以關(guān)聯(lián)這兩個(gè)表。數(shù)據(jù)庫pubs中有一個(gè)名為titleauthor的表,正是用來完成這個(gè)工作。表中的每個(gè)記錄包括兩個(gè)字段,用來把表titles和表authors關(guān)聯(lián)在一起。下面的SELECT語句使用了這三個(gè)表以得到正確的結(jié)果:
SELECT au_name,title FROM authors,titles,titleauthor
WHERE authors.au_id=titleauthor.au_id
AND titles.title_id=titleauthor.title_id
當(dāng)這個(gè)SELECT語句執(zhí)行時(shí),每個(gè)作者都將與正確的書名相匹配。表titleauthor指明了表authors和表titles的關(guān)系,它通過包含分別來自兩個(gè)表的各一個(gè)字段實(shí)現(xiàn)這一點(diǎn)。第三個(gè)表的唯一目的是在另外兩個(gè)表的字段之間建立關(guān)系。它本身不包含任何附加數(shù)據(jù)。
注意在這個(gè)例子中字段名是如何書寫的。為了區(qū)別表authors和表titles中相同的字段名au_id,每個(gè)字段名前面都加上了表名前綴和一個(gè)句號(hào)。名為author.au_id 的字段屬于表authors,名為titleauthor.au_id的字段屬于表titleauthor,兩者不會(huì)混淆。
通過使用第三個(gè)表,你可以在兩個(gè)表的字段之間建立各種類型的關(guān)系。例如,一個(gè)作者也許寫了許多不同的書,或者一本書也許由許多不同的作者共同完成。當(dāng)兩個(gè)表的字段之間有這種“多對(duì)多”的關(guān)系時(shí),你需要使用第三個(gè)表來指明這種關(guān)系。
但是,在許多情況下,兩個(gè)表之間的關(guān)系并不復(fù)雜。比如你需要指明表titles和表publishers之間的關(guān)系。因?yàn)橐粋€(gè)書名不可能與多個(gè)出版商相匹配,你不需要通過第三個(gè)表來指明這兩個(gè)表之間的關(guān)系。要指明表titles和表publishers之間的關(guān)系,你只要讓這兩個(gè)表有一個(gè)公共的字段就可以了。在數(shù)據(jù)庫pubs中,表titles和表publishers都有一個(gè)名為pub_id的字段。如果你想得到書名及其出版商的一個(gè)列表,你可以使用如下的語句:
SELECT title,pub_name FROM titles,publishers
WHERE titles.pub_id=publishers.pub_id
當(dāng)然,如果一本書是由兩個(gè)出版商聯(lián)合出版的,那么你需要第三個(gè)表來代表這種關(guān)系。
通常,當(dāng)你予先知道兩個(gè)表的字段間存在“多對(duì)多”關(guān)系時(shí),就使用第三個(gè)表來關(guān)聯(lián)這兩個(gè)表。反之,如果兩個(gè)表的字段間只有“一對(duì)一”或“一對(duì)多”關(guān)系,你可以使用公共字段來關(guān)聯(lián)它門。