SQL語句入門到進(jìn)階_第1頁
SQL語句入門到進(jìn)階_第2頁
SQL語句入門到進(jìn)階_第3頁
SQL語句入門到進(jìn)階_第4頁
SQL語句入門到進(jìn)階_第5頁
已閱讀5頁,還剩35頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡介

1、sql指令select是用來做什么的呢?一個(gè)最常用的方式是將資料從數(shù)據(jù)庫中的表格內(nèi)選出。從這一句回答中,我們馬上可以看到兩個(gè)關(guān)鍵字: 從 (from) 數(shù)據(jù)庫中的表格內(nèi)選出 (select)。(表格是一個(gè)數(shù)據(jù)庫內(nèi)的結(jié)構(gòu),它的目的是儲(chǔ)存資料。在表格處理這一部分中,我們會(huì)提到如何使用 sql 來設(shè)定表格。) 我們由這里可以看到最基本的 sql 架構(gòu): select 欄位名 from 表格名 我們用以下的例子來看看實(shí)際上是怎么用的。假設(shè)我們有以下這個(gè)表格: store_name sales date los angeles $1500 jan-05-1999 san diego $250 jan-0

2、7-1999 los angeles $300 jan-08-1999 boston $700 jan-08-1999 若要選出所有的店名 (store_name),我們就打入: select store_name from store_information 結(jié)果:store_namelos angelessan diegolos angelesboston我們一次可以讀取好幾個(gè)欄位,也可以同時(shí)由好幾個(gè)表格中選資料。 簡單的sql查詢只包括選擇列表、from子句和where子句。它們分別說明所查詢列、查詢的表或視圖、以及搜索條件等。1、選擇所有列例如,下面語句顯示testtable表中所有列

3、的數(shù)據(jù): 代碼:select * from testtable2、選擇部分列并指定它們的顯示次序查詢結(jié)果集合中數(shù)據(jù)的排列順序與選擇列表中所指定的列名排列順序相同。例如: 代碼:select nickname,email from testtable3、更改列標(biāo)題在選擇列表中,可重新指定列標(biāo)題。定義格式為:列標(biāo)題=列名如果指定的列標(biāo)題不是標(biāo)準(zhǔn)的標(biāo)識(shí)符格式時(shí),應(yīng)使用引號(hào)定界符,例如,下列語句使用漢字顯示列標(biāo)題: 代碼:select 昵稱=nickname,電子郵件=emailfrom testtable 4、刪除重復(fù)行select語句中使用all或distinct選項(xiàng)來顯示表中符合條件的所有行或刪

4、除其中重復(fù)的數(shù)據(jù)行,默認(rèn)為all。使用distinct選項(xiàng)時(shí),對于所有重復(fù)的數(shù)據(jù)行在select返回的結(jié)果集合中只保留一行。5、限制返回的行數(shù)使用top n percent選項(xiàng)限制返回的數(shù)據(jù)行數(shù),top n說明返回n行,而top n percent時(shí),說明n是表示一百分?jǐn)?shù),指定返回的行數(shù)等于總行數(shù)的百分之幾。例如: 代碼:select top 2 * from testtable 代碼:select top 20 percent * from testtabledistinctselect 指令讓我們能夠讀取表格中一個(gè)或數(shù)個(gè)欄位的所有資料。這將把所有的資料都抓出,無論資料值有無重復(fù)。在資料處理

5、中,我們會(huì)經(jīng)常碰到需要找出表格內(nèi)的不同資料值的情況。換句話說,我們需要知道這個(gè)表格/欄位內(nèi)有哪些不同的值,而每個(gè)值出現(xiàn)的次數(shù)并不重要。這要如何達(dá)成呢?在 sql 中,這是很容易做到的。我們只要在 select 后加上一個(gè) distinct 就可以了。distinct 的語法如下: select distinct 欄位名 from 表格名 舉例來說,若要在以下的表格,store_information,找出所有不同的店名時(shí), store_information 表格store_name sales date los angeles $1500 jan-05-1999 san diego $250

