русс | укр

Языки программирования

ПаскальСиАссемблерJavaMatlabPhpHtmlJavaScriptCSSC#DelphiТурбо Пролог

Компьютерные сетиСистемное программное обеспечениеИнформационные технологииПрограммирование

Все о программировании


Linux Unix Алгоритмические языки Аналоговые и гибридные вычислительные устройства Архитектура микроконтроллеров Введение в разработку распределенных информационных систем Введение в численные методы Дискретная математика Информационное обслуживание пользователей Информация и моделирование в управлении производством Компьютерная графика Математическое и компьютерное моделирование Моделирование Нейрокомпьютеры Проектирование программ диагностики компьютерных систем и сетей Проектирование системных программ Системы счисления Теория статистики Теория оптимизации Уроки AutoCAD 3D Уроки базы данных Access Уроки Orcad Цифровые автоматы Шпаргалки по компьютеру Шпаргалки по программированию Экспертные системы Элементы теории информации

Об'єднання таблиць


Дата добавления: 2015-07-09; просмотров: 527; Нарушение авторских прав


У запиті можна об'єднати дані двох чи більше таблиць. Нехай, наприклад, треба одержати список співробітників усіх виробничих підрозділів. У таблиці Pers маємо список співробітників із вказівкою в поле Depпідрозділів, у яких вони працюють. А в таблиці Dep ми маємо список усіх підрозділів у поле Dep і характеристику кожного підрозділу в поле Prosv (де, нагадаємо, «в», якщо підрозділ виробничий, і «у», якщо він належить до управління). Тоді одержати список співробітників усіх виробничих підрозділів можна оператором:

SELECT Pers. * FROM Pers, Dep

WHERE (Pers.Dep=Dep.Dep)AND(Dep.Proisv='в')

Він звертається відразу до двох таблиць Pers і Dep, що перераховані після ключового слова FROM.Тому кожне ім'я поля випереджається посиланням на таблицю, до якої воно відноситься. Утім, це треба робити тільки для полів, ім'я яких повторюється в різних таблицях (поле Dep).Перед полем Proisvпосилання на таблицю можна опустити. У конструкції WHERE умова Pers. Dep=Dep. Depшукає запис у таблиці Dep, у якій поле Dep збігається з полем Depпоточної запису таблиці Pers. A умова Dep.Proisv='в'відбирає ті записи, у яких у таблиці Dep знайденому підрозділу відповідає поле Proisv = 'в'.

Із застосуванням псевдонімів, наведений вище оператор може бути переписаний у такий спосіб:

SELECT P.* FROM Pers Р, Dep D

WHERE (P . Dep=D . Dep) AND ( D . Proisv= ' в ' )

У цьому прикладі таблиці Pers даний псевдонім Р, а таблиці Dep — D.

Можливе самооб'єднання таблиць. У цьому випадку одній таблиці надаються два псевдоніми. Нехай, наприклад, потрібно знайти всіх ровесників в організації. Це можна зробити оператором

SELECT ibl.fam, ib2.fam, ibl.year_b FROM Pers ib1, Pers ib2 WHERE (ibl.year_b = ib2.year_b) AND (ibl.fam! = ib2. f am)

У цьому прикладі для таблиці Pers введено два псевдоніми: ib1 і ib2. У конструкції WHERE ведеться пошук в цих нібито різних таблицях запису з однаковим роком народження. Друга умова ib1.fam != ib2.famпотрібна, щоб співробітник не відображався в результатах як ровесник сам собі. Правда, наведений оператор видає в результаті по два записи на кожну пару ровесників, спочатку, наприклад, «Миколаїв — Андрєєв», а потім «Андрєєв — Миколаїв». Щоб виключити таке дублювання можна додати ще одну умову — ib1.Fam < ib2.Fam:



SELECT ibl.fam, ib2.fam, ibl.year_b FROM Pers ib1, Pers ib2

WHERE (ibl.year_b= ib2. year_b) AND (ibl.fam!= ib2.fam) AND (ibl.Fam<ib2.Fam)

Додаткова умова упорядковує появу прізвищ у ib1 і ib2 і виключає дублювання результатів.

