MySQL пребарувања преку повеќе табели (се приклучува) на ИТ центарот
наставни материјали за часови по компјутерски науки
(последна промена на оваа страница: 13.11.2016)

Видео упатство
Ако ви се допаѓа само видеото гледа во, тешко дека ќе научите нешто. За најдобар ефект на учење, работете директно на компјутер и следете ги примерите.
Фолии
(последна синхронизација на презентацијата во ПДФ: 02.08.2017)
Ако не можете да видите презентација во PDF, кликнете овде за да ја преземете: Директно преземање на презентација во PDF
Оваа низа претпоставува знаење за следната содржина: Вовед во пребарувањата SELECT во MySQL.
Вежби со детални решенија и објаснувања може да најдете тука: Вежби за ЗДРУ JOИ во MySQL
MySQL шутнат „клиент-едноставно.sql“
За да можете да ги разберете примерите во слајдовите и во видео упатството, преземете ја оваа депонија на MySQL: клиент-едноставно.sql, отворете ја во Workbench (File -> Open SQL Script L) и оставете да работи. Создадена е база на податоци „Клиенти“ која содржи две табели („Локации“ и „Клиенти“).
Податоци за пребарување од две табели
Пример сценарио: Сликата прикажува две поврзани табели кои се поврзани со странски клуч. Размислете кои се примарните клучеви, а кои странските.
Решение:
Клиенти (ID на клиент, име на клиент, име на клиент, телефон на клиент, ↑ земја на клиент, број на клиент)
земји (landID, име земја, статус на испорака)
Примарните клучеви се клиентИД и земја countryид (препознатливи по подвлеченоста), странскиот клуч е клиент Земја во табелата за клиенти (препознатлива по стрелката пред клиентот Земја). Странскиот клуч kundeLand се однесува на примарниот клуч на табелите земји.
Табулаторот „клиент“ содржи поле „корисничко земјиште“. Тука се внесува ИД на една земја, што се однесува на полето landID во табелата „земји“.
Ако сакате да ги прикажете името на клиентот и името на земјата во целосен текст во барање SELECT, треба да земете податоци од двете табели.
Код за генерирање на овие две табели:
со некои лажни податоци:
Опција 1: ПРИДРИСТЕТЕ се/ЛЕТИ ПРИЈАВЕТЕ
Ги избира наведените полиња (клиент ID, име на клиент, клиент земја, држава ИД, име на земја) од двете табели клиенти и земји (клиенти се придружат на земјите) и се ограничува на случаите каде што клиентското земјиште одговара на државата ИД (КАДЕ клиент Земја = земја ИД).
Ако изјавата WHERE е изоставена овде, сите записи за податоци од „клиенти“ се комбинираат со сите записи за податоци од „земји“, така што со 3 земји и 4 клиенти излегуваат вкупно 12 линии (од кои четири се излегуваат по три пати - значи 8 излишни).
Овој бесмислен резултат се нарекува Декартов производ. Секогаш прегледувајте ги резултатите од пребарувањето за да видите дека сте имале смисла за резултатите од пребарувањето со точни ограничувања.
Ако е во табелите Полиња со идентични имиња мора да се наведе табелата од која треба да се земе вредноста, синтаксата: име на табелата.име на полето
ЛЕВА ПРИДРУГИ
Ако во табелата „клиенти“ не е наведена вредност за клиентот Земја, која не може да се најде во табелата „земји“, тогаш овој запис за податоци не е излезен. Таков неточен запис за податоци ќе биде во прилог на списокот со SQL погоре, на пр.
LandID 9 не постои, така што записот за податоци не се емитува во горното барање.
Со LEFT JOIN излегуваат сите записи за податоци од левата („лева“) табела:
Внимание: „КАДЕ“ се заменува со „ON“.
Опција 2: имплицитна нотација
Наместо експлицитно да пишуваме ПРИДРУУВАЈТЕ, можеме едноставно да ги одделиме табелите што треба да се пребаруваат со запирки:
Патем, ВНАТРЕШНО ПРИДРУУВАЕ е потполно исто како JOIN Некој зборува за синтаксички шеќер.
Вежби
Сите вежби може да се најдат во збирката материјали (тука се и сите дополнителни датотеки како што се слики, дијаграми на класи или HTML шаблони!).
Тековната вежба можете да ја преземете тука како датотека txt.
***** Вежби: MySQL - Избери: Барај повеќе табели со ПРИЈАВИ *****
MySQL06_1: Декартов производ
Објаснете со свои зборови зошто ова барање не дава значаен резултат:
--- Започнете MySQL код ---
ИЗБЕРЕТЕ * ОД клиенти, локации
--- Крај на кодот ---
MySQL06_2: Едноставни пребарувања во текот на две табели - едноставна за потрошувачите во ДБ
Користете ја оваа база на податоци за оваа вежба: 07mysql/_dumps/клиенти/клиенти-едноставно.sql
А) Внесете го името, поштенскиот код и градот на сите клиенти. Списокот го содржи името на клиентот и името на местото каде што живее.
Б) Внесете го името и местото на живеење на сите клиенти кои имаат поштенски код 79312.
В) Внесете го името и местото на живеење на сите клиенти кои живеат во Емендинген (критериумот за ограничување НЕ е поштенскиот код, туку „Емендинген“).
Г) Внесете го името, местото на живеење и бројот на жители за сите клиенти кои живеат во место со повеќе од 70.000 жители.
Д) Наведете ги сите места со помалку од 1.000.000 жители.
Ѓ) Внесете го името на клиентот и името на местото за сите клиенти кои живеат на места со население од 100.000 до 1.500.000.
G) Внесете го името на клиентот, поштенскиот код и името на градот за сите клиенти чие име содржи „e“ и сите градови кои содржат „u“ или „r“ (така што frD од stUden се прикажува точно како jEssE од bRnz, frD од соли, но не и мартин од хамбург).
MySQL06_2a: Вежби за пребарувања преку две табели: Книжарница
Користете ја оваа база на податоци за оваа вежба:
07mysql/_dumps/buchladen/buchladen.sql
А) Наведете ги сите добавувачи кои живеат во Ројт. Излез: име на добавувач, име на место, поштенски код
Б) Прикажете список на сите издавачи чии имиња започнуваат со Л. Издание: име на издавач, име на место; Ве молиме сортирајте според името на местото по опаѓачки редослед.
В) Прикажи список на сите добавувачи чии имиња започнуваат со Шус. или Ло . започнува и кои седат во Емендинген. Излез: Име на добавувач, име на место, подредено според името на добавувачот по растечки редослед.
Г) Прикажете список на сите места, но само на оние места во кои се заснова издавач со n во своето име.
Д) Обезбедете список со сите книги и нивните добавувачи (внимание: консултирајте се со 3 табели!)
Ѓ) Обезбедете список со сите книги кои чинат повеќе од 10 евра (издание: име на добавувач, наслов на книга, продажна цена) - Внимание: консултирајте се со 3 маси
G) Излезете список со сите книги (едиција: наслов на книга, категорија) - Внимание: пребарување 3 табели
MySQL06_3: ПРИДРУИТЕ се наспроти ЛЕВО ПРИДРУИТЕ
Користете ја оваа база на податоци за оваа вежба: 07mysql/_dumps/клиенти/клиенти-едноставно.sql
Погледнете ги следниве две изјави и објаснете како ќе се разликуваат табелите со резултатите. После тоа, обидете се со командите и проверете го вашиот одговор.
--- Започнете MySQL код ---
-- Изјава 1: ЛЕВО ПРИЈАВЕТЕ се
ИЗБЕРЕТЕ k.customer_id, k.name, o.name ОД клиенти КАКО ОСТАНЕТЕ ПРИДРУУВАЈТЕ се локации КАКО вклучено или поштенски код = k.ort_postcode НАРАЧКА ОД k.customer_id
-- Изјава 2: EQUI-JOIN
Изберете k.customer_id, k.name, o.name ОД клиентот AS k, локации КАКО од каде или поштенски код = k.ort_postcode НАРАЧКА ОД k.customer_id
--- Крај на кодот ---
MySQL06_4: Вежби за прашања до најмногу 5 табели: Книжарница
Користете ја оваа база на податоци за оваа вежба:
07mysql/_dumps/buchladen/buchladen.sql
А) Ги бараме сите добавувачи кои имаат седиште во Фрајбург. Внесете го името на добавувачот, локацијата на добавувачот и поштенскиот код.
(Решение: Излегуваат тројца снабдувачи.)
Б) Ги бараме сите издавачи кои имаат седиште во Минхен. Внесете го името и местото на објавувањето на издавачот.
(Решение: Постојат тројца објавители.)
В) Ги бараме сите книги објавени од Верлаг Асал. Внесете го насловот на книгата, годината на објавување и името на издавачот, сортирани по година на објавување по опаѓачки редослед.
(Совет: Излегуваат четири книги.)
Г) Ги бараме сите книги од добавувачот Шустерман. Наслов на излезна книга и име на снабдувач.
(Решение: beе бидат издадени три книги.)
Д) Се бараат сите трилери. Наслов и категорија на излезни книги, подредени по наслов на книгата.
(Совет: beе бидат дадени пет книги, првата е „Еден последен бакнеж“.)
Ѓ) Ги бараме сите романтични романи. Прикажете го насловот на книгата, категоријата и името на издавачот, подредени по наслов на книгата по растечки редослед.
(Решение: Излегуваат седум записи, прво „Државниот лекар и неговиот секретар“.)
Г) Ги бараме сите книги од Сабрина Милер. Внесете го презимето, името и насловот на авторот, подредени по наслов на книгата по опаѓачки редослед.
(Совет: Четири записи се враќаат, прво „Див лов на он Смит - одмазда“.)
Н) Барани се сите трилери на Сабрина Милер. Вклучете име на авторот, наслов на книгата и категорија.
(Решение: Излегуваат две групи на податоци.)
(Предупредување: всушност сè уште не можете да го направите тоа!)
Ги бараме сите книги од Сабрина Милер кои можат да се класифицираат во категориите трилер или хумор. Вклучете име на авторот, наслов на книгата и категорија.
Така што книгата „Див лов на он Смит - Одмаздата“ не се појави двапати, мора да го групирате резултатот според наслов на книгата со додавање НАРАЧКА ОД НАРАЧКА ОД:
--- Започнете MySQL код ---
ГРУПА СО титула
--- Крај на кодот ---
Така што и двете категории сега се прикажани во колоната „опис“ за оваа книга, не користете го името на полето „опис“ за излезот од категоријата, туку повеќе
--- Започнете MySQL код ---
GROUP_CONCAT (име)
--- Крај на кодот ---
Ова значи дека за книгите што се класифицирани во неколку категории, сите категории се прикажани во едно поле, одделени со запирки.
(Решение: Излегуваат три записи за податоци.)