6、 jan-07-1999 los angeles $300 jan-08-1999 boston $700 jan-08-1999 我們就鍵入,select distinct store_name from store_information結(jié)果: store_name los angeles san diego boston where我們并不一定每一次都要將表格內(nèi)的資料都完全抓出。在許多時(shí)候,我們會(huì)需要選擇性地抓資料。就我們的例子來說,我們可能只要抓出營業(yè)額超過 $1,000 的資料。要做到這一點(diǎn),我們就需要用到 where 這個(gè)指令。這個(gè)指令的語法如下:select 欄位名 from 表

7、格名 where 條件 比較運(yùn)算符(大小比較):、=、=、=、!、!=例:返回96年1月的定單 select orderid, customerid, orderdate from orders where orderdate#1/1/96# and orderdate#1/30/96# 注意: mcirosoft jet sql 中,日期用#定界。日期也可以用datevalue()函數(shù)來代替。在比較字符型的數(shù)據(jù)時(shí),要加上單引號(hào),尾空格在比較中被忽略。 例: where orderdate#96-1-1# 也可以表示為: where orderdatedatevalue(1/1/96)若我們要

8、由以下的表格抓出營業(yè)額超過 $1,000 的資料, store_information 表格store_name sales date los angeles $1500 jan-05-1999 san diego $250 jan-07-1999 los angeles $300 jan-08-1999 boston $700 jan-08-1999 我們就鍵入,select store_name from store_information where sales 1000 結(jié)果: store_name los angeles and or在上一頁中,我們看到 where 指令可以被用來由

9、表格中有條件地選取資料。 這個(gè)條件可能是簡單的 (像上一頁的例子),也可能是復(fù)雜的。復(fù)雜條件是由二或多個(gè)簡單條件透過 and 或是 or 的連接而成。一個(gè) sql 語句中可以有無限多個(gè)簡單條件的存在。 復(fù)雜條件的語法如下: select 欄位名 from 表格名 where 簡單條件 and|or 簡單條件+ + 代表之內(nèi)的情況會(huì)發(fā)生一或多次。在這里的意思就是 and 加簡單條件及 or 加簡單條件的情況可以發(fā)生一或多次。另外,我們可以用 () 來代表?xiàng)l件的先后次序。 舉例來說,我們?nèi)粢?store_information 表格中選出所有 sales 高于 $1,000 或是 sales 在

10、 $500 及 $275 之間的資料的話, store_information 表格store_name sales date los angeles $1500 jan-05-1999 san diego $250 jan-07-1999 san francisco $300 jan-08-1999 boston $700 jan-08-1999我們就鍵入,select store_name from store_information where sales 1000 or (sales 275) 結(jié)果: store_name los angeles san francisco in在 s

11、ql 中,在兩個(gè)情況下會(huì)用到 in 這個(gè)指令;這一頁將介紹其中之一:與 where 有關(guān)的那一個(gè)情況。在這個(gè)用法下,我們事先已知道至少一個(gè)我們需要的值,而我們將這些知道的值都放入 in 這個(gè)子句。 in 指令的語法為下: select 欄位名 from 表格名 where 欄位名 in (值一, 值二, .) 在括號(hào)內(nèi)可以有一或多個(gè)值,而不同值之間由逗點(diǎn)分開。值可以是數(shù)目或是文字。若在括號(hào)內(nèi)只有一個(gè)值,那這個(gè)子句就等于 where 欄位名 = 值一 舉例來說,若我們要在 store_information 表格中找出所有含蓋 los angeles 或 san diego 的資料, store

12、_information 表格store_name sales date los angeles $1500 jan-05-1999 san diego $250 jan-07-1999 san francisco $300 jan-08-1999 boston $700 jan-08-1999 我們就鍵入,select * from store_information where store_name in (los angeles, san diego) 結(jié)果: store_name sales date los angeles $1500 jan-05-1999 san diego $2

