現在我們介紹連線(join)的概念。要了解連線,我們需要用到許多我們之前已介紹過的指令。 我們先假設我們有以下的兩個**,
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
而我們要知道每一區 (region_name) 的營業額 (sales)。geography這個**告訴我們每一區有哪些店,而store_information告訴我們每乙個店的營業額。 若我們要知道每一區的營業額,我們需要將這兩個不同**中的資料串聯起來。當我們仔細了解這兩個 **後,我們會發現它們可經由乙個相同的字段,store_name,連線起來。我們先將 sql 句列出, 之後再討論每乙個子句的意義:
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.region_name
結果:
region
sales
east
$700
west
$2050
在第一行中,我們告訴 sql 去選出兩個字段:第乙個欄位是geography**中的 region_name 字段 (我們取了乙個別名叫做 region);第二個欄位是store_information**中的 sales 字段 (別名為 sales)。請注意在這裡我們有用到**別名:geography**的別名是 a1,store_information**的別名是 a2。若我們沒有用**別名的話, 第一行就會變成
select geography.region_name region, sum(store_information.sales) sales
很明顯地,這就複雜多了。在這裡我們可以看到**別名的功用:它能讓 sql 句容易被了解,尤其是這個 sql 句含蓋好幾個不同的**時。
接下來我們看第三行,就是where子句。 這是我們闡述連線條件的地方。在這裡,我們要確認geography**中 store_name 欄位的值與store_information**中 store_name 欄位的值是相等的。這個where子句是乙個連線的靈魂人物,因為它的角色是確定兩個**之間的連線是正確的。如果where子句是錯誤的,我們就極可能得到乙個笛卡兒連線 (cartesian join)。笛卡兒連線會造成我們得到所有兩個**每兩行之間所有可能的組合。在這個例子中,笛卡兒連線會讓我們得到 4 x 4 = 16 行的結果。
之前我們看到的左連線 (left join),又稱內部連線 (inner join)。在這個情況下,要兩個**內都有同樣的值,那一筆資料才會被選出。那如果我們想要列出乙個**中每一筆的資料,無論它的值在另乙個**中有沒有出現,那該怎麼辦呢?在這個時候,我們就需要用到sql outer join(外部連線) 的指令。
外部連線的語法是依資料庫的不同而有所不同的。舉例來說,在 oracle 上,我們會在 where 子句中要選出所有資料的那個**之後加上乙個 "(+)" 來代表說這個**中的所有資料我們都要。
假設我們有以下的兩個**:
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
我們需要知道每一間店的營業額。如果我們用乙個普通的連線,我們將會漏失掉 'new york'這個店,因為它並不存在於 store_information 這個**。所以,在這個情況下,我們需要用外部連線來串聯這兩個**:
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 的外部連線語法。
結果:
store_name
sales
boston
$700
new york
los angeles
$1800
san diego
$250
請注意: 當第二個**沒有相對的資料時,sql 會傳回 null 值。在這乙個例子中, 'new york' 並不存在於 store_information **,所以它的 "sales" 欄位是 null。
】【列印】
連線資料庫執行sql指令
1.mysqli連線資料庫資料庫 首先建立資料庫 在物件導向的方式中,mysqli被封裝成乙個類,它的構造方法如下 construct string host string username string passwd string dbname int port string socket 在上述...
SQL常用指令
一 android插入方式 1.msqlitedatabase.execsql insertsql 如果insertsql裡面有雙引號單引號這些特殊字元會插入失敗 2.msqlitedatabase.execsql insertsql,mvalue 這種方式不會因為特殊字元而插入失敗 string ...
SQL指令 INTERSECT 交集
和union指令類似,intersect也是對兩個 sql 語句所產生的結果做處理的。不同的地方是,union基本上是乙個or 如果這個值存在於第一句或是第二句,它就會被選出 而intersect則比較像and 這個值要存在於第一句和第二句才會被選出 union是聯集,而intersect是交集。i...