अवलंबून टेबल
आता आपल्या प्रश्नांना थोडे क्लिष्ट करूया. आमच्या डेटाबेसमध्ये आमच्या कर्मचार्यांसाठी कार्यांसह एक नवीन कार्य सारणी जोडूया. आणि त्यात कोणत्या नोंदी आहेत ते पाहूया:
SELECT * FROM task
अशा विनंतीचा परिणाम:
आयडी | कर्मचारी_आयडी | नाव | अंतिम मुदत |
---|---|---|---|
१ | १ | फ्रंटएंडवरील बगचे निराकरण करा | 2022-06-01 |
2 | 2 | बॅकएंडवरील बगचे निराकरण करा | 2022-06-15 |
3 | ५ | कॉफी विकत घ्या | 2022-07-01 |
4 | ५ | कॉफी विकत घ्या | 2022-08-01 |
५ | ५ | कॉफी विकत घेईन | 2022-09-01 |
6 | (निरर्थक) | ऑफिसची साफसफाई करा | (निरर्थक) |
७ | 4 | जीवनाचा आनंद घे | (निरर्थक) |
8 | 6 | जीवनाचा आनंद घे | (निरर्थक) |
या सारणीमध्ये फक्त 4 स्तंभ आहेत:
- id — अद्वितीय कार्य क्रमांक (आणि टेबलमधील पंक्ती);
- कर्मचारी_आयडी — कर्मचारी टेबलमधील कर्मचाऱ्याचा आयडी ज्याला कार्य नियुक्त केले आहे;
- नाव - नाव आणि कार्याचे वर्णन;
- अंतिम मुदत - ज्या वेळेत कार्य पूर्ण करणे आवश्यक आहे.
काही बारीकसारीक गोष्टींकडे लक्ष द्या. टास्क N6 मध्ये कर्मचारी_आयडी नाही, आमच्याकडे क्लिनर नाही. कार्य आहे, परंतु कलाकार नाही. असे घडत असते, असे घडू शकते.
तसेच, 6-9 कार्यांना निश्चित अंतिम मुदत नसते. जेव्हा एखादे कार्य नियमितपणे आणि सतत केले पाहिजे तेव्हा असे होते. उदाहरणार्थ, ऑफिसला दररोज स्वच्छ करणे आवश्यक आहे, परंतु आपल्याला दररोज जीवनाचा आनंद घेणे देखील आवश्यक आहे :)
जर एक टेबल दुसर्या सारणीतील आयडी वापरत असेल तर अशा सारणीला अवलंबित असे म्हणतात .
एकाधिक सारण्यांविरूद्ध क्वेरी
येथे आपण टास्क टेबलमध्ये पाहतो की "जीवनाचा आनंद घेणे" दोन कार्ये आहेत. हे भाग्यवान कोण आहेत हे कसे कळेल?
हे करण्यासाठी, SQL मध्ये, तुम्ही एकाच वेळी दोन टेबलवर क्वेरी कार्यान्वित करू शकता. सर्वसाधारणपणे, SQL मध्ये, तुम्ही एकाच वेळी कितीही टेबल्सची क्वेरी करू शकता. अशा विनंतीचे सामान्य स्वरूप आहे:
SELECT columns
FROM Table 1, table 2, tableN
महत्वाचे! आपण एकाच वेळी अनेक सारण्यांवर क्वेरी लिहिल्यास, परिणामी आपल्याला टेबल पंक्तींचे तथाकथित कार्टेशियन उत्पादन मिळेल. पहिल्या सारणीतील प्रत्येक पंक्ती दुस-या सारणीच्या प्रत्येक पंक्तीवर चिकटलेली असेल आणि असेच.
म्हणजेच, जर तुमच्याकडे पहिल्या टेबलमध्ये 5 पंक्ती आणि दुसऱ्यामध्ये 10 पंक्ती असतील, तर तुमच्याकडे एकूण 50 पंक्ती असतील. Java मध्ये, ही क्वेरी यासारखी दिसेल:
for (String row1 : table1)
{
for (String row2 : table2)
{
System.out.println(row1 + row2);
}
}
चला आमची क्वेरी एकाच वेळी दोन टेबलवर लिहू आणि काय होते ते पाहू:
SELECT * FROM employee, task
आणि या क्वेरीचा परिणाम:
आयडी | नाव | व्यवसाय | पगार | वय | आयडी | कर्मचारी | _id | नाव | अंतिम मुदत |
---|---|---|---|---|---|---|---|---|---|
१ | इव्हानोव्ह इव्हान | प्रोग्रामर | 100000 | २५ | १ | १ | फ्रंटएंडवरील बगचे निराकरण करा | 2022-06-01 | |
2 | पेट्रोव्ह पेत्र | प्रोग्रामर | 80000 | 23 | १ | १ | फ्रंटएंडवरील बगचे निराकरण करा | 2022-06-01 | |
3 | इव्हानोव्ह सेर्गे | परीक्षक | 40000 | तीस | १ | १ | फ्रंटएंडवरील बगचे निराकरण करा | 2022-06-01 | |
4 | राबिनोविच मोइशा | दिग्दर्शक | 200000 | 35 | १ | १ | फ्रंटएंडवरील बगचे निराकरण करा | 2022-06-01 | |
५ | किरिएन्को अनास्तासिया | कार्यालय व्यवस्थापक | 40000 | २५ | १ | १ | फ्रंटएंडवरील बगचे निराकरण करा | 2022-06-01 | |
6 | वास्का | मांजर | 1000 | 3 | १ | १ | फ्रंटएंडवरील बगचे निराकरण करा | 2022-06-01 | |
१ | इव्हानोव्ह इव्हान | प्रोग्रामर | 100000 | २५ | 2 | 2 | बॅकएंडवरील बगचे निराकरण करा | 2022-06-15 | |
2 | पेट्रोव्ह पेत्र | प्रोग्रामर | 80000 | 23 | 2 | 2 | बॅकएंडवरील बगचे निराकरण करा | 2022-06-15 | |
3 | इव्हानोव्ह सेर्गे | परीक्षक | 40000 | तीस | 2 | 2 | बॅकएंडवरील बगचे निराकरण करा | 2022-06-15 | |
4 | राबिनोविच मोइशा | दिग्दर्शक | 200000 | 35 | 2 | 2 | बॅकएंडवरील बगचे निराकरण करा | 2022-06-15 | |
५ | किरिएन्को अनास्तासिया | कार्यालय व्यवस्थापक | 40000 | २५ | 2 | 2 | बॅकएंडवरील बगचे निराकरण करा | 2022-06-15 |
आमच्याकडे एकूण 48 निकाल ओळी आहेत, परंतु मी येथे फक्त 11 दिल्या आहेत. अन्यथा, तेथे पुरेशी जागा राहणार नाही.
तीन गोष्टींकडे लक्ष द्या:
- समान नावे असलेले स्तंभ: id . हा कर्मचारी टेबलचा आयडी आहे आणि टास्क टेबलचा आयडी आहे .
- प्रत्येक सारणीच्या पंक्ती पुनरावृत्ती केल्या जातात. डाव्या स्तंभात, ID 6 नंतर ID = 1 पुन्हा येतो.
- आमच्याकडे निरर्थक पंक्ती आहेत जिथे, उदाहरणार्थ, आयडी (कर्मचारी टेबलमधून) 6 आहे आणि त्याच पंक्तीमध्ये कर्मचारी_आयडी 1 आहे.
निरर्थक ओळी काढून टाकणे
आमच्या परिणामी सारणीमध्ये बर्याच पंक्ती आहेत , जे कर्मचारी आणि कार्य या दोन सारण्यांच्या सर्व पंक्तींचे कार्टेशियन उत्पादन आहे .
तार्किकदृष्ट्या, जर पंक्ती कर्मचारी_आयडी 3 असेल, तर ती फक्त कर्मचारी टेबलवरील पंक्तीला चिकटली पाहिजे जिथे आयडी 3 आहे. चला WHERE सह हा गैरसमज दूर करण्याचा प्रयत्न करूया.
चला अशी एक क्वेरी लिहूया:
SELECT * FROM employee, task
WHERE emploee.id = task.emploee_id
आणि या क्वेरीचा परिणाम:
आयडी | नाव | व्यवसाय | पगार | वय | आयडी | कर्मचारी_आयडी | नाव | अंतिम मुदत |
---|---|---|---|---|---|---|---|---|
१ | इव्हानोव्ह इव्हान | प्रोग्रामर | 100000 | २५ | १ | १ | फ्रंटएंडवरील बगचे निराकरण करा | 2022-06-01 |
2 | पेट्रोव्ह पेत्र | प्रोग्रामर | 80000 | 23 | 2 | 2 | बॅकएंडवरील बगचे निराकरण करा | 2022-06-15 |
4 | राबिनोविच मोइशा | दिग्दर्शक | 200000 | 35 | ७ | 4 | जीवनाचा आनंद घे | (निरर्थक) |
५ | किरिएन्को अनास्तासिया | कार्यालय व्यवस्थापक | 40000 | २५ | 3 | ५ | कॉफी विकत घ्या | 2022-07-01 |
५ | किरिएन्को अनास्तासिया | कार्यालय व्यवस्थापक | 40000 | २५ | 4 | ५ | कॉफी विकत घ्या | 2022-08-01 |
५ | किरिएन्को अनास्तासिया | कार्यालय व्यवस्थापक | 40000 | २५ | ५ | ५ | कॉफी विकत घेईन | 2022-09-01 |
6 | वास्का | मांजर | 1000 | 3 | 8 | 6 | जीवनाचा आनंद घे | (निरर्थक) |
चांगली बातमी अशी आहे की अर्थहीन ओळी गायब झाल्या आहेत: पहिल्या स्तंभातील आयडी नेहमी कर्मचारी_आयडीच्या बरोबरीचा असतो.
वाईट बातमी अशी आहे की कार्यालयाची साफसफाई करणे यासारखी कामे कोणालाही सोपविली जात नाहीत. त्यांचा कर्मचारी_आयडी NULL होता, म्हणून त्यांना WHERE केल्यानंतर काढून टाकण्यात आले.
GO TO FULL VERSION