13、50 jan-07-1999 betweenin 這個(gè)指令可以讓我們依照一或數(shù)個(gè)不連續(xù) (discrete) 的值的限制之內(nèi)抓出資料庫中的值,而 between 則是讓我們可以運(yùn)用一個(gè)范圍 (range) 內(nèi)抓出資料庫中的值。between 這個(gè)子句的語法如下: select 欄位名 from 表格名 where 欄位名 between 值一 and 值二 這將選出欄位值包含在值一及值二之間的每一筆資料。 舉例來說,若我們要由 store_information 表格中找出所有介于 january 6, 1999 及 january 10, 1999 中的資料, store_informati

14、on 表格store_name sales date los angeles $1500 jan-05-1999 san diego $250 jan-07-1999 san francisco $300 jan-08-1999 boston $700 jan-08-1999 我們就鍵入,select * from store_information where date between jan-06-1999 and jan-10-1999請讀者注意:在不同的數(shù)據(jù)庫中,日期的儲(chǔ)存法可能會(huì)有所不同。在這里我們選擇了其中一種儲(chǔ)存法。 結(jié)果: store_name sales date san d

15、iego $250 jan-07-1999 san francisco $300 jan-08-1999 boston $700 jan-08-1999 likelike 是另一個(gè)在 where 子句中會(huì)用到的指令?;旧?, like 能讓我們依據(jù)一個(gè)模式 (pattern) 來找出我們要的資料。相對來說,在運(yùn)用 in 的時(shí)候,我們完全地知道我們需要的條件;在運(yùn)用 between 的時(shí)候,我們則是列出一個(gè)范圍。 like 的語法如下: select 欄位名 from 表格名 where 欄位名 like 模式 like運(yùn)算符里使用的通配符 通配符 含義 ? 任何一個(gè)單一的字符 * 任意長度的字

16、符 # 09之間的單一數(shù)字 字符列表 在字符列表里的任一值 !字符列表 不在字符列表里的任一值 - 指定字符范圍,兩邊的值分別為其上下限 模式 經(jīng)常包括野卡 (wildcard). 以下是幾個(gè)例子: a_z: 所有以 a 起頭,另一個(gè)任何值的字原,且以 z 為結(jié)尾的字符串。 abz 和 a2z 都符合這一個(gè)模式,而 akkz 并不符合 (因?yàn)樵?a 和 z 之間有兩個(gè)字原,而不是一個(gè)字原)。 abc%: 所有以 abc 起頭的字符串。舉例來說,abcd 和 abcabc 都符合這個(gè)模式。 %xyz: 所有以 xyz 結(jié)尾的字符串。舉例來說,wxyz 和 zzxyz 都符合這個(gè)模式。 %an%:

17、 所有含有 an這個(gè)模式的字符串。舉例來說, los angeles 和 san francisco 都符合這個(gè)模式。 我們將以上最后一個(gè)例子用在我們的 store_information 表格上: store_information 表格store_name sales date los angeles $1500 jan-05-1999 san diego $250 jan-07-1999 san francisco $300 jan-08-1999 boston $700 jan-08-1999 我們就鍵入,select * from store_information where st

18、ore_name like %an%結(jié)果: store_name sales date los angeles $1500 jan-05-1999 san francisco $300 jan-08-1999 san diego $250 jan-07-1999 oder by到目前為止,我們已學(xué)到如何藉由 select 及 where 這兩個(gè)指令將資料由表格中抓出。不過我們尚未提到這些資料要如何排列。這其實(shí)是一個(gè)很重要的問題。事實(shí)上,我們經(jīng)常需要能夠?qū)⒆コ龅馁Y料做一個(gè)有系統(tǒng)的顯示。這可能是由小往大 (ascending) 或是由大往小(descending)。在這種情況下,我們就可以運(yùn)用 o

