多表查詢
多表連線的應用場景
結果集中的記錄保持在多張表中。
按正規化要求設計表結構
-- 第二正規化: 每個非主屬性必須完全依賴於主屬性
-- 第三正規化: 每個非主屬性不能依賴於另乙個非主屬性
多表連線的種類
根據結果集生成的規則不同,連線可以分為:
交叉連線(cross join)
內連線 (inner join)
外連線 (outer join)
交叉連線
假設table1表中有m條記錄,table2表中有n條記錄,交叉連線產生的結果集為m*n
該連線產生的結果集稱為笛卡爾積。
select tabname1.colname1,tabname2.colname2 from tabname1 cross join tabname2;
交叉連線
select a.real_name,a.id,s.account_id,s.unix_host,s.os_username from account a cross
join service s;
問題:哪些記錄有意義 ?
select a.real_name,a.id,s.account_id,s_unix_host,s.os_username from
account a cross join service s where a.id=s.account.id;
內連線:
語法如果有多個條件表示式,on關鍵字後面跟乙個,其餘用and條件連線。
select tabname1.colname1,tabname2.colname2 from tabname1 join tabname2
on tabname1.colname1 = tabname2.colname2 and tabname1.colname2 = val1;
專案案例:
列出申請了遠端登入業務的客戶姓名以及在unix伺服器上的開通資訊。
內連線原理 (一)
t1表和t2表做內連線,連線條件為on t1.c1 = t2.c2,假設t1表做驅動表,t2表做匹配表,記錄的匹配過程如下:
1.從t1表中讀取第一條記錄r1,若它的c1值為1 .
2.根據該值到t2表中查詢匹配的記錄,即需要遍歷t2表,從t2表中的第一條記錄開始,若該記錄(r1)的c2列的值等於1,我們就說這兩條記錄能夠匹配上,那麼t1的r1和t2的r1組合起來,作為結果集裡的一條記錄,否則檢查t2表中的下一條記錄。
3.安裝方法2依次將t2表中所有的記錄檢查一遍,只要匹配就放入結果集中
4.從t1表中讀取第二條記錄,依次重複步驟2和3,產生最終的結果集。
內連線原理 (二)
t1表和t2表做內連線,連線條件為 on t1.c1 = t2.c2,假設t1表做驅動表,t2表做匹配表,記錄的匹配有如下三種情況:
1.t1表中的某條記錄在t2表中找不到任何一條匹配的記錄,那麼t1表中的該記錄不會出現在結果集中
2.t1表中的某條記錄在t2表中只有一條匹配的記錄,那麼t1表中的該記錄和t2表中匹配的記錄組合成新記錄出現在結果集中。
3.t1表中的某條記錄在t2表中有多條匹配的記錄,那麼t1表中的該記錄會和t2表中的每一條匹配的記錄組合成新記錄出現在結果集中。
4.內連線的核心為任何一張表裡的記錄一定要在另一張表中找到匹配的記錄,否則不能出現在結果集中。
內連線原理 (三)
t1表和t2表做內連線
連線條件為 on t1.c1 = t2.c2 ,兩種方式都可以得到相同的結果集。
1. 一種t1表做驅動表 , t2表做匹配表
2. 另一種t2表做驅動表,t1表匹配表
3. 無論哪種方式最終得到的結果集都一樣,所不同的是效率
內連線的結果集
內連線結果集的結構
t1.col1 t1.col2 t1.col3 ... ... t2.col1 t2.col2 t2.col3
內連線語言的執行順序
先根據on和and條件對要連線的表進行過濾,將過濾後的結果集進行內連線操作(join,on),再根據select 語句的定義生成最終結果集 。
內連線中用on和where都可以
select tabname1.colname1,tabname2.colname2 from tabname1 join tabname2 on
tabname1.colname1 = tabname2.colname2 and tabname1.colname2 = val1;
資料庫多表查詢SQL語句
最近在做 進銷存業務系統 作為專案組成員的一部分,我負責統計查詢,簡單說就是多表查詢,網上有很多,但是很明確的卻沒有,所以讓我這個初學者了費,最終還是搞出來了,在這裡也和大家共享一下成果和其中出現的問題,高手可繞道,不求點讚,只為方便大家。下面開始 我一共建了4個表,分別是supplier purc...
sql資料庫多表查詢排序過濾
例 某商品在資料庫中有多種 方式,普通方式模糊搜尋會帶出該商品的多種 因此需要對商品按照 的優先順序進行處理。第一次操作是將商品查出,然後將商品迴圈,放入資料庫作對比進行查詢 依然是先查出商品,然後查出所有 方式,通過 steam 方法進行過濾,一樣可以實現該要求。因為懶得動所以沒做。我想要乙個sq...
多表查詢資料庫
在專案中建立資料庫的時候,我們經常會進行多表查詢。資料庫中建立乙個表應該與乙個實體類相對應。乙個實體物件應該與一條記錄相對應。資料庫是一種結構化的查詢語言,資料庫語言是非過程化的,寫一句就可以執行一句。進行建表的時候,如果是一對多的關係,應該在多的一方建立乙個字段。該字段為少的一方的id。進行建表的...