Database
 sql >> डेटाबेस >  >> RDS >> Database

SQL में 3 टेबल्स में शामिल हों

SQL में, आप पहले वाले के बाद एक और जोड़ जोड़कर तीन या अधिक तालिकाओं में शामिल हो सकते हैं।

आप एक जॉइन को दूसरे के लिए जॉइन कंडीशन के रूप में निर्दिष्ट करके नेस्टेड जॉइन भी चला सकते हैं।

सिंटैक्स

तीन तालिकाओं में शामिल होने का सबसे सामान्य तरीका कुछ इस प्रकार है:

SELECT *
FROM Table1 
INNER JOIN Table2
    ON Condition
INNER JOIN Table3
    ON Condition;

यह एक आंतरिक जुड़ाव का उपयोग करता है, लेकिन आप किसी भी अन्य जुड़ाव के साथ अपना वांछित जुड़ाव प्रकार निर्दिष्ट कर सकते हैं। यदि आवश्यक हो तो आप जुड़ने के प्रकारों को भी जोड़ सकते हैं (नीचे उदाहरण)।

आप एक जॉइन को दूसरे जॉइन के लिए जॉइन कंडीशन के रूप में निर्दिष्ट करके नेस्टेड जॉइन का भी उपयोग कर सकते हैं। इस तरह:

SELECT *
FROM Table1 
JOIN (Table2
            JOIN Table3
            ON Condition)
ON Condition;

नमूना डेटा - 3 टेबल्स

मान लीजिए कि हमारे पास निम्नलिखित तीन टेबल हैं।

Customers तालिका:

+--------------+----------------+----------------+----------------+
| CustomerId   | CustomerName   | PostalCityId   | PhoneNumber    |
|--------------+----------------+----------------+----------------|
| 1            | Homer McKenzie | 19586          | (308) 555-0100 |
| 2            | Marge Pratt    | 33475          | (406) 555-0100 |
| 3            | Vlad Bernanke  | NULL           | (480) 555-0100 |
| 4            | Bart Pitt      | 21692          | (316) 555-0100 |
| 5            | Lisa McQueen   | 12748          | (212) 555-0100 |
| 6            | Steve Simpson  | 17054          | (701) 555-0100 |
| 7            | Vinn Allen     | 12152          | (423) 555-0100 |
| 8            | Veejay Smith   | 3673           | (303) 555-0100 |
| 9            | Kasey Chin     | 23805          | (201) 555-0100 |
| 10           | Borat Lee      | 37403          | (701) 555-0100 |
+--------------+----------------+----------------+----------------+
(10 rows affected)

Cities तालिका:

+----------+----------------+-------------------+--------------+
| CityId   | CityName       | StateProvinceId   | Population   |
|----------+----------------+-------------------+--------------|
| 3673     | Bow Mar        | 6                 | 866          |
| 12152    | Frankewing     | 44                | NULL         |
| 12748    | Gasport        | 33                | 1248         |
| 21692    | Medicine Lodge | 17                | 2009         |
| 26483    | Peeples Valley | 3                 | 428          |
| 33475    | Sylvanite      | 27                | 103          |
| 17054    | Jessie         | 35                | 25           |
| 19586    | Lisco          | 28                | NULL         |
| 37403    | Wimbledon      | 35                | 216          |
+----------+----------------+-------------------+--------------+
(9 rows affected)

StateProvinces तालिका:

+-------------------+---------------------+---------------------+-------------+--------------+
| StateProvinceId   | StateProvinceCode   | StateProvinceName   | CountryId   | Population   |
|-------------------+---------------------+---------------------+-------------+--------------|
| 3                 | AZ                  | Arizona             | 230         | 6891688      |
| 6                 | CO                  | Colorado            | 230         | 5698265      |
| 17                | KS                  | Kansas              | 230         | 2893957      |
| 28                | NE                  | Nebraska            | 230         | 1943256      |
| 31                | NJ                  | New Jersey          | 230         | 8899339      |
| 33                | NY                  | New York            | 230         | 20437172     |
| 35                | ND                  | North Dakota        | 230         | 723393       |
| 44                | TN                  | Tennessee           | 230         | 6495978      |
+-------------------+---------------------+---------------------+-------------+--------------+
(8 rows affected)