19、der by 這個(gè)指令來達(dá)到我們的目的。 oder by 的語法如下: select 欄位名 from 表格名 where 條件oder by 欄位名 asc, desc 代表 where 子句不是一定需要的。不過,如果 where 子句存在的話,它是在 oder by 子句之前。 asc 代表結(jié)果會(huì)以由小往大的順序列出,而 desc 代表結(jié)果會(huì)以由大往小的順序列出。如果兩者皆沒有被寫出的話,那我們就會(huì)用 asc。 我們可以照好幾個(gè)不同的欄位來排順序。在這個(gè)情況下, oder by 子句的語法如下(假設(shè)有兩個(gè)欄位): oder by 欄位一 asc, desc, 欄位二 asc, desc 若

20、我們對這兩個(gè)欄位都選擇由小往大的話,那這個(gè)子句就會(huì)造成結(jié)果是依據(jù) 欄位一 由小往大排。若有好幾筆資料 欄位一 的值相等,那這幾筆資料就依據(jù) 欄位二 由小往大排。 舉例來說,若我們要依照 sales 欄位的由大往小列出 store_information 表格中的資料, store_information 表格store_name sales date los angeles $1500 jan-05-1999 san diego $250 jan-07-1999 san francisco $300 an-08-1999 boston $700 jan-08-1999 我們就鍵入,select

21、 store_name, sales, date from store_information oder by sales desc結(jié)果: store_name sales date los angeles $1500 jan-05-1999 boston $700 jan-08-1999 san francisco $300 jan-08-1999 san diego $250 jan-07-1999 在以上的例子中,我們用欄位名來指定排列順序的依據(jù)。除了欄位名外,我們也可以用欄位的順序 (依據(jù) sql 句中的順序)。在 select 后的第一個(gè)欄位為 1,第二個(gè)欄位為 2,以此類推。在上面

22、這個(gè)例子中,我們用以下這句 sql 可以達(dá)到完全一樣的效果: select store_name, sales, date from store_information oder by 2 desc 函數(shù)既然數(shù)據(jù)庫中有許多資料都是已數(shù)字的型態(tài)存在,一個(gè)很重要的用途就是要能夠?qū)@些數(shù)字做一些運(yùn)算,例如將它們總合起來,或是找出它們的平均值。sql 有提供一些這一類的函數(shù)。它們是: avg (平均) count (計(jì)數(shù)) max (最大值) min (最小值) sum (總合) var (方差) stdev (標(biāo)準(zhǔn)誤差) first (第一個(gè)值) last (最后一個(gè)值) 運(yùn)用函數(shù)的語法是: sel

23、ect 函數(shù)名(欄位名) from 表格名 舉例來說,若我們要由我們的范例表格中求出 sales 欄位的總合, store_information 表格store_name sales date los angeles $1500 jan-05-1999 san diego $250 jan-07-1999 los angeles $300 jan-08-1999 boston $700 jan-08-1999 我們就鍵入,select sum(sales) from store_information 結(jié)果: sum(sales) $2750 $2750 代表所有 sales 欄位的總合:

24、$1500 + $250 + $300 + $700. 除了函數(shù)的運(yùn)用外,sql 也可以做簡單的數(shù)學(xué)運(yùn)算,例如加(+)和減(-)。對于文字類的資料,sql 也有好幾個(gè)文字處理方面的函數(shù),例如文字相連 (concatenation),文字修整 (trim),以及子字符串 (substring)。不同的數(shù)據(jù)庫對這些函數(shù)有不同的語法,所以最好是參考您所用數(shù)據(jù)庫的信息,來確定在那個(gè)數(shù)據(jù)庫中,這些函數(shù)是如何被運(yùn)用的。 count在上一頁有提到, count 是函數(shù)之一。由于它的使用廣泛,我們在這里特別提出來討論?;旧?, count 讓我們能夠數(shù)出在表格中有多少筆資料被選出來。它的語法是: select

25、 count(欄位名) from 表格名 舉例來說,若我們要找出我們的范例表格中有幾筆 store_name 欄不是空白的資料時(shí), store_information 表格store_name sales date los angeles $1500 jan-05-1999 san diego $250 jan-07-1999 los angeles $300 jan-08-1999 boston $700 jan-08-1999 我們就鍵入,select count(store_name) from store_information where store_name is not null

