當前位置:首頁 » 編程語言 » sql左連接和右連接執行順序
擴展閱讀
webinf下怎麼引入js 2023-08-31 21:54:13
堡壘機怎麼打開web 2023-08-31 21:54:11

sql左連接和右連接執行順序

發布時間: 2022-09-02 03:43:21

資料庫中的左連接和右連接的區別

1.意思不一樣。

左連接:只要左邊表中有記錄,數據就能檢索出來,而右邊有的記錄必要在左邊表中有的記錄才能被檢索出來。

右連接:右連接是只要右邊表中有記錄,數據就能檢索出來。

2.用法不一樣。

右連接與左連接相反,左連接A LEFT JOIN B,連接查詢的數據,在A中必須有,在B中可以有可以沒有。

3.空值不一樣。

左連接是已左邊表中的數據為基準,若左表有數據右表沒有數據,則顯示左表中的數據右表中的數據顯示為空。

資料庫是「按照數據結構來組織、存儲和管理數據的倉庫」。是一個長期存儲在計算機內的、有組織的、可共享的、統一管理的大量數據的集合。

定義:

資料庫是存放數據的倉庫。它的存儲空間很大,可以存放百萬條、千萬條、上億條數據。但是資料庫並不是隨意地將數據進行存放,是有一定的規則的,否則查詢的效率會很低。當今世界是一個充滿著數據的互聯網世界,充斥著大量的數據。

即這個互聯網世界就是數據世界。數據的來源有很多,比如出行記錄、消費記錄、瀏覽的網頁、發送的消息等等。除了文本類型的數據,圖像、音樂、聲音都是數據。

sql執行順序

查詢語句中select from where group by having order by的執行順序

1.查詢中用到的關鍵詞主要包含六個,並且他們的順序依次為 

select--from--where--group by--having--order by 

其中select和from是必須的,其他關鍵詞是可選的,這六個關鍵詞的執行順序 

與sql語句的書寫順序並不是一樣的,而是按照下面的順序來執行 

from--where--group by--having--select--order by, 

from:需要從哪個數據表檢索數據 

where:過濾表中數據的條件 

group by:如何將上面過濾出的數據分組 

having:對上面已經分組的數據進行過濾的條件  

select:查看結果集中的哪個列,或列的計算結果 

order by :按照什麼樣的順序來查看返回的數據

2.from後面的表關聯,是自右向左解析的 

而where條件的解析順序是自下而上的。 

也就是說,在寫SQL文的時候,盡量把數據量大的表放在最右邊來進行關聯, 

而把能篩選出大量數據的條件放在where語句的最下面。

SQL Select語句完整的 執行順序 【從DBMS使用者角度】:

1、from子句組裝來自不同數據源的數據;

2、where子句基於指定的條件對記錄行進行篩選;

3、group by子句將數據劃分為多個分組;

4、使用聚集函數進行計算;

5、使用having子句篩選分組;

6、計算所有的表達式;

7、使用order by對結果集進行排序 。

from 子句--執行順序為從後往前、從右到左

表名(最後面的那個表名為驅動表,執行順序為從後往前, 所以數據量較少的表盡量放後)

oracle 的解析器按照從右到左的順序處理,FROM 子句中的表名,FROM 子句中寫在最後的表(基礎表 driving

table)將被最先處理,即最後的表為驅動表,在FROM 子句中包含多個表的情況下,你必須選擇記錄條數最少的表作為基礎表。如果有3

個以上的表連接查詢, 那就需要選擇交叉表(intersection table)作為基礎表, 交叉表是指被其他表所引用的表

多表連接時,使用表的別名並把別名前綴於每個Column上。可以減少解析的時間並減少那些由Column 歧義引起的語法錯誤.

where子句--執行順序為自下而上、從右到左

ORACLE 採用自下而上從右到左的順序解析Where 子句,根據這個原理,表之間的連接必須寫在其他Where 條件之前, 可以過濾掉最大數量記錄的條件必須寫在Where 子句的末尾。

group by--執行順序從左往右分組

提高GROUP BY 語句的效率, 可以通過將不需要的記錄在GROUP BY 之前過濾掉。即在GROUP BY前使用WHERE來過慮,而盡量避免GROUP BY後再HAVING過濾。

having 子句----很耗資源,盡量少用

避免使用HAVING 子句, HAVING 只會在檢索出所有記錄之後才對結果集進行過濾. 這個處理需要排序,總計等操作.

如果能通過Where 子句在GROUP BY前限制記錄的數目,那就能減少這方面的開銷.