उदाहरण 1 - इनर जॉइन 3 टेबल्स

सबसे लोकप्रिय जॉइन टाइप इनर जॉइन है, इसलिए हम इसके साथ शुरुआत करेंगे।

यहां दो इनर जॉइन के साथ उपरोक्त तीन तालिकाओं में शामिल होने का एक उदाहरण दिया गया है।

SELECT
    s.StateProvinceName,
    ci.CityName,
    cu.CustomerName
FROM StateProvinces s
INNER JOIN Cities AS ci
ON ci.StateProvinceID = s.StateProvinceID
INNER JOIN Customers cu  
ON cu.PostalCityId = ci.CityId;

परिणाम:

+---------------------+----------------+----------------+
| StateProvinceName   | CityName       | CustomerName   |
|---------------------+----------------+----------------|
| Nebraska            | Lisco          | Homer McKenzie |
| Kansas              | Medicine Lodge | Bart Pitt      |
| New York            | Gasport        | Lisa McQueen   |
| North Dakota        | Jessie         | Steve Simpson  |
| Tennessee           | Frankewing     | Vinn Allen     |
| Colorado            | Bow Mar        | Veejay Smith   |
| North Dakota        | Wimbledon      | Borat Lee      |
+---------------------+----------------+----------------+
(7 rows affected)

उदाहरण 2 - शामिल होने के प्रकारों का संयोजन

तीन या अधिक तालिकाओं में शामिल होने पर आप जुड़ने के प्रकारों को जोड़ सकते हैं।

यहां एक आंतरिक जुड़ाव को बाईं ओर से जोड़ने का एक उदाहरण दिया गया है।

SELECT
    s.StateProvinceName,
    ci.CityName,
    cu.CustomerName
FROM StateProvinces s
INNER JOIN Cities AS ci
ON ci.StateProvinceID = s.StateProvinceID
LEFT JOIN Customers cu  
ON cu.PostalCityId = ci.CityId;

परिणाम:

---------------------+----------------+----------------+
| StateProvinceName   | CityName       | CustomerName   |
|---------------------+----------------+----------------|
| Colorado            | Bow Mar        | Veejay Smith   |
| Tennessee           | Frankewing     | Vinn Allen     |
| New York            | Gasport        | Lisa McQueen   |
| Kansas              | Medicine Lodge | Bart Pitt      |
| Arizona             | Peeples Valley | NULL           |
| North Dakota        | Jessie         | Steve Simpson  |
| Nebraska            | Lisco          | Homer McKenzie |
| North Dakota        | Wimbledon      | Borat Lee      |
+---------------------+----------------+----------------+
(8 rows affected)

इस मामले में, हमारे पास एक शहर (पीपल्स वैली) है जिसमें अभी तक कोई ग्राहक नहीं है।

अब हम उस जानकारी को देख सकते हैं, क्योंकि लेफ्ट जॉइन रिटर्न पंक्तियों में लेफ्ट टेबल में डेटा होता है, भले ही लेफ्ट टेबल में कोई मैचिंग रो न हो।

पिछला उदाहरण जो दो आंतरिक जोड़ जोड़ता है, इस पंक्ति को वापस नहीं करता है, क्योंकि आंतरिक जुड़ाव दोनों तालिकाओं से बेजोड़ पंक्तियों को त्याग देता है। यह केवल पंक्तियों को लौटाता है जब दोनों तालिकाओं में कम से कम एक पंक्ति होती है जो शामिल होने की स्थिति से मेल खाती है।

नया नमूना डेटा - 3 अलग-अलग टेबल

शेष उदाहरणों के लिए, हम निम्नलिखित तालिकाओं का उपयोग करेंगे।

PetTypes तालिका:

+-------------+-----------+
| PetTypeId   | PetType   |
|-------------+-----------|
| 1           | Bird      |
| 2           | Cat       |
| 3           | Dog       |
| 4           | Rabbit    |
+-------------+-----------+
(4 rows affected)

Pets तालिका:

+---------+-------------+-----------+-----------+------------+
| PetId   | PetTypeId   | OwnerId   | PetName   | DOB        |
|---------+-------------+-----------+-----------+------------|
| 1       | 2           | 3         | Fluffy    | 2020-11-20 |
| 2       | 3           | 3         | Fetch     | 2019-08-16 |
| 3       | 2           | 2         | Scratch   | 2018-10-01 |
| 4       | 3           | 3         | Wag       | 2020-03-15 |
| 5       | 1           | 1         | Tweet     | 2020-11-28 |
| 6       | 3           | 4         | Fluffy    | 2020-09-17 |
| 7       | 3           | 2         | Bark      | NULL       |
| 8       | 2           | 4         | Meow      | NULL       |
+---------+-------------+-----------+-----------+------------+
(8 rows affected)

Owners तालिका:

+-----------+-------------+------------+----------------+-------------------+
| OwnerId   | FirstName   | LastName   | Phone          | Email             |
|-----------+-------------+------------+----------------+-------------------|
| 1         | Homer       | Connery    | (308) 555-0100 | [email protected] |
| 2         | Bart        | Pitt       | (231) 465-3497 | [email protected]  |
| 3         | Nancy       | Simpson    | (489) 591-0408 | NULL              |
| 4         | Boris       | Trump      | (349) 611-8908 | NULL              |
| 5         | Woody       | Eastwood   | (308) 555-0112 | [email protected] |
+-----------+-------------+------------+----------------+-------------------+

ध्यान दें कि:

  • PetTypeId Pets . का कॉलम तालिका PetTypeId . की एक विदेशी कुंजी है PetTypes का तालिका (जो उस तालिका की प्राथमिक कुंजी है)।
  • OwnerId Pets . का कॉलम तालिका OwnerId . की एक विदेशी कुंजी है Owners . का कॉलम टेबल.

उदाहरण 3 - बाएँ 3 तालिकाओं में शामिल हों

आइए दो लेफ्ट जॉइन का उपयोग करके थ्री-टेबल जॉइन करें।

यहां उन तालिकाओं के विरुद्ध दो बाएं जोड़ चलाने का एक उदाहरण दिया गया है।

SELECT 
    p.PetName,
    pt.PetType,
    CONCAT(o.FirstName, ' ', o.LastName) AS PetOwner
FROM Owners o LEFT JOIN Pets p
    ON p.OwnerId = o.OwnerId
LEFT JOIN PetTypes pt
    ON p.PetTypeId = pt.PetTypeId;

परिणाम:

+-----------+-----------+----------------+
| PetName   | PetType   | PetOwner       |
|-----------+-----------+----------------|
| Tweet     | Bird      | Homer Connery  |
| Scratch   | Cat       | Bart Pitt      |
| Bark      | Dog       | Bart Pitt      |
| Fluffy    | Cat       | Nancy Simpson  |
| Fetch     | Dog       | Nancy Simpson  |
| Wag       | Dog       | Nancy Simpson  |
| Fluffy    | Dog       | Boris Trump    |
| Meow      | Cat       | Boris Trump    |
| NULL      | NULL      | Woody Eastwood |
+-----------+-----------+----------------+
(9 rows affected)

यहां, हमारे पास एक पालतू जानवर का मालिक है जिसके पास कोई पालतू जानवर नहीं है। हम Pets.OwnerId . को देखकर इसकी पुष्टि कर सकते हैं कॉलम, और यह देखते हुए कि वुडी ईस्टवुड के OwnerId से मेल खाने वाला कोई मान नहीं है Owners . में टेबल।

उदाहरण 4 - 3 टेबल्स को राइट ज्वाइन करें

राइट जॉइन लेफ्ट जॉइन के विपरीत है। यहां उन्हीं तीन तालिकाओं का उपयोग करते हुए एक उदाहरण दिया गया है।

SELECT 
    p.PetName,
    pt.PetType,
    CONCAT(o.FirstName, ' ', o.LastName) AS PetOwner
FROM Pets p RIGHT JOIN Owners o 
    ON p.OwnerId = o.OwnerId
RIGHT JOIN PetTypes pt 
    ON p.PetTypeId = pt.PetTypeId;

परिणाम:

+-----------+-----------+---------------+
| PetName   | PetType   | PetOwner      |
|-----------+-----------+---------------|
| Tweet     | Bird      | Homer Connery |
| Fluffy    | Cat       | Nancy Simpson |
| Scratch   | Cat       | Bart Pitt     |
| Meow      | Cat       | Boris Trump   |
| Fetch     | Dog       | Nancy Simpson |
| Wag       | Dog       | Nancy Simpson |
| Fluffy    | Dog       | Boris Trump   |
| Bark      | Dog       | Bart Pitt     |
| NULL      | Rabbit    |               |
+-----------+-----------+---------------+
(9 rows affected)

इस बार हमें एक अतिरिक्त पालतू प्रकार मिला (Rabbit ), लेकिन अतिरिक्त मालिक नहीं। इसका कारण यह है कि दायां उन रिटर्न पंक्तियों में शामिल हो जाता है जिनमें दाएं तालिका में डेटा होता है, भले ही बाईं तालिका में कोई मेल खाने वाली पंक्तियां न हों।

वैसे, कारण पिछले PetOwner NULL नहीं है (पिछले की तरह PetName है) क्योंकि यह एक स्ट्रिंग संयोजन का परिणाम है। मैंने टी-एसक्यूएल का इस्तेमाल किया CONCAT() स्वामी के प्रथम और अंतिम नामों को जोड़ने का कार्य करता है।

उदाहरण 5 - 3 टेबल्स में पूर्ण रूप से शामिल हों

पूर्ण जुड़ाव एक में बाएँ और दाएँ शामिल होने जैसा है। यह सभी पंक्तियों को लौटाता है, जब तक कि किसी एक तालिका में मिलान डेटा है।

SELECT 
    p.PetName,
    pt.PetType,
    CONCAT(o.FirstName, ' ', o.LastName) AS PetOwner
FROM Owners o FULL JOIN Pets p
    ON p.OwnerId = o.OwnerId
FULL JOIN PetTypes pt
    ON p.PetTypeId = pt.PetTypeId;

परिणाम:

+-----------+-----------+----------------+
| PetName   | PetType   | PetOwner       |
|-----------+-----------+----------------|
| Tweet     | Bird      | Homer Connery  |
| Scratch   | Cat       | Bart Pitt      |
| Bark      | Dog       | Bart Pitt      |
| Fluffy    | Cat       | Nancy Simpson  |
| Fetch     | Dog       | Nancy Simpson  |
| Wag       | Dog       | Nancy Simpson  |
| Fluffy    | Dog       | Boris Trump    |
| Meow      | Cat       | Boris Trump    |
| NULL      | NULL      | Woody Eastwood |
| NULL      | Rabbit    |                |
+-----------+-----------+----------------+
(10 rows affected)

इस बार हमें पिछले दो उदाहरणों में मिले परिणामों का एक संयोजन मिलता है।

उदाहरण 6 - नेस्टेड जॉइन

जैसा कि बताया गया है, आप नेस्टेड जॉइन भी कर सकते हैं।

नेस्टेड जॉइन का एक उदाहरण यहां दिया गया है।

SELECT 
    p.PetName,
    pt.PetType,
    CONCAT(o.FirstName, ' ', o.LastName) AS PetOwner
FROM Owners o 
LEFT JOIN    (Pets p
        LEFT JOIN PetTypes pt
        ON p.PetTypeId = pt.PetTypeId)
ON p.OwnerId = o.OwnerId;

परिणाम:

+-----------+-----------+----------------+
| PetName   | PetType   | PetOwner       |
|-----------+-----------+----------------|
| Tweet     | Bird      | Homer Connery  |
| Scratch   | Cat       | Bart Pitt      |
| Bark      | Dog       | Bart Pitt      |
| Fluffy    | Cat       | Nancy Simpson  |
| Fetch     | Dog       | Nancy Simpson  |
| Wag       | Dog       | Nancy Simpson  |
| Fluffy    | Dog       | Boris Trump    |
| Meow      | Cat       | Boris Trump    |
| NULL      | NULL      | Woody Eastwood |
+-----------+-----------+----------------+
(9 rows affected)

  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. ईआर डेटा मॉडल का परिचय

  2. शुरुआती के लिए एसक्यूएल ड्रॉप टेबल

  3. संबंधपरक बनाम गैर-रिलेशनल डेटाबेस - भाग 1

  4. एसक्यूएल शुरुआती के लिए तालिका बनाएं

  5. विस्मयकारी सूचियाँ स्वयं बनाएं, या GitHub नोटबुक के रूप में