26、 結(jié)果: count(store_name) 4 is not null 是 這個(gè)欄位不是空白 的意思。 count 和 distinct 經(jīng)常被合起來使用,目的是找出表格中有多少筆不同的資料 (至于這些資料實(shí)際上是什么并不重要)。舉例來說,如果我們要找出我們的表格中有多少個(gè)不同的 store_name,我們就鍵入, select count(distinct store_name) from store_information 結(jié)果: count(distinct store_name) 3 group by我們現(xiàn)在回到函數(shù)上。記得我們用 sum 這個(gè)指令來算出所有的 sales (營業(yè)額)

27、吧!如果我們的需求變成是要算出每一間店 (store_name) 的營業(yè)額 (sales),那怎么辦呢?在這個(gè)情況下,我們要做到兩件事:第一,我們對于 store_name 及 sales 這兩個(gè)欄位都要選出。第二,我們需要確認(rèn)所有的 sales 都要依照各個(gè) store_name 來分開算。這個(gè)語法為: select 欄位1, sum(欄位2) from 表格名 group by 欄位1 在我們的范例上, store_information 表格store_name sales date los angeles $1500 jan-05-1999 san diego $250 jan-07-

28、1999 los angeles $300 jan-08-1999 boston $700 jan-08-1999 我們就鍵入,select store_name, sum(sales) from store_information group by store_name 結(jié)果: store_name sum(sales) los angeles $1800 san diego $250 boston $700 當(dāng)我們選不只一個(gè)欄位,且其中至少一個(gè)欄位有包含函數(shù)的運(yùn)用時(shí),我們就需要用到 group by 這個(gè)指令。在這個(gè)情況下,我們需要確定我們有 group by 所有其他的欄位。換句話說,除

29、了有包括函數(shù)的欄位外,我們都需要將其放在 group by 的子句中。 having那我們?nèi)绾螌瘮?shù)產(chǎn)生的值來設(shè)定條件呢?舉例來說,我們可能只需要知道哪些店的營業(yè)額有超過 $1,500。在這個(gè)情況下,我們不能使用 where 的指令。那要怎么辦呢?很幸運(yùn)地,sql 有提供一個(gè) having 的指令,而我們就可以用這個(gè)指令來達(dá)到這個(gè)目標(biāo)。 having 子句通常是在一個(gè) sql 句子的最后。一個(gè)含有 having 子句的 sql 并不一定要包含 group by 子句。having 的語法如下: select 欄位1, sum(欄位2) from 表格名 group by 欄位1 having

30、(函數(shù)條件) 請讀者注意: 如果被 select 的只有函數(shù)欄, 那就不需要 group by 子句。 在我們 store_information 表格這個(gè)例子中, store_information 表格store_name sales date los angeles $1500 jan-05-1999 san diego $250 jan-07-1999 los angeles $300 jan-08-1999 boston $700 jan-08-1999 若我們要找出 sales 大于 $1,500 的 store_name,我們就鍵入,select store_name, sum(

31、sales) from store_information group by store_namehaving sum(sales) 1500 結(jié)果: store_name sum(sales) los angeles $1800 alias接下來,我們討論 alias (別名) 在 sql 上的用處。最常用到的別名有兩種:欄位別名及表格別名。 簡單地來說,欄位別名的目的是為了讓 sql 產(chǎn)生的結(jié)果易讀。在之前的例子中,每當(dāng)我們有營業(yè)額總合時(shí),欄位名都是 sum(sales)。雖然在這個(gè)情況下沒有什么問題,可是如果這個(gè)欄位不是一個(gè)簡單的總合,而是一個(gè)復(fù)雜的計(jì)算,那欄位名就沒有這么易懂了。若我們