Дотепер ми розглядали об'єднання, засновані на однозначній відповідності записів двох таблиць: коли кожному запису в першій таблиці знаходився відповідний запис у другій таблиці. Можливі й інші види об'єднань, що видають запис незалежно від того, чи є відповідне поле в другій таблиці. Це зовнішні об'єднання (outer join). Їх існує три типи: ліве, праве і повне. Ліве об'єднання (позначається ключовими словами LEFT OUTER JOIN ... ON) включає до результату усі записи першої таблиці, навіть ті, для яких немає відповідних в другій. Праве об'єднання (позначається ключовими словами RIGHT OUTER JOIN ... ON) включає в результат усі записи другої таблиці, навіть якщо їм немає відповідних в записах першої. Повне об'єднання (позначається ключовими словами FULL OUTER JOIN ... ON) включає в результат об'єднання записів обох таблиць, незалежно від їхньої відповідності.

Нехай, наприклад, є таблиця Pers співробітників деякої компанії і є таблиця Chef, у яку занесені дані про членів ради директорів цієї компанії. У число членів ради входять і співробітники компанії, і сторонні особи. Для визначеності припустимо, що в таблиці Pers є записи про співробітників «Іванов» і «Петров», причому Петров є членом ради, а Іванов — ні. У таблиці Chef є записи про членів ради «Петров» і «Сидоров», причому Сидоров — не співробітник компанії. Тоді оператор

SELECT * FROM Pers LEFT OUTER JOIN Chef ON Pers.Fam = Chef.Fam

видасть результат виду:

Поля таблиці Pers   Поля таблиці Chef  
Іванов ……………    
Петров …………… Петров ……………..

Оператор задав ліве об'єднання таблиці Pers (вона зазначена після ключового слова FROM) з таблицею Chef (вона зазначена після ключових слів LEFT OUTER JOIN). Умова об'єднання зазначена після ключового слова ON і полягає в збігу прізвищ.

Як показано, результат включає всі поля і таблиці Pers, і таблиці Chef. Число рядків відповідає числу записів таблиці Pers. У рядках, що стосуються записів, для яких у Chef не знайшлись відповідні, поля таблиці Chef залишаються порожніми.

Оператор правого об'єднання

SELECT * FROM Pers RIGHT OUTER JOIN Chef ON Pers.Fam = Chef.Fam

видасть результат виду:

Поля таблиці Pers   Поля таблиці Chef  
Петров …………… Петров ……………..
    Сидоров …………….....

Число рядків відповідає числу записів таблиці Chef. У рядках, що стосуються записів, для яких у Pers не знайшлася відповідність, поля таблиці Pers залишаються порожніми.

Оператор повного об'єднання

SELECT * FROM Pers FULL OUTER JOIN Chef ON Pers.Fam = Chef.Fam

видасть результат виду:

Поля таблиці Pers   Поля таблиці Chef  
Іванов ……………    
Петров …………… Петров ……………..
    Сидоров ……………..

У ньому до рядків, що належать до таблиці Pers, додані рядки, що належать до таблиці Chef, для яких не знайшлося відповідних в таблиці Pers.



<== предыдущая лекция | следующая лекция ==>
Вкладені запити | Операції з записами


Карта сайта Карта сайта укр


Уроки php mysql Программирование

Онлайн система счисления Калькулятор онлайн обычный Инженерный калькулятор онлайн Замена русских букв на английские для вебмастеров Замена русских букв на английские

Аппаратное и программное обеспечение Графика и компьютерная сфера Интегрированная геоинформационная система Интернет Компьютер Комплектующие компьютера Лекции Методы и средства измерений неэлектрических величин Обслуживание компьютерных и периферийных устройств Операционные системы Параллельное программирование Проектирование электронных средств Периферийные устройства Полезные ресурсы для программистов Программы для программистов Статьи для программистов Cтруктура и организация данных


 


Не нашли то, что искали? Google вам в помощь!

 
 

© life-prog.ru При использовании материалов прямая ссылка на сайт обязательна.

Генерация страницы за: 1.415 сек.