這一篇文章要總結的是用得最多的聯接查詢即外聯接查詢,外聯接查詢相對於交叉聯接和內聯接來說要更複雜一些,我準備從以下幾個方面對外聯接進行總結。
1,什麼是外聯接查詢
2,乙個外聯接查詢的例子
3,關於外聯接查詢的總結
外聯接除了有內聯接的兩個邏輯處理步驟(即笛卡爾積和on過濾)之外,還多加乙個外聯接特有的第三步:新增外部行。
在外聯接中,需要將乙個表標記為保留表,在兩個表之間用left outer join連線(outer是可選的),left關鍵字左邊表的行是保留的。外聯接的第三個邏輯查詢處理步驟就是要識別保留表中按照on條件在另乙個表中找不到與之匹配的那些行,然後將這些行新增到聯接的前兩個步驟生成的結果表中。對於來自聯接的非保留表的那些列,追加的外部行中的這些列則用null作為佔位符。
下面的例子查詢根據客戶的客戶id和訂單的客戶id對customers表和orders表進行聯接,並返回客戶和他們的訂單資訊。該聯接是使用的左外聯接,所以查詢結果會返回那些沒有發出任何訂單的客戶。
sql查詢**:
--left join外聯接查詢
select
customers.custid,customers.companyname,orders.orderid
from sales.customers as
customers
left
join sales.orders as orders on customers.custid = orders.custid;
查詢結果:
查詢共返回832行,但是,customers表中有兩個客戶沒有任何訂單,他們的id分別是22和57。從邏輯上來說,與這兩個客戶相關的資料行在聯接的第二步(基於on條件過濾)就被過濾掉了,而在第三步又把這些行作為外部行新增進來了。如果使用的內聯接,結果將不會返回這兩行。新增這兩行後,就可以在結果中保留左邊表的所有行。
對於外聯接查詢的總結,需要注意以下幾點:
從外聯接保留表的角度看,可以認為外聯接結果的資料行包括兩種:內部行和外部行。內部行是按照on子句的條件能在聯接的另一邊找到匹配的那些行;而外部行則是指找不到匹配的那些行。內聯接只返回內部行,而外聯接同時返回內部行和外部行。
使用外聯接的時候,經常會為到底是在查詢的on子句中,還是在where子句中指定聯接條件而困惑。現在的結論是,當需要表達乙個非最終的條件時(即這個條件只決定哪些行可以匹配非保留表),就在on子句中指定聯接條件;當在生成外部行後,要應用過濾器,並且希望過濾條件是最終的,就應該在where子句中指定條件。
當查詢null值時,應該使用is null運算子,而不是直接使用等號,因為等號會把任何值與null進行比較時,總是會返因unknown---即使對兩個null值進行比較也是這樣。
選擇聯接的非保留表中的哪個列作為過濾器也很重要。應該選擇只在外部行才取值為null,而在其他行取值不為null的某個列。為此,有三種情形可以考慮安全地使用,主鍵列,聯接列,以及定義為not null的列。具體可以參考下面的查詢**。
selectcustomers.custid,customers.companyname,orders.orderid
from sales.customers as
customers
left
join sales.orders as orders on customers.custid =
orders.custid
where orders.orderid is
null
--使用主鍵列
--where orders.custid is null --使用聯接列
--where orders.orderdate is null -- 使用not null列
查詢結果:
外聯接小結
連環多表外聯接 select from circuit c,device d,resgroup g,portinfo p,devaddr a,device b,devaddr ba where c.circuitid cirid and c.changetype 0 or c.changetype ...
資料庫內聯接 左外聯接 右外聯接和全聯接
首先給出兩張表用於之後的舉例 stuno stuname gradeid 1001張三1 1002李四2 1003王五3 1004 西楚霸王 1000 gradeid grade 1一年級 2二年級 3三年級 4四年級 顯示結果為符合條件的多個表間的交集。例 select from grade g,...
第六節 內聯接查詢 外聯接查詢
view code 內聯接 where select s.sname as姓名,m.score 成績from students s,stumark m where s.id m.stuid 三表聯接查詢 select s.sname 姓名,m.score 成績,c.coursename 課程from...