ძირითადი მასალა
კომპიუტერული პროგრამირება
კურსი: კომპიუტერული პროგრამირება > თემა 3
გაკვეთილი 3: რელაციური მოთხოვნა SQL-ში- მონაცემების ურთიერთდაკავშირებულ ცხრილებში განაწილება
- ურთიერთდაკავშირებული ცხრილების შეერთება
- გამოწვევა: ბობის ჰობები
- ურთიერთდაკავშირებული ცხრილების მარცხენა გარე შეერთებით შეკავშირება
- გამოწვევა: კლიენტის შეკვეთები
- ცხრილების შეერთება თვითშეერთებით
- გამოწვევა: „სიკველები" SQL-ში
- რამდენიმე შეერთების ერთად გამოყენება
- გამოწვევა: მეგობრების წიგნი
- პროექტი: ცნობილი ადამიანები
- უფრო ეფექტური SQL, ბრძანებების დაგეგმვისა და ოპტიმიზაციის შედეგად
© 2023 Khan Academyგამოყენების პირობებიკონფიდენციალურობის პოლიტიკაშენიშვნა ქუქი-ჩანაწერებზე
მონაცემების ურთიერთდაკავშირებულ ცხრილებში განაწილება
აქამდე ყოველთვის ერთ ცხრილთან ვმუშაობდით და ვხედავდით, რა საინტერესო მონაცემების მიღება შეგვეძლო ამ ცხრილიდან. მაგრამ, ძირითადად, ჩვენი მონაცემები განაწილებული გვაქვს რამდენიმე ცხრილში და ეს ცხრილები ერთმანეთთან „დაკავშირებულია" გარკვეული გზით.
მაგალითად, ვთქვათ, გვაქვს ცხრილი იმის აღსარიცხად, თუ რამდენად კარგად ასრულებენ ტესტებს მოსწავლეები და ვინახავთ ელ–ფოსტებსაც, რათა საჭიროების შემთხვევაში მშობლებს მივწეროთ ცუდი ნიშნების შესახებ:
student_name | student_email | test | grade |
---|---|---|---|
Peter Rabbit | peter@rabbit.com | Nutrition | 95 |
Alice Wonderland | alice@wonderland.com | Nutrition | 92 |
Peter Rabbit | peter@rabbit.com | Chemistry | 85 |
Alice Wonderland | alice@wonderland.com | Chemistry | 95 |
შეიძლება, გვქონდეს ცხრილიც იმ წიგნების აღსარიცხად, რომლებსაც თითოეული მოსწავლე კითხულობს:
student_name | book_title | book_author |
---|---|---|
Peter Rabbit | The Tale of Mrs. Tiggy-Winkle | Beatrix Potter |
Peter Rabbit | Jabberwocky | Lewis Carroll |
Alice Wonderland | The Hunting of the Snark | Lewis Carroll |
Alice Wonderland | Jabberwocky | Lewis Carroll |
შეიძლება, ცხრილი გვქონდეს მხოლოდ მოსწავლის დეტალური ინფორმაციისათვის:
id | student_first | student_last | student_email | phone | birthday |
---|---|---|---|---|---|
1 | Peter | Rabbit | peter@rabbit.com | 555-6666 | 2001-05-10 |
2 | Alice | Wonderland | alice@wonderland.com | 555-4444 | 2001-04-02 |
რას ფიქრობთ ამ ცხრილებზე? შეცვლიდით მათში რაიმეს?
ამ ცხრილებზე ერთი მნიშვნელოვანი რამ უნდა გავიაზროთ: ისინი რელაციურ (დაკავშირებულ) მონაცემებს აღწერენ — ანუ იმ მონაცემებს, რომლებიც კავშირშია ერთმანეთთან. ამ ცხრილებიდან თითოეული აღწერს კონკრეტულ მოსწავლესთან დაკავშირებულ მონაცემებს, სხვა ბევრი ცხრილი იმეორებს იმავე იდეას. როდესაც ერთი და იგივე მონაცემები მეორდება რამდენიმე ცხრილში, შეიძლება, საინტერესო შედეგებს წავაწყდეთ.
მაგალითად, რა მოხდება მაშინ, თუ მოსწავლის ელფოსტა შეიცვალა? რომელი ცხრილების შეცვლა დაგვჭირდება?
დაგვჭირდებოდა მოსწავლის ინფორმაციის ცხრილის შეცვლა, მაგრამ ვინაიდან ის ნიშნების ცხრილშიც შევიყვანეთ, აგრეთვე დაგვჭირდებოდა ყოველი სტრიქონის პოვნა ამ მოსწავლის შესახებ და მასში ელ–ფოსტის შეცვლაც.
ხშირად უმჯობესია, რომ მონაცემთა კონკრეტული სვეტი შენახული იყოს მხოლოდ ერთ ადგილას, რათა ნაკლებ ადგილზე დაგვჭირდეს განახლება, რაც თავისთავად ამცირებს რისკს, რომ სხვადასხვა ადგილას სხვადასხვა მონაცემი გვექნება. თუ ამას გავაკეთებთ, უნდა დავრწმუნდეთ, რომ გვაქვს გზა, რომლითაც ერთმანეთს ვუკავშირებთ მონაცემებს სხვადასხვა ცხრილებში, რაზეც მომავალში ვისაუბრებთ.
ვთქვათ, გადავწყვიტეთ, ამოვიღოთ ელფოსტა ქულების ცხრილიდან, რადგან გავიაზრეთ, რომ ის ზედმეტია მაშინ, როცა სტუდენტების დეტალების ცხრილშიც გვაქვს ელფოსტა. აი, რა გვექნებოდა:
student_name | test | grade |
---|---|---|
Peter Rabbit | Nutrition | 95 |
Alice Wonderland | Nutrition | 92 |
Peter Rabbit | Chemistry | 85 |
Alice Wonderland | Chemistry | 95 |
როგორ უნდა გავარკვიოთ ელფოსტა თითოეული მოსწავლისთვის? შეგვიძლია, ვიპოვოთ მწკრივი მოსწავლის ინფორმაციის ცხრილში სახელის დამთხვევის მიხედვით. იმ შემთხვევაში რა ხდება, თუ ორ მოსწავლეს ერთი და იგივე სახელი აქვს? (იცოდით, რომ კუნძულ ბალიზე ყოველ ადამიანს მხოლოდ 4-იდან 1 შესაძლო სახელი ჰქვია?) სახელს ვერ ვენდობით მოსწავლის მოსაძებნად და, ისედაც, არასოდეს არ უნდა ვენდოთ სახელის მსგავს რაღაცას ცხრილში რაიმეს უნიკალურად იდენტიფიკაციისათვის.
ასე რომ, საუკეთესო ვარიანტია
student_name
-ის ამოღება და მისი ჩანაცვლება student_id
-ით, რადგან ეს გარანტირებულად არის უნიკალური იდენტიფიკატორი:student_id | test | grade |
---|---|---|
1 | Nutrition | 95 |
2 | Nutrition | 92 |
1 | Chemistry | 85 |
2 | Chemistry | 95 |
წიგნების ცხრილშიც იმავეს შევცვლიდით,
student_name
–ის ნაცვლად გამოვიყენებდით student_id
–ს:student_id | book_title | book_author |
---|---|---|
1 | The Tale of Mrs. Tiggy-Winkle | Beatrix Potter |
1 | Jabberwocky | Lewis Carroll |
2 | The Hunting of the Snark | Lewis Carroll |
2 | Jabberwocky | Lewis Carroll |
შეამჩნიეთ, რომ სათაური და ავტორი ორჯერ გვიმეორდება Jabberwocky-ისთვის? ეს კიდევ ერთი გამაფრთხილებელი ნიშანია იმისა, რომ შეგვიძლია, ჩვენი ცხრილი დავშალოთ რამდენიმე დაკავშირებულ ცხრილად, რათა არ მოგვიწიოს ბევრი ადგილის განახლება იმ შემთხვევაში, როცა წიგნის შესახებ რაიმეს ვცვლით.
შეგვეძლო, გვქონოდა ცხრილი მხოლოდ წიგნებზე:
id | book_title | book_author |
---|---|---|
1 | The Tale of Mrs. Tiggy-Winkle | Beatrix Potter |
2 | Jabberwocky | Lewis Carroll |
3 | The Hunting of the Snark | Lewis Carroll |
და შემდეგ ჩვენი
student_books
გახდება:student_id | book_id |
---|---|
1 | 1 |
1 | 2 |
2 | 3 |
2 | 2 |
ვიცი, რომ ეს ცხრილი იმდენად წაკითხვადი არ არის, რამდენადაც წინა ცხრილი, რომელსაც მთელი ინფორმაცია მოთავსებული ჰქონდა თითოეულ მწკრივში. მაგრამ ცხრილების დიზაინის მიზანი ხშირ შემთხვევაში არ არის ადამიანისათვის ადვილად წაკითხვადობა - მისი პრიორიტეტია, ადვილი იყოს ცხრილზე ზრუნვა და იყოს შეცდომებისგან დაზღვეული. ხშირ შემთხვევაში, საუკეთესო გზაა ინფორმაციის რამდენიმე დაკავშირებულ ცხრილში დაყოფა, რათა გვქონდეს ნაკლები ზედმეტი მონაცემი და ნაკლები განსაახლებელი ადგილი.
მნიშვნელოვანია, გავიაზროთ, როგორ გამოვიყენოთ SQL იმ მონაცემებთან გასამკლავებლად, რომლებიც დაყოფილია რამდენიმე დაკავშირებულ ცხრილში, და საჭიროების შემთხვევაში როგორ უნდა გავაერთიანოთ ცხრილებში არსებული ეს მონაცემები. ამას ვაკეთებთ კონცეფციის გამოყენებათ, რომელსაც ჰქვია „join" (შეერთება) და სწორედ მას განახებთ შემდეგში.
გსურთ, შეუერთდეთ დისკუსიას?
პოსტები ჯერ არ არის.