भाग 1 - सम्मिलित और संघ
इस उत्तर को शामिल किया गया:
- भाग 1
- एक आंतरिक जुड़ाव का उपयोग करके दो या अधिक तालिकाओं में शामिल होना ( अतिरिक्त जानकारी के लिए विकिपीडिया प्रविष्टि देखें )
- यूनियन क्वेरी का उपयोग कैसे करें
- बाएं और दाएं बाहरी जोड़ (यह स्टैकऑवरफ़्लो उत्तर जॉन्स के प्रकारों का वर्णन करने के लिए उत्कृष्ट है)
- क्वेरीज़ को इंटरसेक्ट करें (और अगर आपका डेटाबेस उनका समर्थन नहीं करता है, तो उन्हें कैसे पुन: पेश करें) - यह SQL- सर्वर का एक कार्य है ( जानकारी देखें ) और कारण का हिस्सा मैंने पहली बार में यह पूरी बात लिखी थी।
- भाग 2
- उपश्रेणियाँ - वे क्या हैं, उनका उपयोग कहाँ किया जा सकता है और क्या देखना है
- कार्टेशियन AKA से जुड़ता है - ओह, दुख!
एक डेटाबेस में कई तालिकाओं से डेटा पुनर्प्राप्त करने के कई तरीके हैं। इस उत्तर में, मैं ANSI-92 सिंटैक्स में शामिल होऊंगा। यह कई अन्य ट्यूटोरियल्स के लिए भिन्न हो सकता है जो पुराने ANSI-89 सिंटैक्स का उपयोग करते हैं (और यदि आप 89 के लिए उपयोग किए जाते हैं, तो बहुत कम सहज ज्ञान युक्त लग सकता है - लेकिन मैं कह सकता हूं कि यह कोशिश करना है) क्योंकि यह बहुत आसान है समझने के लिए जब प्रश्न अधिक जटिल होने लगते हैं। इसका उपयोग क्यों करें? क्या कोई प्रदर्शन लाभ है? संक्षिप्त उत्तर नहीं है, लेकिन यह है एक बार आप इसकी आदत हो पढ़ने में आसान। इस सिंटैक्स का उपयोग करके अन्य लोगों द्वारा लिखे गए प्रश्नों को पढ़ना आसान है।
मैं एक छोटे साइरड की अवधारणा का भी उपयोग करने जा रहा हूं, जिसमें एक डेटाबेस है कि वह किन कारों को उपलब्ध कराएगी। मालिक ने आपको अपने आईटी कंप्यूटर आदमी के रूप में काम पर रखा है और आपसे उम्मीद करता है कि आप उसे उस डेटा को छोड़ने में सक्षम होंगे जो वह टोपी के ड्रॉप पर पूछता है।
मैंने कई लुकअप टेबल बनाए हैं जिनका उपयोग अंतिम तालिका द्वारा किया जाएगा। यह हमें काम करने के लिए एक उचित मॉडल देगा। शुरू करने के लिए, मैं एक उदाहरण डेटाबेस के खिलाफ अपने प्रश्नों को चला रहा हूं जिसमें निम्न संरचना है। मैं सामान्य गलतियों के बारे में सोचने की कोशिश करूँगा जो बाहर शुरू करते समय की जाती हैं और समझाती हैं कि उनके साथ क्या गलत है - साथ ही साथ उन्हें सही करने का तरीका भी दिखाया गया है।
पहली तालिका केवल एक रंग लिस्टिंग है ताकि हम जान सकें कि कार यार्ड में हमारे पास कौन से रंग हैं।
mysql> create table colors(id int(3) not null auto_increment primary key,
-> color varchar(15), paint varchar(10));
Query OK, 0 rows affected (0.01 sec)
mysql> show columns from colors;
+-------+-------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+-------+-------------+------+-----+---------+----------------+
| id | int(3) | NO | PRI | NULL | auto_increment |
| color | varchar(15) | YES | | NULL | |
| paint | varchar(10) | YES | | NULL | |
+-------+-------------+------+-----+---------+----------------+
3 rows in set (0.01 sec)
mysql> insert into colors (color, paint) values ('Red', 'Metallic'),
-> ('Green', 'Gloss'), ('Blue', 'Metallic'),
-> ('White' 'Gloss'), ('Black' 'Gloss');
Query OK, 5 rows affected (0.00 sec)
Records: 5 Duplicates: 0 Warnings: 0
mysql> select * from colors;
+----+-------+----------+
| id | color | paint |
+----+-------+----------+
| 1 | Red | Metallic |
| 2 | Green | Gloss |
| 3 | Blue | Metallic |
| 4 | White | Gloss |
| 5 | Black | Gloss |
+----+-------+----------+
5 rows in set (0.00 sec)
ब्रांडों की तालिका अलग-अलग ब्रांडों की कारों की पहचान करती है जो कि शायद बाहर बेच सकती हैं।
mysql> create table brands (id int(3) not null auto_increment primary key,
-> brand varchar(15));
Query OK, 0 rows affected (0.01 sec)
mysql> show columns from brands;
+-------+-------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+-------+-------------+------+-----+---------+----------------+
| id | int(3) | NO | PRI | NULL | auto_increment |
| brand | varchar(15) | YES | | NULL | |
+-------+-------------+------+-----+---------+----------------+
2 rows in set (0.01 sec)
mysql> insert into brands (brand) values ('Ford'), ('Toyota'),
-> ('Nissan'), ('Smart'), ('BMW');
Query OK, 5 rows affected (0.00 sec)
Records: 5 Duplicates: 0 Warnings: 0
mysql> select * from brands;
+----+--------+
| id | brand |
+----+--------+
| 1 | Ford |
| 2 | Toyota |
| 3 | Nissan |
| 4 | Smart |
| 5 | BMW |
+----+--------+
5 rows in set (0.00 sec)
मॉडल तालिका विभिन्न प्रकार की कारों को कवर करेगी, इसके लिए वास्तविक कार मॉडल के बजाय विभिन्न कार प्रकारों का उपयोग करना सरल होगा।
mysql> create table models (id int(3) not null auto_increment primary key,
-> model varchar(15));
Query OK, 0 rows affected (0.01 sec)
mysql> show columns from models;
+-------+-------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+-------+-------------+------+-----+---------+----------------+
| id | int(3) | NO | PRI | NULL | auto_increment |
| model | varchar(15) | YES | | NULL | |
+-------+-------------+------+-----+---------+----------------+
2 rows in set (0.00 sec)
mysql> insert into models (model) values ('Sports'), ('Sedan'), ('4WD'), ('Luxury');
Query OK, 4 rows affected (0.00 sec)
Records: 4 Duplicates: 0 Warnings: 0
mysql> select * from models;
+----+--------+
| id | model |
+----+--------+
| 1 | Sports |
| 2 | Sedan |
| 3 | 4WD |
| 4 | Luxury |
+----+--------+
4 rows in set (0.00 sec)
और अंत में, इन सभी अन्य तालिकाओं को टाई करने के लिए, तालिका जो सब कुछ एक साथ बाँधती है। आईडी फ़ील्ड वास्तव में कारों की पहचान करने के लिए इस्तेमाल किया जाने वाला अद्वितीय लॉट नंबर है।
mysql> create table cars (id int(3) not null auto_increment primary key,
-> color int(3), brand int(3), model int(3));
Query OK, 0 rows affected (0.01 sec)
mysql> show columns from cars;
+-------+--------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+-------+--------+------+-----+---------+----------------+
| id | int(3) | NO | PRI | NULL | auto_increment |
| color | int(3) | YES | | NULL | |
| brand | int(3) | YES | | NULL | |
| model | int(3) | YES | | NULL | |
+-------+--------+------+-----+---------+----------------+
4 rows in set (0.00 sec)
mysql> insert into cars (color, brand, model) values (1,2,1), (3,1,2), (5,3,1),
-> (4,4,2), (2,2,3), (3,5,4), (4,1,3), (2,2,1), (5,2,3), (4,5,1);
Query OK, 10 rows affected (0.00 sec)
Records: 10 Duplicates: 0 Warnings: 0
mysql> select * from cars;
+----+-------+-------+-------+
| id | color | brand | model |
+----+-------+-------+-------+
| 1 | 1 | 2 | 1 |
| 2 | 3 | 1 | 2 |
| 3 | 5 | 3 | 1 |
| 4 | 4 | 4 | 2 |
| 5 | 2 | 2 | 3 |
| 6 | 3 | 5 | 4 |
| 7 | 4 | 1 | 3 |
| 8 | 2 | 2 | 1 |
| 9 | 5 | 2 | 3 |
| 10 | 4 | 5 | 1 |
+----+-------+-------+-------+
10 rows in set (0.00 sec)
इससे हमें विभिन्न प्रकार के जुड़नों के नीचे के उदाहरणों को कवर करने के लिए पर्याप्त डेटा (मुझे आशा है) मिलेगा और उन्हें सार्थक बनाने के लिए पर्याप्त डेटा भी देगा।
इसलिए इसकी चपेट में आकर , बॉस के पास सभी स्पोर्ट्स कारों की आईडी जानना चाहता है ।
यह एक साधारण दो टेबल जॉइन है। हमारे पास एक तालिका है जो मॉडल और तालिका में उपलब्ध स्टॉक के साथ की पहचान करती है। जैसा कि आप देख सकते हैं, तालिका के model
स्तंभ का डेटा हमारे पास मौजूद तालिका cars
के models
स्तंभ से संबंधित cars
है। अब, हम जानते हैं कि मॉडल तालिका में एक आईडी है 1
, Sports
जिससे जुड़ने के लिए लिख सकते हैं।
select
ID,
model
from
cars
join models
on model=ID
तो यह प्रश्न सही लगता है? हमने दो तालिकाओं की पहचान की है और हमारे पास आवश्यक जानकारी का उपयोग करते हैं और एक ऐसे जुड़ाव का उपयोग करते हैं जो सही ढंग से पहचानता है कि किस स्तंभ को शामिल होना है।
ERROR 1052 (23000): Column 'ID' in field list is ambiguous
अरे नहीं! हमारी पहली क्वेरी में एक त्रुटि! हाँ, और यह एक बेर है। आप देखते हैं, क्वेरी को वास्तव में सही कॉलम मिला है, लेकिन उनमें से कुछ दोनों तालिकाओं में मौजूद हैं, इसलिए डेटाबेस भ्रमित हो जाता है कि हम वास्तविक कॉलम का क्या मतलब है और कहां हैं। इसके समाधान के लिए दो उपाय हैं। पहला अच्छा और सरल है, हम tableName.columnName
डेटाबेस का उपयोग वास्तव में हमारे कहने का उपयोग कर सकते हैं , जैसे:
select
cars.ID,
models.model
from
cars
join models
on cars.model=models.ID
+----+--------+
| ID | model |
+----+--------+
| 1 | Sports |
| 3 | Sports |
| 8 | Sports |
| 10 | Sports |
| 2 | Sedan |
| 4 | Sedan |
| 5 | 4WD |
| 7 | 4WD |
| 9 | 4WD |
| 6 | Luxury |
+----+--------+
10 rows in set (0.00 sec)
दूसरे को शायद अधिक बार उपयोग किया जाता है और इसे टेबल अलियासिंग कहा जाता है। इस उदाहरण में तालिकाओं में अच्छे और छोटे सरल नाम हैं, लेकिन कुछ टाइप करने से KPI_DAILY_SALES_BY_DEPARTMENT
शायद जल्दी पुराना हो जाएगा, इसलिए एक सरल तरीका इस तरह तालिका को उपनाम देना है:
select
a.ID,
b.model
from
cars a
join models b
on a.model=b.ID
अब, वापस अनुरोध करने के लिए। जैसा कि आप देख सकते हैं कि हमारे पास वह जानकारी है जिसकी हमें आवश्यकता है, लेकिन हमारे पास ऐसी जानकारी भी है, जिसके लिए हमें नहीं पूछा गया था, इसलिए हमें केवल स्पोर्ट्स कार प्राप्त करने के लिए कथन में एक खंड शामिल करने की आवश्यकता है। जैसा कि मैं टेबल के नामों का उपयोग करने के बजाय तालिका उपनाम विधि को पसंद करता हूं, मैं इस बिंदु से उस पर चिपका रहूंगा।
स्पष्ट रूप से, हमें अपनी क्वेरी में एक क्लॉज़ जोड़ने की आवश्यकता है। हम स्पोर्ट्स कारों की पहचान ID=1
या तो कर सकते हैं model='Sports'
। जैसा कि आईडी अनुक्रमित है और प्राथमिक कुंजी (और यह कम टाइपिंग होती है), हमारी क्वेरी में इसका उपयोग करने देती है।
select
a.ID,
b.model
from
cars a
join models b
on a.model=b.ID
where
b.ID=1
+----+--------+
| ID | model |
+----+--------+
| 1 | Sports |
| 3 | Sports |
| 8 | Sports |
| 10 | Sports |
+----+--------+
4 rows in set (0.00 sec)
बिंगो! बॉस खुश है। बेशक, एक मालिक होने के नाते और उसने जो भी मांगा उससे खुश नहीं, वह जानकारी देखता है, फिर कहता है मुझे भी रंग चाहिए ।
ठीक है, इसलिए हमारे पास पहले से लिखित हमारी क्वेरी का एक अच्छा हिस्सा है, लेकिन हमें एक तीसरी तालिका का उपयोग करने की आवश्यकता है जो कि रंग है। अब, हमारी मुख्य सूचना तालिका cars
कार रंग आईडी को संग्रहीत करती है और यह वापस रंग आईडी कॉलम से जुड़ती है। तो, मूल के समान तरीके से, हम एक तीसरी तालिका में शामिल हो सकते हैं:
select
a.ID,
b.model
from
cars a
join models b
on a.model=b.ID
join colors c
on a.color=c.ID
where
b.ID=1
+----+--------+
| ID | model |
+----+--------+
| 1 | Sports |
| 3 | Sports |
| 8 | Sports |
| 10 | Sports |
+----+--------+
4 rows in set (0.00 sec)
लानत, यद्यपि तालिका सही ढंग से शामिल हो गई थी और संबंधित कॉलम जुड़े हुए थे, हम उस नई तालिका से वास्तविक जानकारी में खींचना भूल गए जिसे हमने जोड़ा था।
select
a.ID,
b.model,
c.color
from
cars a
join models b
on a.model=b.ID
join colors c
on a.color=c.ID
where
b.ID=1
+----+--------+-------+
| ID | model | color |
+----+--------+-------+
| 1 | Sports | Red |
| 8 | Sports | Green |
| 10 | Sports | White |
| 3 | Sports | Black |
+----+--------+-------+
4 rows in set (0.00 sec)
ठीक है, कि एक पल के लिए हमारी पीठ पीछे बॉस है। अब, इसके बारे में कुछ और विस्तार से बताने के लिए। जैसा कि आप देख सकते हैं, from
हमारे बयान में खंड हमारी मुख्य तालिका को जोड़ता है (मैं अक्सर एक तालिका का उपयोग करता हूं जिसमें लुकअप या आयाम तालिका के बजाय जानकारी होती है। क्वेरी बस के रूप में अच्छी तरह से चारों ओर स्विच टेबल के साथ काम करेगी, लेकिन जब कम समझ में आता है। हम कुछ महीनों के समय में इसे पढ़ने के लिए इस क्वेरी पर वापस आते हैं, इसलिए अक्सर एक क्वेरी लिखने की कोशिश करना सबसे अच्छा होता है जो समझने में आसान और आसान होगा - इसे सहज रूप से बाहर रखें, अच्छी इंडेंटिंग का उपयोग करें ताकि सब कुछ जितना स्पष्ट हो सके यह हो सकता है। यदि आप दूसरों को सिखाने के लिए जाते हैं, तो इन विशेषताओं को उनके प्रश्नों में डालने की कोशिश करें - खासकर यदि आप उन्हें समस्या निवारण करेंगे।
इस तरीके से अधिक से अधिक तालिकाओं को जोड़ना पूरी तरह से संभव है।
select
a.ID,
b.model,
c.color
from
cars a
join models b
on a.model=b.ID
join colors c
on a.color=c.ID
join brands d
on a.brand=d.ID
where
b.ID=1
जबकि मैं एक तालिका को शामिल करना भूल गया, जहाँ हम join
कथन में एक से अधिक कॉलम में शामिल होना चाहते हैं , यहाँ एक उदाहरण है। यदि models
तालिका में ब्रांड-विशिष्ट मॉडल होते थे और इसलिए एक स्तंभ भी होता था , जिसे फ़ील्ड पर brand
वापस brands
तालिका से जोड़ा जाता है ID
, तो इसे निम्न प्रकार से किया जा सकता है:
select
a.ID,
b.model,
c.color
from
cars a
join models b
on a.model=b.ID
join colors c
on a.color=c.ID
join brands d
on a.brand=d.ID
and b.brand=d.ID
where
b.ID=1
आप देख सकते हैं, ऊपर दी गई क्वेरी न केवल ज्वाइन की गई टेबलों को मेन टेबल से जोड़ती है cars
, बल्कि पहले से ही शामिल टेबलों के बीच जॉइन को भी निर्दिष्ट करती है। यदि ऐसा नहीं किया गया था, तो परिणाम को कार्टेशियन जॉइन कहा जाता है - जो कि डीबीए खराब के लिए बोलता है। एक कार्टेज़ियन जॉइन वह होता है जहाँ पंक्तियों को लौटाया जाता है क्योंकि जानकारी डेटाबेस को यह नहीं बताती है कि परिणामों को कैसे सीमित किया जाए, इसलिए क्वेरी उन सभी पंक्तियों को लौटाती है जो मापदंड को फिट करती हैं।
इसलिए, एक कार्टेशियन में शामिल होने का एक उदाहरण देने के लिए, निम्नलिखित प्रश्न को चलाने दें:
select
a.ID,
b.model
from
cars a
join models b
+----+--------+
| ID | model |
+----+--------+
| 1 | Sports |
| 1 | Sedan |
| 1 | 4WD |
| 1 | Luxury |
| 2 | Sports |
| 2 | Sedan |
| 2 | 4WD |
| 2 | Luxury |
| 3 | Sports |
| 3 | Sedan |
| 3 | 4WD |
| 3 | Luxury |
| 4 | Sports |
| 4 | Sedan |
| 4 | 4WD |
| 4 | Luxury |
| 5 | Sports |
| 5 | Sedan |
| 5 | 4WD |
| 5 | Luxury |
| 6 | Sports |
| 6 | Sedan |
| 6 | 4WD |
| 6 | Luxury |
| 7 | Sports |
| 7 | Sedan |
| 7 | 4WD |
| 7 | Luxury |
| 8 | Sports |
| 8 | Sedan |
| 8 | 4WD |
| 8 | Luxury |
| 9 | Sports |
| 9 | Sedan |
| 9 | 4WD |
| 9 | Luxury |
| 10 | Sports |
| 10 | Sedan |
| 10 | 4WD |
| 10 | Luxury |
+----+--------+
40 rows in set (0.00 sec)
अच्छा भगवान, यह बदसूरत है। हालाँकि, जहाँ तक डेटाबेस का सवाल है, यह वही है जो पूछा गया था। क्वेरी में, हम के लिए के लिए कहा ID
से cars
और model
से models
। साथ ही, हम निर्दिष्ट नहीं किया है कैसे तालिकाओं में शामिल होने, डेटाबेस से मेल खाता है कि हर पहली तालिका से पंक्ति के साथ हर दूसरी तालिका से पंक्ति।
ठीक है, इसलिए बॉस वापस आ गया है, और वह फिर से अधिक जानकारी चाहता है। मुझे वही सूची चाहिए, लेकिन इसमें 4WD भी शामिल हैं ।
हालांकि, यह हमें इसे पूरा करने के दो अलग-अलग तरीकों को देखने के लिए एक महान बहाना देता है। हम इस तरह से एक और शर्त जोड़ सकते हैं:
select
a.ID,
b.model,
c.color
from
cars a
join models b
on a.model=b.ID
join colors c
on a.color=c.ID
join brands d
on a.brand=d.ID
where
b.ID=1
or b.ID=3
जबकि ऊपर पूरी तरह से अच्छी तरह से काम करेगा, चलो इसे अलग तरीके से देखते हैं, यह एक शानदार बहाना है कि यह कैसे union
काम करेगा।
हम जानते हैं कि निम्नलिखित सभी स्पोर्ट्स कारें वापस आएँगी:
select
a.ID,
b.model,
c.color
from
cars a
join models b
on a.model=b.ID
join colors c
on a.color=c.ID
join brands d
on a.brand=d.ID
where
b.ID=1
और निम्नलिखित सभी 4WDs लौटाएगा:
select
a.ID,
b.model,
c.color
from
cars a
join models b
on a.model=b.ID
join colors c
on a.color=c.ID
join brands d
on a.brand=d.ID
where
b.ID=3
इसलिए union all
उनके बीच एक खंड जोड़कर , दूसरी क्वेरी के परिणामों को पहले क्वेरी के परिणामों से जोड़ दिया जाएगा।
select
a.ID,
b.model,
c.color
from
cars a
join models b
on a.model=b.ID
join colors c
on a.color=c.ID
join brands d
on a.brand=d.ID
where
b.ID=1
union all
select
a.ID,
b.model,
c.color
from
cars a
join models b
on a.model=b.ID
join colors c
on a.color=c.ID
join brands d
on a.brand=d.ID
where
b.ID=3
+----+--------+-------+
| ID | model | color |
+----+--------+-------+
| 1 | Sports | Red |
| 8 | Sports | Green |
| 10 | Sports | White |
| 3 | Sports | Black |
| 5 | 4WD | Green |
| 7 | 4WD | White |
| 9 | 4WD | Black |
+----+--------+-------+
7 rows in set (0.00 sec)
जैसा कि आप देख सकते हैं, पहले क्वेरी के परिणाम पहले लौटाए जाते हैं, उसके बाद दूसरे क्वेरी के परिणाम।
इस उदाहरण में, यह निश्चित रूप से पहली क्वेरी का उपयोग करने के लिए बहुत आसान होगा, लेकिन union
विशिष्ट मामलों के लिए प्रश्न महान हो सकते हैं। वे तालिकाओं से तालिकाओं से विशिष्ट परिणाम वापस करने का एक शानदार तरीका है जो आसानी से एक साथ शामिल नहीं होते हैं - या उस मामले के लिए पूरी तरह से असंबंधित तालिकाओं के लिए। हालांकि पालन करने के लिए कुछ नियम हैं।
- पहली क्वेरी से स्तंभ प्रकार नीचे दिए गए प्रत्येक क्वेरी से स्तंभ प्रकार से मेल खाना चाहिए।
- परिणामों के पूरे सेट की पहचान करने के लिए पहली क्वेरी से कॉलम के नाम का उपयोग किया जाएगा।
- प्रत्येक क्वेरी में कॉलम की संख्या समान होनी चाहिए।
अब, आप सोच रहे होंगे कि उपयोग करने में क्या अंतर है union
और union all
। एक union
क्वेरी डुप्लिकेट हटा देगा, जबकि एक union all
नहीं होगा। इसका मतलब यह है कि union
ओवर का उपयोग करते समय एक छोटा प्रदर्शन होता है, union all
लेकिन परिणाम इसके लायक हो सकते हैं - मैं इस तरह की चीज पर अटकल नहीं लगाऊंगा।
इस नोट पर, यहां कुछ अतिरिक्त नोटों को ध्यान देने योग्य हो सकता है।
- यदि हम परिणाम का आदेश देना चाहते हैं, तो हम उपयोग कर सकते हैं,
order by
लेकिन आप अब और उपनाम का उपयोग नहीं कर सकते। उपरोक्त क्वेरी में, किसी order by a.ID
को जोड़ने से एक त्रुटि होगी - जहां तक परिणाम का संबंध है, कॉलम को ID
इसके बजाय कहा जाता है a.ID
- भले ही दोनों प्रश्नों में समान उपनाम का उपयोग किया गया हो।
- हमारे पास केवल एक
order by
बयान हो सकता है, और यह अंतिम कथन के रूप में होना चाहिए।
अगले उदाहरणों के लिए, हम अपनी तालिकाओं में कुछ अतिरिक्त पंक्तियों को जोड़ रहे हैं।
मैंने Holden
ब्रांडों की तालिका में जोड़ा है। मैंने इसमें एक पंक्ति भी जोड़ी cars
है जिसका color
मूल्य है 12
- जिसका रंग तालिका में कोई संदर्भ नहीं है।
ठीक है, बॉस फिर से वापस आ गया है, बाहर अनुरोधों को भौंकते हुए - * मुझे प्रत्येक ब्रांड की एक गिनती चाहिए जो हम ले जाते हैं और उसमें कारों की संख्या! ' ।
राइट्यो, इसलिए पहली चीज जो हमें करने की आवश्यकता है वह है संभावित ब्रांडों की पूरी सूची।
select
a.brand
from
brands a
+--------+
| brand |
+--------+
| Ford |
| Toyota |
| Nissan |
| Smart |
| BMW |
| Holden |
+--------+
6 rows in set (0.00 sec)
अब, जब हम इसे अपनी कार तालिका में शामिल करते हैं, तो हमें निम्नलिखित परिणाम मिलते हैं:
select
a.brand
from
brands a
join cars b
on a.ID=b.brand
group by
a.brand
+--------+
| brand |
+--------+
| BMW |
| Ford |
| Nissan |
| Smart |
| Toyota |
+--------+
5 rows in set (0.00 sec)
जो निश्चित रूप से एक समस्या है - हम उस प्यारे Holden
ब्रांड का कोई उल्लेख नहीं देख रहे हैं जो मैंने जोड़ा है।
ऐसा इसलिए है क्योंकि दोनों तालिकाओं में मेल खाने वाली पंक्तियों के लिए एक जुड़ाव दिखता है । जैसा कि कारों में कोई डेटा नहीं होता है जो कि प्रकार का Holden
होता है, इसे वापस नहीं किया जाता है। यह वह जगह है जहाँ हम एक outer
जॉइन का उपयोग कर सकते हैं । यह एक तालिका से सभी परिणाम लौटाएगा कि क्या वे दूसरी तालिका में मेल खाते हैं या नहीं:
select
a.brand
from
brands a
left outer join cars b
on a.ID=b.brand
group by
a.brand
+--------+
| brand |
+--------+
| BMW |
| Ford |
| Holden |
| Nissan |
| Smart |
| Toyota |
+--------+
6 rows in set (0.00 sec)
अब जब हमारे पास ऐसा है, तो हम एक गिनती प्राप्त करने के लिए एक प्यारा समुच्चय फ़ंक्शन जोड़ सकते हैं और एक पल के लिए बॉस को वापस पा सकते हैं।
select
a.brand,
count(b.id) as countOfBrand
from
brands a
left outer join cars b
on a.ID=b.brand
group by
a.brand
+--------+--------------+
| brand | countOfBrand |
+--------+--------------+
| BMW | 2 |
| Ford | 2 |
| Holden | 0 |
| Nissan | 1 |
| Smart | 1 |
| Toyota | 5 |
+--------+--------------+
6 rows in set (0.00 sec)
और उस के साथ, बॉस की खोपड़ी को दूर।
अब, इसे कुछ और विस्तार से समझाने के लिए, बाहरी जोड़ left
या right
प्रकार के हो सकते हैं । लेफ्ट या राईट परिभाषित करता है कि कौन सी तालिका पूरी तरह से शामिल है। ए left outer join
में बाईं ओर तालिका से सभी पंक्तियां शामिल होंगी, जबकि (आपने यह अनुमान लगाया था) right outer join
तालिका के सभी परिणामों को दाईं ओर परिणामों में लाता है।
कुछ डेटाबेस दोनों तालिकाओं full outer join
से परिणाम (जो मिलान या नहीं) वापस लाएंगे , लेकिन यह सभी डेटाबेस में समर्थित नहीं है।
अब, मैं शायद इस बिंदु पर समय में आंकड़ा कर रहा हूं, आप सोच रहे हैं कि क्या आप किसी प्रकार के क्वेरी में विलय कर सकते हैं या नहीं - और जवाब हां है, आप बिल्कुल कर सकते हैं।
select
b.brand,
c.color,
count(a.id) as countOfBrand
from
cars a
right outer join brands b
on b.ID=a.brand
join colors c
on a.color=c.ID
group by
a.brand,
c.color
+--------+-------+--------------+
| brand | color | countOfBrand |
+--------+-------+--------------+
| Ford | Blue | 1 |
| Ford | White | 1 |
| Toyota | Black | 1 |
| Toyota | Green | 2 |
| Toyota | Red | 1 |
| Nissan | Black | 1 |
| Smart | White | 1 |
| BMW | Blue | 1 |
| BMW | White | 1 |
+--------+-------+--------------+
9 rows in set (0.00 sec)
तो, ऐसा क्यों नहीं है जो अपेक्षित परिणाम थे? ऐसा इसलिए है क्योंकि हमने कारों से ब्रांडों में बाहरी जुड़ाव का चयन किया है, लेकिन रंगों में शामिल होने के लिए इसे निर्दिष्ट नहीं किया गया था - इसलिए कि विशेष रूप से जुड़ने से दोनों तालिकाओं में मैच के परिणाम वापस आ जाएंगे।
यहां वह क्वेरी है जो अपेक्षित परिणाम प्राप्त करने के लिए काम करेगी:
select
a.brand,
c.color,
count(b.id) as countOfBrand
from
brands a
left outer join cars b
on a.ID=b.brand
left outer join colors c
on b.color=c.ID
group by
a.brand,
c.color
+--------+-------+--------------+
| brand | color | countOfBrand |
+--------+-------+--------------+
| BMW | Blue | 1 |
| BMW | White | 1 |
| Ford | Blue | 1 |
| Ford | White | 1 |
| Holden | NULL | 0 |
| Nissan | Black | 1 |
| Smart | White | 1 |
| Toyota | NULL | 1 |
| Toyota | Black | 1 |
| Toyota | Green | 2 |
| Toyota | Red | 1 |
+--------+-------+--------------+
11 rows in set (0.00 sec)
जैसा कि हम देख सकते हैं, हमारे पास क्वेरी में दो बाहरी जोड़ हैं और परिणाम उम्मीद के मुताबिक आ रहे हैं।
अब, उन अन्य प्रकार के जोड़ों के बारे में आप कैसे पूछते हैं? अंतर के बारे में क्या?
ठीक है, सभी डेटाबेस समर्थन नहीं करते हैं, intersection
लेकिन बहुत अधिक सभी डेटाबेस आपको एक सम्मिलित (या एक अच्छी तरह से संरचित जहां कथन कम से कम) के माध्यम से एक चौराहे बनाने की अनुमति देगा।
एक आंतरिकता union
ऊपर वर्णित के अनुसार कुछ प्रकार से जुड़ने का एक प्रकार है - लेकिन अंतर यह है कि यह केवल डेटा की पंक्तियाँ देता है जो संघ द्वारा शामिल किए गए विभिन्न व्यक्तिगत प्रश्नों के बीच समान हैं (और मेरा मतलब समान है)। केवल वही पंक्तियाँ जो हर संबंध में समान हैं, उन्हें वापस कर दिया जाएगा।
एक सरल उदाहरण इस प्रकार होगा:
select
*
from
colors
where
ID>2
intersect
select
*
from
colors
where
id<4
जबकि एक सामान्य union
क्वेरी तालिका की सभी पंक्तियों को वापस कर देगी (पहली क्वेरी जो कुछ भी लौटाती है ID>2
और दूसरी कुछ भी हो ID<4
) जिसके परिणामस्वरूप एक पूर्ण सेट होगा, एक प्रतिच्छेद क्वेरी केवल पंक्ति मिलान id=3
को लौटाएगी क्योंकि यह दोनों मानदंडों को पूरा करती है।
अब, यदि आपका डेटाबेस किसी intersect
क्वेरी का समर्थन नहीं करता है , तो उपरोक्त को निम्नलिखित क्वेरी के साथ आसानी से शामिल किया जा सकता है:
select
a.ID,
a.color,
a.paint
from
colors a
join colors b
on a.ID=b.ID
where
a.ID>2
and b.ID<4
+----+-------+----------+
| ID | color | paint |
+----+-------+----------+
| 3 | Blue | Metallic |
+----+-------+----------+
1 row in set (0.00 sec)
यदि आप एक डेटाबेस का उपयोग करके दो अलग-अलग तालिकाओं में एक चौराहे का प्रदर्शन करना चाहते हैं जो अंतःक्रियात्मक क्वेरी का समर्थन नहीं करता है, तो आपको तालिकाओं के प्रत्येक स्तंभ पर एक जुड़ाव बनाने की आवश्यकता होगी ।