32、用欄位別名的話,就可以確認(rèn)結(jié)果中的欄位名是簡單易懂的。 第二種別名是表格別名。要給一個(gè)表格取一個(gè)別名,只要在 from 子句中的表格名后空一格,然后再列出要用的表格別名就可以了。這在我們要用 sql 由數(shù)個(gè)不同的表格中獲取資料時(shí)是很方便的。這一點(diǎn)我們在之后談到連接 (join) 時(shí)會(huì)看到。 我們先來看一下欄位別名和表格別名的語法: select 表格別名.欄位1 欄位別名 from 表格名 表格別名 或者:select 表格名 as 表格別名基本上,這兩種別名都是放在它們要替代的物件后面,而它們中間由一個(gè)空白分開。我們繼續(xù)使用 store_information 這個(gè)表格來做例子: store

33、_information 表格store_name sales date los angeles $1500 jan-05-1999 san diego $250 jan-07-1999 los angeles $300 jan-08-1999 boston $700 jan-08-1999 我們用跟 sql group by 那一頁一樣的例子。這里的不同處是我們加上了欄位別名以及表格別名: select a1.store_name store, sum(a1.sales) total sales from store_information a1group by a1.store_name

34、結(jié)果: store total sales los angeles $1800 san diego $250 boston $700 在結(jié)果中,資料本身沒有不同。不同的是欄位的標(biāo)題。這是運(yùn)用欄位別名的結(jié)果。在第二個(gè)欄位上,原本我們的標(biāo)題是 sum(sales),而現(xiàn)在我們有一個(gè)很清楚的 total sales。很明顯地, total sales 能夠比 sum(sales) 更精確地闡述這個(gè)欄位的含意。用表格別名的好處在這里并沒有顯現(xiàn)出來,不過這在 下一頁就會(huì)很清楚了。 表格鏈接現(xiàn)在我們介紹連接(join)的概念。要了解連接,我們需要用到許多我們之前已介紹過的指令。我們先假設(shè)我們有以下的兩個(gè)表

35、格, store_information 表格store_name sales date los angeles $1500 jan-05-1999 san diego $250 jan-07-1999 los angeles $300 jan-08-1999 boston $700 jan-08-1999 geography 表格 region_name store_name east boston east new york west los angeles west san diego 而我們要知道每一區(qū) (region_name) 的營業(yè)額 (sales)。 geography 這個(gè)表

36、格告訴我們每一區(qū)有哪些店,而 store_information 告訴我們每一個(gè)店的營業(yè)額。若我們要知道每一區(qū)的營業(yè)額,我們需要將這兩個(gè)不同表格中的資料串聯(lián)起來。當(dāng)我們仔細(xì)了解這兩個(gè)表格后,我們會(huì)發(fā)現(xiàn)它們可經(jīng)由一個(gè)相同的欄位,store_name,連接起來。我們先將 sql 句列出,之后再討論每一個(gè)子句的意義: select a1.region_name region, sum(a2.sales) sales from geography a1, store_information a2 where a1.store_name = a2.store_name group by a1.regio

37、n_name 結(jié)果: region sales east $700 west $2050 在第一行中,我們告訴 sql 去選出兩個(gè)欄位:第一個(gè)欄位是 geography 表格中的 region_name 欄位 (我們?nèi)×艘粋€(gè)別名叫做 region);第二個(gè)欄位是 store_information 表格中的 sales 欄位 (別名為 sales)。請注意在這里我們有用到表格別名:geography 表格的別名是 a1,store_information 表格的別名是 a2。若我們沒有用表格別名的話,第一行就會(huì)變成 select geography.region_name region, su