(非oracle 中)on、where、having 這三個都可以加條件的子句中,on 是最先執行,where 次之,having 最後,因為on 是先把不符合條件的記錄過濾後才進行統計,它就可以減少中間運算要處理的數據,按理說應該速度是最快的,

where 也應該比having 快點的,因為它過濾數據後才進行sum,在兩個表聯接時才用on 的,所以在一個表的時候,就剩下where 跟having比較了。

在這單表查詢統計的情況下,如果要過濾的條件沒有涉及到要計算欄位,那它們的結果是一樣的,只是where 可以使用rushmore 技術,而having 就不能,在速度上後者要慢。

如果要涉及到計算的欄位,就表示在沒計算之前,這個欄位的值是不確定的,where 的作用時間是在計算之前就完成的,而having 就是在計算後才起作用的,所以在這種情況下,兩者的結果會不同。

在多表聯接查詢時,on 比where 更早起作用。系統首先根據各個表之間的聯接條件,把多個表合成一個臨時表後,再由where 進行過濾,然後再計算,計算完後再由having 進行過濾。

由此可見,要想過濾條件起到正確的作用,首先要明白這個條件應該在什麼時候起作用,然後再決定放在那裡。

select子句--少用*號,盡量取欄位名稱 。

ORACLE 在解析的過程中, 會將依次轉換成所有的列名, 這個工作是通過查詢數據字典完成的, 使用列名意味著將減少消耗時間。

sql 語句用大寫的;因為 oracle 總是先解析 sql 語句,把小寫的字母轉換成大寫的再執行

order by子句--執行順序為從左到右排序,很耗資源

Ⅲ SQL中的左連接與右連接有什麼區別,點解返回值會不同

1、意思不一樣

左連接:只要左邊表中有記錄,數據就能檢索出來,而右邊有的記錄必要在左邊表中有的記錄才能被檢索出來。

右連接:右連接是只要右邊表中有記錄,數據就能檢索出來。

2、空值不一樣

左連接是已左邊表中的數據為基準,若左表有數據右表沒有數據,則顯示左表中的數據右表中的數據顯示為空。

右聯接是左向外聯接的反向聯接。將返回右表的所有行。如果右表的某行在左表中沒有匹配行,則將為左表返回空值。

左連接實例

在左外連接和右外連接時都會以一張表為基表,該表的內容會全部顯示,然後加上兩張表匹配的內容。如果基表的數據在另一張表沒有記錄。那麼在相關聯的結果集行中列顯示為空值(NULL)。

對於外連接, 也可以使用「(+) 」來表示。 關於使用(+)的一些注意事項:

1、(+)操作符只能出現在where子句中,並且不能與outer join語法同時使用。

2、當使用(+)操作符執行外連接時,如果在where子句中包含有多個條件,則必須在所有條件中都包含(+)操作符。

以上內容參考:網路-外連接

Ⅳ SQL:左連接,右連接是什麼概念啊

SQL中左連接和右連接都屬於外連接。

左連接是LEFT JOIN或LEFT OUTER JOIN,左向外聯接的結果集包括 LEFT OUTER子句中指定的左表的所有行,而不僅僅是聯接列所匹配的行。如果左表的某行在右表中沒有匹配行,則在相關聯的結果集行中右表的所有選擇列表列均為空值。

右連接是RIGHT JOIN 或 RIGHT OUTER JOIN,右向外聯接是左向外聯接的反向聯接。將返回右表的所有行。如果右表的某行在左表中沒有匹配行,則將為左表返回空值。

舉例:要查詢所有學生的選課情況,包括已經選課的和還沒有選課的學生,查詢語句為SELECT學生表.學號,姓名,班級,課程號,成績 FROM學生表LEFT OUTER JOIN選課表ON學生表.學號=選課表.學號,左外連接查詢中左端表中的所有元組的信息都得到了保留。

(4)sql左連接和右連接執行順序擴展閱讀

連接查詢是關系資料庫中最主要的查詢,主要包括內連接、外連接和交叉連接等。聯接條件可在FROM或WHERE子句中指定,建議在FROM子句中指定聯接條件。WHERE和HAVING子句也可以包含搜索條件,以進一步篩選聯接條件所選的行。

內連接是INNERJOIN簡寫成JOIN,是典型的聯接運算,使用像 = 或 <> 之類的比較運算符。包括相等聯接和自然聯接。內聯接使用比較運算符根據每個表共有的列的值匹配兩個表中的行。例如,檢索 students和courses表中學生標識號相同的所有行。

