left - sql join教學



SQL Server 2008中的CROSS JOIN與INNER JOIN (6)

內部聯接

只顯示兩個連接表中匹配的行的連接稱為內連接。 這是查詢和視圖設計器中的默認聯接。

內部連接的語法

SELECT t1.column_name,t2.column_name
FROM table_name1 t1
INNER JOIN table_name2 t2
ON t1.column_name=t2.column_name

交叉加入

交叉連接生成參與連接的表的笛卡爾乘積。 笛卡爾積的大小是第一個表中的行數乘以第二個表中的行數。

交叉連接的語法

SELECT * FROM table_name1
CROSS JOIN table_name2

或者我們也可以用另一種方​​式寫它

SELECT * FROM table_name1,table_name2

現在檢查下面的查詢交叉連接

SELECT * FROM UserDetails
CROSS JOIN OrderDetails

要么

SELECT * FROM UserDetails, OrderDetails

https://src-bin.com

CROSS JOININNER JOIN和有什麼不一樣?

交叉連接:

SELECT 
    Movies.CustomerID, Movies.Movie, Customers.Age, 
    Customers.Gender, Customers.[Education Level], 
    Customers.[Internet Connection], Customers.[Marital Status], 
FROM   
    Customers 
CROSS JOIN 
    Movies

內部聯接:

SELECT 
    Movies.CustomerID, Movies.Movie, Customers.Age, 
    Customers.Gender, Customers.[Education Level], 
    Customers.[Internet Connection], Customers.[Marital Status]
FROM   
    Customers 
INNER JOIN 
    Movies ON Customers.CustomerID = Movies.CustomerID

哪一個更好,為什麼我會使用其中之一?


Answer #1

SQL Server也接受更簡單的表示法:

SELECT A.F, 
       B.G, 
       C.H 
  FROM TABLE_A A, 
       TABLE_B B, 
       TABLE_C C
 WHERE A.X = B.X 
   AND B.Y = C.Y

使用這個更簡單的符號,不需要考慮內連接和交叉連接之間的區別。 有兩個“ON”子句,而不是兩個“WHERE”子句。 如果您在確定哪些“JOIN”“ON”子句時遇到任何困難,請放棄“JOIN”符號並使用上面較簡單的符號。

這不是作弊。


Answer #2

交叉連接不會合併行,如果每個表中有100行,1對1匹配,則會得到10.000個結果,Innerjoin將僅在相同情況下返回100行。

這兩個例子將返回相同的結果:

交叉加入

select * from table1 cross join table2 where table1.id = table2.fk_id

內部聯接

select * from table1 join table2 on table1.id = table2.fk_id

使用最後一種方法


Answer #3

交叉連接和內部連接是相同的,唯一的區別在於,在內部連接中,我們布爾式地過濾了笛卡爾積的一些結果

table1
x--------------------------------------x
|  fieldA  |    fieldB   |    fieldC   | 
x----------|-------------|-------------x            
|    A     |      B      |    option1  |
|    A     |      B1     |    option2  |
x--------------------------------------x

table2
x--------------------------------------x
|  fieldA  |    fieldB   |    fieldC   | 
x----------|-------------|-------------x            
|    A     |      B      |    optionB1 |
|    A1    |      B1     |    optionB2 |
x--------------------------------------x

 cross join
  A,B,option1,A,B,optionB1
  A,B,option1,A1,B1,optionB2
  A,B1,option2,A,B,optionB1
  A,B1,option2,A1,B1,optionB2

 inner join on field1 (only with the value is the same in both tables)
  A,B,option1,A,B,optionB1
  A,B1,option2,A,B,optionB1

 inner join on field1
  A,B,option1,A,B,optionB1

正是在我們的數據設計中,我們決定只有一個我們用於連接的領域的案例。 只加入交叉連接兩個表並只獲得完成特殊布爾表達式的行。

請注意,如果我們正在進行連接的字段在兩個表中都為空,我們將通過過濾器。 我們或數據庫製造商需要添加額外規則來避免或允許使用空值。 堅持基礎知識,它只是一個交叉連接,後面跟著一個過濾器。


Answer #4

內部聯接將給出兩個表之間匹配記錄的結果,因為交叉聯接為您提供了兩個表之間的可能組合。


Answer #5

在使用內部聯接編寫查詢時,如果兩個表滿足條件(即兩個表中的公共列完全匹配),則記錄將從兩個表中提取。

使用交叉連接編寫查詢時,結果就像兩個表中的記錄數都是笛卡爾積。 例如,如果table1包含2條記錄,並且table2包含3條記錄,則查詢的結果是2 * 3 = 6條記錄。

所以不要去交叉連接,直到你需要。





cross-join