38、m(store_information.sales) sales 很明顯地,這就復(fù)雜多了。在這里我們可以看到表格別名的功用:它能讓 sql 句容易被了解,尤其是這個(gè) sql 句含蓋好幾個(gè)不同的表格時(shí)。 接下來我們看第三行,就是 where 子句。這是我們闡述連接條件的地方。在這里,我們要確認(rèn) geography 表格中 store_name 欄位的值與 store_information 表格中 store_name 欄位的值是相等的。這個(gè) where 子句是一個(gè)連接的靈魂人物,因?yàn)樗慕巧谴_定兩個(gè)表格之間的連接是正確的。如果 where 子句是錯(cuò)誤的,我們就極可能得到一個(gè)笛卡兒連接 (ca

39、rtesian join)。笛卡兒連接會(huì)造成我們得到所有兩個(gè)表格每兩行之間所有可能的組合。在這個(gè)例子中,笛卡兒連接會(huì)讓我們得到 4 x 4 = 16 行的結(jié)果。 外部鏈接之前我們看到的左連接 (left join),又稱內(nèi)部連接 (inner join)。在這個(gè)情況下,要兩個(gè)表格內(nèi)都有同樣的值,那一筆資料才會(huì)被選出。那如果我們想要列出一個(gè)表格中每一筆的資料,無論它的值在另一個(gè)表格中有沒有出現(xiàn),那該怎么辦呢?在這個(gè)時(shí)候,我們就需要用到 sql outer join (外部連接) 的指令。 外部連接的語法是依數(shù)據(jù)庫的不同而有所不同的。舉例來說,在 oracle 上,我們會(huì)在 where 子句中要選

40、出所有資料的那個(gè)表格之后加上一個(gè) (+) 來代表說這個(gè)表格中的所有資料我們都要。 假設(shè)我們有以下的兩個(gè)表格: store_information 表格store_name sales date los angeles $1500 jan-05-1999 san diego $250 jan-07-1999 los angeles $300 jan-08-1999 boston $700 jan-08-1999 geography 表格 region_name store_name east boston east new york west los angeles west san diego

41、 我們需要知道每一間店的營業(yè)額。如果我們用一個(gè)普通的連接,我們將會(huì)漏失掉 new york這個(gè)店,因?yàn)樗⒉淮嬖谟?store_information 這個(gè)表格。所以,在這個(gè)情況下,我們需要用外部連接來串聯(lián)這兩個(gè)表格: select a1.store_name, sum(a2.sales) sales from georgraphy a1, store_information a2 where a1.store_name = a2.store_name (+) group by a1.store_name 我們在這里是使用了 oracle 的外部連接語法。 結(jié)果: store_name sal

42、es boston $700 new york los angeles $1800 san diego $250 請注意: 當(dāng)?shù)诙€(gè)表格沒有相對的資料時(shí), sql 會(huì)傳回 null 值。在這一個(gè)例子中, new york 并不存在于 store_information 表格,所以它的 sales 欄位是 null. concatenate有的時(shí)候,我們有需要將由不同欄位獲得的資料串連在一起。每一種數(shù)據(jù)庫都有提供方法來達(dá)到這個(gè)目的: mysql: concat() oracle: concat(), | sql server: + concat() 的語法如下: concat(字符串1, 字符串

43、2, 字符串3, .): 將字符串1、字符串2、字符串3,等字符串連在一起。請注意,oracle的concat()只允許兩個(gè)參數(shù);換言之,一次只能將兩個(gè)字符串串連起來。不過,在oracle中,我們可以用|來一次串連多個(gè)字符串。 來看一個(gè)例子。假設(shè)我們有以下的表格: geography 表格 region_namestore_nameeastbostoneastnew yorkwestlos angeleswestsan diego例子1: mysql/oracle: select concat(region_name,store_name) from geography where store

44、_name = boston; 結(jié)果: eastboston 例子2: oracle: select region_name | | store_name from geography where store_name = boston; 結(jié)果: east boston 例子3: sql server: select region_name + + store_name from geography where store_name = boston; 結(jié)果: east boston substringsql 中的 substring 函數(shù)是用來抓出一個(gè)欄位資料中的其中一部分。這個(gè)函數(shù)的名稱在

45、不同的數(shù)據(jù)庫中不完全一樣: mysql: substr(), substring() oracle: substr() sql server: substring() 最常用到的方式如下 (在這里我們用substr()為例): substr(str,pos): 由中,選出所有從第位置開始的字符。請注意,這個(gè)語法不適用于sql server上。 substr(str,pos,len): 由中的第位置開始,選出接下去的個(gè)字符。 假設(shè)我們有以下的表格: geography 表格 region_namestore_nameeastbostoneastnew yorkwestlos angeleswes