外聯接除了左右連接外,還有完整外部聯接FULL JOIN 或 FULL OUTER JOIN,完整外部聯接返回左表和右表中的所有行。當某行在另一個表中沒有匹配行時,則另一個表的選擇列表列包含空值。如果表之間有匹配行,則整個結果集行包含基表的數據值。

交叉聯接返回左表中的所有行,左表中的每一行與右表中的所有行組合。交叉聯接也稱作笛卡爾積。FROM 子句中的表或視圖可通過內聯接或完整外部聯接按任意順序指定;但是,用左或右向外聯接指定表或視圖時,表或視圖的順序很重要。

Ⅳ sql左連接和右連接什麼情況使用

假設a表有兩個欄位,Aid、name,
b
表也有兩欄位
Bid,nameid
其中
nameid是Aid在b
表中的外鍵。
a表有數據如下:
Aid
name
1
a
2
b
3
c
b表有數據如下:
Bid
nameid
1
1
2
1
3
1
4
2
5
2
用左連接,就是以左邊那個表為標准,左邊那表(表a)的所有記錄必須得全部出現,例如:
select
*
from
a
left
join
b
on
a.Aid=b.nameid
結果應應該為:
Aid
name
Bid
nameid
1
a
1
1
1
a
2
1
1
a
3
1
2
b
4
2
2
b
5
2
3
c
NULL
NULL
表a

Aid為1的出現了三次,Aid為2的出現了兩次,Aid為3的出現了一次,全部都出現了。但因為在表b中沒有以Aid為3對應的記錄,所以用null來填充。
同樣道理,用右連接,就是以右邊那個表為標准,
例如:select
*
from
a
right
join
b
on
a.Aid=b.nameid
結果應該為:
Aid
name
Bid
nameid
1
a
1
1
1
a
2
1
1
a
3
1
2
b
4
2
2
b
5
2
表b的記錄必須全部出現,但沒有出現
a表中Aid為3的記錄,是因為b表中沒有以之對應的記錄,而且此時是以b表為標準的。

Ⅵ sql中left join on 和where的執行順序

(8)SELECT (9)DISTINCT (11)<Top Num> <select list>
(1)FROM [left_table]
(3)<join_type> JOIN <right_table>
(2)ON <join_condition>
(4)WHERE <where_condition>
(5)GROUP BY <group_by_list>
(6)WITH <CUBE | RollUP>
(7)HAVING <having_condition>
(10)ORDER BY <order_by_list>

