Doğal birleştirme ile iç birleşme arasındaki fark nedir?
Doğal birleştirme ile iç birleşme arasındaki fark nedir?
Yanıtlar:
INNER JOIN ve NATURAL JOIN arasındaki önemli bir fark döndürülen sütun sayısıdır.
Düşünmek:
TableA TableB
+------------+----------+ +--------------------+
|Column1 | Column2 | |Column1 | Column3 |
+-----------------------+ +--------------------+
| 1 | 2 | | 1 | 3 |
+------------+----------+ +---------+----------+
INNER JOIN
Sütun1'de üzerinde TableA ve TABLEB arasında dönecektir
SELECT * FROM TableA AS a INNER JOIN TableB AS b USING (Column1);
SELECT * FROM TableA AS a INNER JOIN TableB AS b ON a.Column1 = b.Column1;
+------------+-----------+---------------------+
| a.Column1 | a.Column2 | b.Column1| b.Column3|
+------------------------+---------------------+
| 1 | 2 | 1 | 3 |
+------------+-----------+----------+----------+
NATURAL JOIN
Sütun1'de üzerinde TableA ve TABLEB ait döner:
SELECT * FROM TableA NATURAL JOIN TableB
+------------+----------+----------+
|Column1 | Column2 | Column3 |
+-----------------------+----------+
| 1 | 2 | 3 |
+------------+----------+----------+
Tekrarlanan sütundan kaçınılır.
(Standart dilbilgisinden AFAICT olarak, doğal bir birleştirmede birleştirme sütunlarını belirtemezsiniz; birleştirme kesinlikle ad tabanlıdır. Ayrıca bkz . Wikipedia .)
( İç bir hile var çıkışını katılmak; a.
ve b.
parça sütun adlarında olmaz; sadece olurdu column1
, column2
, column1
, column3
başlıkları olarak. )
NATURAL JOIN
mahvedeceğini, neden beklenmedik olduğunu ve hangi dünyada olduğunuzu açıklayabilir misiniz?
Customers
ve arasında doğal bir birleşim Employees
var EmployeeID
. Employees
ayrıca bir ManagerID
alanı var. Herşey yolunda. Sonra, bir gün, birisi masaya bir ManagerID
alan ekler Customers
. Birleştirme işleminiz kesilmeyecek (bu bir merhamet olacaktır), bunun yerine şimdi ikinci bir alan içerecek ve yanlış çalışacaktır . Böylece, görünüşte zararsız bir değişiklik sadece uzaktan ilgili bir şeyi kırabilir. ÇOK KÖTÜ. Doğal birleşmenin tek tarafı biraz yazarak tasarruf etmek ve dezavantajı önemli.
SELECT * FROM TableA INNER JOIN TableB USING (Column1)
4 sütun verdiğini söylediniz . Bunun nedeni doğru değildir SELECT * FROM TableA INNER JOIN TableB USING (Column1)
ve SELECT * FROM TableA NATURAL JOIN TableB
eşit ikisi de vermek 3 sütun.
natural left
veya natural right
) olmak katılmak kriterlerini varsayar nerede hem tablo maçında aynı adlı sütunlarVeba gibi doğal eklemleri kullanmaktan kaçınırdım, çünkü doğal eklemler:
NATURAL JOIN Checkouts
", yalnızca veritabanı adlandırma kuralları resmi ve zorunlu olduğunda mümkündür."
id
her yerde ve katılmak için işe yaramaz; olağan yabancı anahtar isimleri tablename_id
. Doğal birleşimler kötü, kötü, kötü bir fikirdir.
Doğal birleştirme, birleştirmenin basit olduğu ve aynı addaki alanlarla eşleştiği varsayımıyla, yazmaktan kaçınmak için sadece bir kısayoldur.
SELECT
*
FROM
table1
NATURAL JOIN
table2
-- implicitly uses `room_number` to join
Aynıdır...
SELECT
*
FROM
table1
INNER JOIN
table2
ON table1.room_number = table2.room_number
Ancak kısayol biçimiyle yapamayacağınız şey daha karmaşık birleşimler ...
SELECT
*
FROM
table1
INNER JOIN
table2
ON (table1.room_number = table2.room_number)
OR (table1.room_number IS NULL AND table2.room_number IS NULL)
NATURAL JOIN ... USING ()
? Standart ya a NATURAL JOIN b
daa JOIN b USING (c)
room_number
, iç birleşimlerinizde ise iki sütun bulunur room_number
.
SQL, ilişkisel modele pek çok açıdan sadık değildir. SQL sorgusunun sonucu, yinelenen adlara, 'anonim' (adsız) sütunlara, yinelenen satırlara, boş değerlere vb. Sahip sütunlara sahip olabileceğinden bir ilişki değildir. SQL, tabloları sütun sırası vb.
NATURAL JOIN
SQL'in arkasındaki fikir , ilişkisel modele daha sadık kalmayı kolaylaştırmaktır. NATURAL JOIN
İki tablonun sonucu, adıyla çoğaltılmış sütunlara sahip olacaktır, dolayısıyla anonim sütunlar içermeyecektir. Benzer şekilde UNION CORRESPONDING
ve EXCEPT CORRESPONDING
SQL'in eski UNION
sözdizimindeki sütun sıralamasına bağımlılığını ele almak için sağlanmıştır .
Ancak, tüm programlama tekniklerinde olduğu gibi, disiplinin faydalı olmasını gerektirir. Başarılı bir gereksinim NATURAL JOIN
sürekli olarak sütunlar olarak adlandırılır, çünkü birleşimler aynı adlara sahip sütunlarda ima edilir (SQL'de sütunları yeniden adlandırmak için sözdiziminin ayrıntılı olması, ancak yan etki, temel tablolarda sütunları adlandırırken disiplini teşvik etmektir. VIEW
s :)
SQL'in NATURAL JOIN
bir equi-join ** olduğunu unutmayın, ancak bu kullanışlılık için bir çubuk değildir. Eğer düşünün NATURAL JOIN
SQL desteklenen tek katılmak tip oldu hala olurdu ilişkisel tam .
Gerçekten de herhangi birinin projeksiyon ve projeksiyon ( ) NATURAL JOIN
kullanılarak yazılabileceği doğru olsa da, herhangi birinin product ( ) ve resttion ( ); ayrıca , ortak sütun adı olmayan tablolar arasındaki a ile aynı sonucu verecektir . Dolayısıyla, yalnızca ilişkiler olan sonuçlarla (ve neden hiç olmasın ?!) ilgileniyorsanız, ihtiyacınız olan tek birleştirme türü budur. Elbette, bir dil tasarım perspektifinden değer gibi kısayolların olduğu ve değerlerinin olduğu doğrudur , ancak hemen hemen her SQL sorgusunun sözdizimsel olarak farklı, ancak anlamsal olarak eşdeğer, 10 şekilde yazılabileceğini düşünün ve bu, SQL optimizasyonlarını çok zorlaştıran şeydir geliştirmek.INNER JOIN
SELECT
INNER JOIN
CROSS JOIN
WHERE
NATURAL JOIN
CROSS JOIN
NATURAL JOIN
INNER JOIN
CROSS JOIN
Anlamsal olarak eşdeğer olan bazı örnek sorgular ( alışılmış parça ve tedarikçi veritabanını kullanarak ):
SELECT *
FROM S NATURAL JOIN SP;
-- Must disambiguate and 'project away' duplicate SNO attribute
SELECT S.SNO, SNAME, STATUS, CITY, PNO, QTY
FROM S INNER JOIN SP
USING (SNO);
-- Alternative projection
SELECT S.*, PNO, QTY
FROM S INNER JOIN SP
ON S.SNO = SP.SNO;
-- Same columns, different order == equivalent?!
SELECT SP.*, S.SNAME, S.STATUS, S.CITY
FROM S INNER JOIN SP
ON S.SNO = SP.SNO;
-- 'Old school'
SELECT S.*, PNO, QTY
FROM S, SP
WHERE S.SNO = SP.SNO;
** İlişkisel doğal birleşme bir ekvator değildir, bir projeksiyonudur. - philipxy
Bir NATURAL
katılmak bir sadece kısa sözdizimi özgü INNER
ya da "eş-katıl" - - ve, sözdizimi açılmadığı zamanlar, her ikisi de aynı İlişkisel Cebir operasyonu temsil katılmak. Bu, OUTER
( LEFT
/ RIGHT
) veya CROSS
birleşme durumlarında olduğu gibi "farklı bir tür birleşim" değildir .
Bkz eşit-katılmak Wikipedia'da bölümü:
Doğal bir birleşim, ek birleşimlerin daha fazla uzmanlaşmasını sağlar. Birleştirme yüklemi, her iki tabloda da birleştirilen tablolarda aynı sütun adlarına sahip tüm sütunları karşılaştırarak dolaylı olarak ortaya çıkar . Sonuçta elde edilen birleştirilmiş tablo, eşit olarak adlandırılmış her bir sütun çifti için yalnızca bir sütun içerir.
Çoğu uzman , NATURAL JOIN'lerin tehlikeli olduğunu kabul eder ve bu nedenle kullanımlarını kesinlikle caydırır. Tehlike yanlışlıkla başka bir sütunla aynı adlı yeni bir sütun eklemekten kaynaklanır ...
Yani, bütün NATURAL
olarak yazılabilir katılır INNER
katılır (ama tersi doğru değildir). Bunu yapmak için yüklemi açık bir şekilde oluşturun - ör. USING
Veya ON
- ve Jonathan Leffler'in işaret ettiği gibi, istenirse "yinelemeleri" önlemek için istenen sonuç kümesi sütunlarını seçin.
Mutlu kodlama.
( NATURAL
Anahtar kelime de birleştirilebilir LEFT
ve RIGHT
birleştirilebilir ve aynı durum geçerlidir. Birleştirme , belirli bir birleştirme NATURAL LEFT/RIGHT
için yalnızca kısa bir sözdizimidir .) LEFT/RIGHT
Doğal Birleştirme: İki tablodaki tüm sütunların birleşimidir. İlk tablodaki tüm satırları ikinci tabloya göre döndürecektir.
İç Birleştirme: Bu birleşim, sütun adlarından herhangi biri iki tabloda sxame olmazsa çalışır
Doğal Birleştirme, tüm ortak sütunlar temelinde 2 tablonun birleştirildiği yerdir.
ortak sütun: her iki tabloda da aynı ada sahip bir sütundur + her iki tabloda da uyumlu veri türlerine sahiptir. Yalnızca = operatörünü kullanabilirsiniz
İç Birleştirme, ON yan tümcesinde belirtilen ortak sütunlar temelinde 2 tablonun birleştirildiği yerdir.
ortak sütun: her iki tabloda da uyumlu veri türlerine sahip olan ancak aynı ada sahip olması gerekmeyen bir sütundur. Sen gibi sadece herhangi karşılaştırma operatörünü kullanabilirsiniz =
, <=
, >=
, <
, >
,<>
fark iç (equi / default) birleşiminde ve natuarl birleşiminde ortak sütun kazanımının tek seferde görüntüleneceği, ancak iç / equi / default / basit birleşim ortak sütununda iki kez görüntülenecek olmasıdır.
İç birleşim ve doğal birleşim neredeyse aynıdır, ancak aralarında küçük bir fark vardır. Fark doğal birleşimde koşul belirtmeye gerek yoktur, ancak iç birleşim durumunda zorunludur. İç birleşmede durumu belirtirsek, sonuçta ortaya çıkan tablolar kartezyen bir ürün gibidir.
mysql> SELECT * FROM tb1 ;
+----+------+
| id | num |
+----+------+
| 6 | 60 |
| 7 | 70 |
| 8 | 80 |
| 1 | 1 |
| 2 | 2 |
| 3 | 3 |
+----+------+
6 rows in set (0.00 sec)
mysql> SELECT * FROM tb2 ;
+----+------+
| id | num |
+----+------+
| 4 | 40 |
| 5 | 50 |
| 9 | 90 |
| 1 | 1 |
| 2 | 2 |
| 3 | 3 |
+----+------+
6 rows in set (0.00 sec)
İÇ BİRLEŞİM :
mysql> SELECT * FROM tb1 JOIN tb2 ;
+----+------+----+------+
| id | num | id | num |
+----+------+----+------+
| 6 | 60 | 4 | 40 |
| 7 | 70 | 4 | 40 |
| 8 | 80 | 4 | 40 |
| 1 | 1 | 4 | 40 |
| 2 | 2 | 4 | 40 |
| 3 | 3 | 4 | 40 |
| 6 | 60 | 5 | 50 |
| 7 | 70 | 5 | 50 |
| 8 | 80 | 5 | 50 |
.......more......
return 36 rows in set (0.01 sec)
AND NATURAL JOIN :
mysql> SELECT * FROM tb1 NATURAL JOIN tb2 ;
+----+------+
| id | num |
+----+------+
| 1 | 1 |
| 2 | 2 |
| 3 | 3 |
+----+------+
3 rows in set (0.01 sec)
İç birleşim, sütun adının aynı olduğu iki tabloya katılın.
Doğal birleştirme, sütun adı ve veri türlerinin aynı olduğu iki tabloyu birleştirin.