46、tsan diego例1: select substr(store_name, 3) from geography where store_name = los angeles; 結(jié)果: s angeles 例2: select substr(store_name,2,4) from geography where store_name = san diego; 結(jié)果: an d 進(jìn)階sql在這一部分,我們將介紹以下的 sql 概念及關(guān)鍵字: sql union sql union all sql intersect sql minus sql subquery sql exists sql

47、case 我們并介紹如何用 sql 來做出以下的運(yùn)算: 排名 (rank) 中位數(shù) (median) 累積總計(jì) (running total) 總合百分比 (percent to total) 累積總合百分比 (cumulative percent to total) unionunion 指令的目的是將兩個(gè) sql 語句的結(jié)果合并起來。從這個(gè)角度來看, union 跟 join 有些許類似,因?yàn)檫@兩個(gè)指令都可以由多個(gè)表格中擷取資料。 union 的一個(gè)限制是兩個(gè) sql 語句所產(chǎn)生的欄位需要是同樣的資料種類。另外,當(dāng)我們用 union 這個(gè)指令時(shí),我們只會(huì)看到不同的資料值 (類似 selec

48、t distinct)。 union 的語法如下: sql 語句 1unionsql 語句 2 假設(shè)我們有以下的兩個(gè)表格, store_information 表格 store_name sales date los angeles $1500 jan-05-1999 san diego $250 jan-07-1999 los angeles $300 jan-08-1999 boston $700 jan-08-1999internet_sales 表格 date sales jan-07-1999 $250 jan-10-1999 $535 jan-11-1999 $320 jan-12

49、-1999 $750而我們要找出來所有有營業(yè)額 (sales) 的日子。要達(dá)到這個(gè)目的,我們用以下的 sql 語句: select date from store_informationunionselect date from internet_sales 結(jié)果: date jan-05-1999 jan-07-1999 jan-08-1999 jan-10-1999 jan-11-1999 jan-12-1999 有一點(diǎn)值得注意的是,如果我們在任何一個(gè) sql 語句 (或是兩句都一起) 用 select distinct date 的話,那我們會(huì)得到完全一樣的結(jié)果。 union allun

50、ion all 這個(gè)指令的目的也是要將兩個(gè) sql 語句的結(jié)果合并在一起。 union all 和 union 不同之處在于 union all 會(huì)將每一筆符合條件的資料都列出來,無論資料值有無重復(fù)。 union all 的語法如下: sql 語句 1union allsql 語句 2 我們用和上一頁同樣的例子來顯示出 union all 和 union 的不同。同樣假設(shè)我們有以下兩個(gè)表格, store_information 表格 store_name sales date los angeles $1500 jan-05-1999 san diego $250 jan-07-1999 lo

51、s angeles $300 jan-08-1999 boston $700 jan-08-1999internet_sales 表格 date sales jan-07-1999 $250 jan-10-1999 $535 jan-11-1999 $320 jan-12-1999 $750而我們要找出有店面營業(yè)額以及網(wǎng)絡(luò)營業(yè)額的日子。要達(dá)到這個(gè)目的,我們用以下的 sql 語句: select date from store_informationunion allselect date from internet_sales 結(jié)果: date jan-05-1999 jan-07-1999 jan-08-1999 jan-08-1999 jan-07-1999 jan-10-1999 jan-11-1999 jan-12-1999 intersect 和 union 指令類似, intersect 也是對兩個(gè) sql 語句所產(chǎn)生的結(jié)果做處理的。不同的地方是, union 基本上是一個(gè) or (如果這個(gè)值存在于第一句或是第二句,它就會(huì)被選出),而 intersect 則比較像 and (這個(gè)值要存在于第一句和第二句才會(huì)被選出)。 union 是聯(lián)集,而

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

最新文檔

評論

0/150

提交評論