邏輯查詢處理階段簡介
FROM:對FROM子句中的前兩個表執行笛卡爾積(Cartesian proct)(交叉聯接),生成虛擬表VT1
ON:對VT1應用ON篩選器。只有那些使<join_condition>為真的行才被插入VT2。
OUTER(JOIN):如 果指定了OUTER JOIN(相對於CROSS JOIN 或(INNER JOIN),保留表(preserved table:左外部聯接把左表標記為保留表,右外部聯接把右表標記為保留表,完全外部聯接把兩個表都標記為保留表)中未找到匹配的行將作為外部行添加到 VT2,生成VT3.如果FROM子句包含兩個以上的表,則對上一個聯接生成的結果表和下一個表重復執行步驟1到步驟3,直到處理完所有的表為止。
WHERE:對VT3應用WHERE篩選器。只有使<where_condition>為true的行才被插入VT4.
GROUP BY:按GROUP BY子句中的列列表對VT4中的行分組,生成VT5.
CUBE|ROLLUP:把超組(Suppergroups)插入VT5,生成VT6.
HAVING:對VT6應用HAVING篩選器。只有使<having_condition>為true的組才會被插入VT7.
SELECT:處理SELECT列表,產生VT8.
DISTINCT:將重復的行從VT8中移除,產生VT9.
ORDER BY:將VT9中的行按ORDER BY 子句中的列列表排序,生成游標(VC10).
TOP:從VC10的開始處選擇指定數量或比例的行,生成表VT11,並返回調用者。

Ⅶ 在sql server 中先右連接,再左連接。 把右連接得到的表用於左連接。(求具體語句)

SELECT*
FROM(
SELECT*
FROM表名a
RIGHT表名b
ONa.欄位名=b.欄位名
)a
LEFTJOIN表名b
ONa.欄位名=b.欄位名

下面這個跟上面的是一樣的,只是表別名不一樣,看起來清晰些:

SELECT*
FROM(
SELECT*
FROM表名a
RIGHT表名b
ONa.欄位名=b.欄位名
)c
LEFTJOIN表名d
ONc.欄位名=d.欄位名

Ⅷ SQL中4個表的連接時怎樣的順序

不知道你採用的是內連接還是外連接,在db2中,多表連接總是先兩個表關聯,然後結果集再和第三個表關聯,以此類推!至於順序,db2優化器會結合cpu,i/o等因素自動考慮誰是內表,誰是外表!正常情況下一般把能過濾掉最大行數的表寫在最左邊,然後依次寫其他的表!

Ⅸ SQL中的左外連接和+號的用法

SQL中的左外連接和+號的用法

Oracle 左連接、右連接、全外連接、(+)號作用

Oracle 外連接

(1)左外連接 (左邊的表不加限制)
(2)右外連接(右邊的表不加限制)
(3)全外連接(左右兩表都不加限制)

外連接(Outer Join)

outer join則會返回每個滿足第一個(頂端)輸入與第二個(底端)輸入的聯接的行。它還返回任何在第二個輸入中沒有匹配行的第一個輸入中的行。外連接分為三種: 左外連接,右外連接,全外連接。 對應SQL:LEFT/RIGHT/FULL OUTER JOIN。 通常我們省略outer 這個關鍵字。 寫成:LEFT/RIGHT/FULL JOIN。

在左外連接和右外連接時都會以一張表為基表,該表的內容會全部顯示,然後加上兩張表匹配的內容。 如果基表的數據在另一張表沒有記錄。 那麼在相關聯的結果集行中列顯示為空值(NULL)。

對於外連接, 也可以使用「(+) 」來表示。 關於使用(+)的一些注意事項:
1.(+)操作符只能出現在where子句中,並且不能與outer join語法同時使用。
2. 當使用(+)操作符執行外連接時,如果在where子句中包含有多個條件,則必須在所有條件中都包含(+)操作符
3.(+)操作符只適用於列,而不能用在表達式上。
4.(+)操作符不能與or和in操作符一起使用。
5.(+)操作符只能用於實現左外連接和右外連接,而不能用於實現完全外連接。
在做實驗之前,我們先將dave表和bl里加一些不同的數據。 以方便測試。

SQL> select * from bl;

ID NAME

---------- ----------

1 dave

2 bl

3 big bird

4 exc

9 懷寧

SQL> select * from dave;

ID NAME

---------- ----------

8 安慶

1 dave

2 bl

1 bl

2 dave

3 dba

4 sf-express

5 dmm

2.1 左外連接(Left outer join/ left join)

left join是以左表的記錄為基礎的,示例中Dave可以看成左表,BL可以看成右表,它的結果集是Dave表中的數據,在加上Dave表和BL表匹配的數據。換句話說,左表(Dave)的記錄將會全部表示出來,而右表(BL)只會顯示符合搜索條件的記錄。BL表記錄不足的地方均為NULL.

示例:

SQL> select * from dave a left join bl b on a.id = b.id;

ID NAME ID NAME

--------- ---------- ---------- ----------

1 bl 1 dave

1 dave 1 dave

2 dave 2 bl

2 bl 2 bl

3 dba 3 big bird

4 sf-express 4 exc

5 dmm -- 此處B表為null,因為沒有匹配到

8 安慶 -- 此處B表為null,因為沒有匹配到

SQL> select * from dave a left outer join bl b on a.id = b.id;

ID NAME ID NAME

---------- ---------- ---------- ----------

1 bl 1 dave

1 dave 1 dave

2 dave 2 bl

2 bl 2 bl

3 dba 3 big bird

4 sf-express 4 exc

5 dmm

8 安慶

用(+)來實現, 這個+號可以這樣來理解: + 表示補充,即哪個表有加號,這個表就是匹配表。所以加號寫在右表,左表就是全部顯示,故是左連接。

SQL> Select * from dave a,bl b where a.id=b.id(+); -- 注意: 用(+) 就要用關鍵字where

ID NAME ID NAME

---------- ---------- ---------- ----------

1 bl 1 dave

1 dave 1 dave

2 dave 2 bl

2 bl 2 bl

3 dba 3 big bird

4 sf-express 4 exc

5 dmm

8 安慶

2.2 右外連接(right outer join/ right join)

和left join的結果剛好相反,是以右表(BL)為基礎的, 顯示BL表的所以記錄,在加上Dave和BL 匹配的結果。 Dave表不足的地方用NULL填充.

示例:

SQL> select * from dave a right join bl b on a.id = b.id;

ID NAME ID NAME

---------- ---------- ---------- ----------

1 dave 1 dave

2 bl 2 bl

1 bl 1 dave

2 dave 2 bl

3 dba 3 big bird

4 sf-express 4 exc

9 懷寧 --此處左表不足用Null 填充

已選擇7行。

SQL> select * from dave a right outer join bl b on a.id = b.id;

ID NAME ID NAME

---------- ---------- ---------- ----------

1 dave 1 dave

2 bl 2 bl

1 bl 1 dave

2 dave 2 bl

3 dba 3 big bird

4 sf-express 4 exc

9 懷寧 --此處左表不足用Null 填充

已選擇7行。

用(+)來實現, 這個+號可以這樣來理解: + 表示補充,即哪個表有加號,這個表就是匹配表。所以加號寫在左表,右表就是全部顯示,故是右連接。

SQL> Select * from dave a,bl b where a.id(+)=b.id;

ID NAME ID NAME

---------- ---------- ---------- ----------

1 dave 1 dave

2 bl 2 bl

1 bl 1 dave

2 dave 2 bl

3 dba 3 big bird

4 sf-express 4 exc

9 懷寧

2.3 全外連接(full outer join/ full join)

左表和右表都不做限制,所有的記錄都顯示,兩表不足的地方用null 填充。 全外連接不支持(+)這種寫法。

示例:

SQL> select * from dave a full join bl b on a.id = b.id;

ID NAME ID NAME

---------- ---------- ---------- ----------

8 安慶

1 dave 1 dave

2 bl 2 bl

1 bl 1 dave

2 dave 2 bl

3 dba 3 big bird

4 sf-express 4 exc

5 dmm

9 懷寧

已選擇9行。

SQL> select * from dave a full outer join bl b on a.id = b.id;

ID NAME ID NAME

---------- ---------- ---------- ----------

8 安慶

1 dave 1 dave

2 bl 2 bl

1 bl 1 dave

2 dave 2 bl

3 dba 3 big bird

4 sf-express 4 exc

5 dmm

最初由 ghc_x 發布
[B]有兩個表T1和T2,兩個表除了主鍵索引外均無其他索引,這兩個表由T1.F1(主鍵),T2.F2(主鍵)進行左連接,SQL語句有兩種寫法:
1. SELECT * FROM T1,T2 WHERE T1.F1=T2.F2(+)
2. SELECT * FROM T1 LEFT JOIN T2 ON T1.F1=T2.F2

當查看1的執行計劃時發現T1為全表掃描,T2為索引掃描。
當查看2的執行計劃時發現兩個表均為全表掃描。
有人知道這是為什麼嗎? [/B]

我一直以來也是認為這兩種寫法是一樣的,沒想到樓主特意去看了它們的執行計劃,而且發現了它們的不同,這使得我比較驚訝。
按照書上的講法,這兩種寫法是沒有什麼區別的,後一種寫法只不過是前一種寫法的新版本。
為什麼兩者的執行計劃會不一樣呢?
我仔細看了一下兩者的執行計劃,發現了為什麼後一種要兩個表都全表 掃描,而前一個表有一個索引掃描。
原來前者選擇的優化器是RULE,而後者選擇的優化器是CBO的ALL ROWS。
不過,似乎要後者的效率高。

1. SELECT /*+RULE*/ * FROM T1,T2 WHERE T1.F1=T2.F2(+)

2. SELECT /*+RULE*/ * FROM T1 LEFT JOIN T2 ON T1.F1=T2.F2

這樣再看下執行計劃吧

Ⅹ sql左連接、右連接、全連接、內連接有啥區別

左(外)連接(LEFT JOIN),以左表為基準,查詢出左表所有的數據和右表中連接欄位相等的記錄,如果右表中沒有對應數據,則在左表記錄後顯示為空(NULL).如果把兩個表分別看成一個集合的話,則顯示的結果為JOIN左邊的集合。
右(外)連接(RIGHT JOIN )是以右表為基準,查詢出右表所有的數據和左表中連接欄位相等的記錄,如果左表沒有對應數據則在右表對應數據行顯示為空(NULL).如果把兩個表分別看成一個集合的話,則顯示的結果為JOIN右邊的集合。
內連接(INNER JOIN )是查詢出兩個表對應的數據,如果把兩個表分別看成一個集合的話,內連接的結果即為兩個表的交集。
全連接(FULL JOIN )將兩個表的數據全部查出來,返回左右表中所有的記錄和左右表中連接欄位相等的記錄,如果把兩個表分別看成一個集合的話,全外連接的結果即為兩個表的並集。