SQL指令 連線

2021-04-13 06:01:58 字數 3225 閱讀 4241

現在我們介紹連線(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...