sql - non - relational database中文




θ連接,equijoin和自然連接之間的區別 (6)

當涉及theta連接,等量連接和自然連接時,我無法理解關係代數。 有人能幫助我更好地理解它嗎? 如果我在Theta上使用=符號,它與使用自然連接完全相同?


@ outis的答案很好:關於關係的簡潔和正確。

但是,就SQL而言,情況稍微複雜一些。

考慮通常的供應商和零件數據庫,但是用SQL實現:

SELECT * FROM S NATURAL JOIN SP;

將返回結果集**與列

SNO, SNAME, STATUS, CITY, PNO, QTY

連接在兩個表中的名稱相同的列SNO 。 請注意,結果集有六列,只包含一列SNO

現在考慮一個theta eqijoin,其中必須明確指定連接的列名(加上範圍變量SSP是必需的):

SELECT * FROM S JOIN SP ON S.SNO = SP.SNO;

結果集將包含七列,其中包括兩列SNO 。 結果集的名稱是SQL標準所稱的“依賴於實現”,但可能如下所示:

SNO, SNAME, STATUS, CITY, SNO, PNO, QTY

或者也許這個

S.SNO, SNAME, STATUS, CITY, SP.SNO, PNO, QTY

換句話說,SQL中的NATURAL JOIN可以被認為是從結果集中刪除具有重複名稱的列(但是,alas不會刪除重複的行 - 您必須記住自己將SELECT更改為SELECT DISTINCT )。

**我不太清楚SELECT * FROM table_expression;的結果SELECT * FROM table_expression; 是。 我知道這不是一種關係,因為除其他原因外,它可以有重名的列或沒有名字的列。 我知道這不是一個集合,因為除了其他原因外,列順序很重要。 它甚至不是SQL表或SQL表表達式。 我稱之為結果集。


theta連接允許任意比較關係。

等值連接是使用等號運算符的theta連接。


Theta加入:當您使用任何運算符(例如,=,<,>,> =等)查詢連接時,該連接查詢將在Theta join下進行。

Equi Join:當您僅使用相等運算符對連接進行查詢時,那麼該連接查詢就屬於Equi連接。

例:

> SELECT * FROM Emp JOIN Dept ON Emp.DeptID = Dept.DeptID;
> SELECT * FROM Emp INNER JOIN Dept USING(DeptID)
This will show:
 _________________________________________________
| Emp.Name | Emp.DeptID | Dept.Name | Dept.DeptID |
|          |            |           |             |

注意:Equi加入也是一個theta加入!

自然連接:通過比較兩個表中所有相同名稱列隱式發生的一種Equi連接。

注意:這裡,連接結果對於每對相同的命名列只有一列。

 SELECT * FROM Emp NATURAL JOIN Dept
This will show:
 _______________________________
| DeptID | Emp.Name | Dept.Name |
|        |          |           |

儘管解釋確切差異的答案很好,但我想要展示關係代數如何轉換為SQL以及3個概念的實際價值。

你問題中的關鍵概念是加入的想法。 為了理解一個加入,你需要理解一個笛卡兒乘積(這個例子是基於SQL的,當它被指出的時候,其等價物被稱為交叉加入)。

這在實踐中並不是很有用。 考慮這個例子。

Product(PName, Price)
====================
Laptop,   1500
Car,      20000
Airplane, 3000000


Component(PName, CName, Cost)
=============================
Laptop, CPU,    500
Laptop, hdd,    300
Laptop, case,   700
Car,    wheels, 1000

笛卡爾產品產品x組件將 - 波紋管或sql小提琴 。 你可以看到有12行= 3×4。顯然,像“筆記本電腦”和“輪子”這樣的行沒有意義,這就是為什麼在實踐中很少使用笛卡爾產品。

|    PNAME |   PRICE |  CNAME | COST |
--------------------------------------
|   Laptop |    1500 |    CPU |  500 |
|   Laptop |    1500 |    hdd |  300 |
|   Laptop |    1500 |   case |  700 |
|   Laptop |    1500 | wheels | 1000 |
|      Car |   20000 |    CPU |  500 |
|      Car |   20000 |    hdd |  300 |
|      Car |   20000 |   case |  700 |
|      Car |   20000 | wheels | 1000 |
| Airplane | 3000000 |    CPU |  500 |
| Airplane | 3000000 |    hdd |  300 |
| Airplane | 3000000 |   case |  700 |
| Airplane | 3000000 | wheels | 1000 |

JOINs在這里為這些產品增加更多價值。 我們真正想要的是將產品與其關聯的組件“連接”,因為每個組件都屬於產品。 做到這一點的方法是加入:

產品JOIN組件在Pname上

關聯的SQL查詢就像這樣(你可以在這裡玩所有的例子)

SELECT *
FROM Product
JOIN Component
  ON Product.Pname = Component.Pname

結果是:

|  PNAME | PRICE |  CNAME | COST |
----------------------------------
| Laptop |  1500 |    CPU |  500 |
| Laptop |  1500 |    hdd |  300 |
| Laptop |  1500 |   case |  700 |
|    Car | 20000 | wheels | 1000 |

請注意,結果只有4行,因為筆記本電腦有3個組件,Car有1個,Airplane沒有。 這非常有用。

回到你的問題,你問的所有連接都是我剛剛展示的JOIN的變體:

自然連接 =連接(ON子句)在具有相同名稱的所有列上進行; 它會從結果中刪除重複的列,而不是所有其他聯接; 大多數數據庫管理系統(數據庫系統由諸如微軟的SQL Server,甲骨文的MySQL等不同廠商創建的數據庫系統)甚至不會支持這一點,這只是不好的做法(或故意選擇不實施它)。 想像一下,開發人員將產品中第二列的名稱從價格更改為成本。 然後所有自然連接都將在PName和Cost上完成,由於沒有數字匹配,導致0行。

Theta Join =這是每個人都使用的普通連接,因為它允許你指定條件(SQL中的ON子句)。 您可以加入幾乎任何您喜歡的條件,例如具有類似前兩個字母或具有不同價格的產品。 在實踐中,這種情況很少 - 95%的情況下,你將加入平等條件,這導致我們:

Equi Join =在實踐中最常見的一種。 上面的例子是一個equi連接。 數據庫針對這種類型的連接進行了優化! equi連接的對立方式是非等連接,也就是當您加入“=”以外的條件時。 數據庫沒有為此優化! 它們都是一般theta連接的子集。 自然連接也是一個theta連接,但條件(theta)是隱含的。

信息來源:大學+經過認證的SQL Server開發人員+最近完成了斯坦福大學的“數據庫入門”,所以我敢說我有新的關係代數。


自然是Equi的一個子集,它是Theta的一個子集。

如果我在theta上使用=符號,那麼它與剛才使用的自然連接完全相同?

不一定,但它會是一個Equi。 自然意味著你在所有類似命名的列上匹配,Equi只意味著你只使用'='(而不是'小於',比如等)

儘管這是純粹的學術界,但您可以使用關係數據庫多年,從未聽到任何人使用這些術語。


自然連接:當兩個關係中至少有一個共同屬性時,自然連接是可能的。

Theta加入:當兩個人在特定情況下行動時,Theta加入可能成為可能。

Equi加盟:Equi可以在兩種情況下在股權條件下行事。 這是一種theta連接。





relational-algebra