русс | укр

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

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

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

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


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

Выборка из нескольких таблиц


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


Одним из самых мощных средств SQL является возможность выбирать данные из многих таблиц. Это достигается перечислением имен необходимых таблиц во фразе FROM. Если при этом во фразе WHERE не указывается условие их соединения, то производится декартово произведение всех таблиц из фразы FROM. Так, например, если заданы следующие две таблицы:

Таблица 1 ROW REMARKS ========== ======= row 1 Table 1 row 2 Table 1 row 3 Table 1 row 4 Table 1 row 5 Table 1 Таблица 2 ROW REMARKS ========== ======== row 1 table 2 row 2 table 2 row 3 table 2 row 4 table 2 row 5 table 2

то результатом выполнения запроса

SELECT *

FROM TABLE1, TABLE2

будет таблица:

ROW REMARKS ROW REMARKS ========== ========== ========== ========  
row 1 Table 1 row 1 table 2 row 1 Table 1 row 2 table 2 row 1 Table 1 row 3 table 2 row 1 Table 1 row 4 table 2 row 1 Table 1 row 5 table 2 row 2 Table 1 row 1 table 2 row 2 Table 1 row 2 table 2 row 2 Table 1 row 3 table 2 row 2 Table 1 row 4 table 2 row 2 Table 1 row 5 table 2 row 3 Table 1 row 1 table 2 row 3 Table 1 row 2 table 2 row 3 Table 1 row 3 table 2 row 3 Table 1 row 4 table 2 row 3 Table 1 row 5 table 2 row 4 Table 1 row 1 table 2 row 4 Table 1 row 2 table 2 row 4 Table 1 row 3 table 2 row 4 Table 1 row 4 table 2 row 4 Table 1 row 5 table 2 row 5 Table 1 row 1 table 2 row 5 Table 1 row 2 table 2 row 5 Table 1 row 3 table 2 row 5 Table 1 row 4 table 2 row 5 Table 1 row 5 table 2  

то есть каждая строка первой таблицы соединилась с каждой строкой второй таблицы. Как правило, таблицы соединяются по некоторому условию. Например, для получения списка имен факультетов и имен соответствую­щих им кафедр следует записать:

SELECT FACULTY.Name, DEPARTMENT.Name



FROM FACULTY, DEPARTMENT

WHERE FACULTY.#F = DEPARTMENT.#F

Уточнение имен столбцов. Обратим внимание, что во фразах SELECT и WHERE имена столбцов уточняются имена­ми таблиц. Если есть столбец, который имеет одно и то же имя в объединяемых таблицах, то ссылаться на тот или иной столбец в запросе следует именно так – уточнять их именами таблиц.

Алиас имени таблицы. В связи с тем, что таблицы могут иметь длинные наименования, язык предоставляет воз­мо­ж­ность связывать с каждой таблицей некоторый краткий алиас, и в дальнейшем ссылаться на таблицу по нему. Сопоставление таблице алиаса делается о фразе FROM. Например, предыдущий запрос можно записать:

SELECT f.Name, d.Name

FROM FACULTY f, DEPARTMENT d

WHERE f.#F = d.#F

Очевидно, что фраза WHERE может использоваться одновременно как для указания способа соединения таблиц, так и для указания условия отбора строк в результирующую таблицу, например, запрос

SELECT DEPARTMENT.Name

FROM DEPARTMENT, TEACHER

WHERE DEPARTMENT.#D = TEACHER.#D AND TEACHER.Name = 'Иванов'

приводит к выводу названия кафедры, на которой работает преподаватель Иванов. (Заметим, что поиск преподава­те­лей ведется по всему ВУЗу , поэтому по сути отыскиваются все кафедры ВУЗа, на которых работают преподава­те­ли по фамилии 'Иванов'). Обратите внимание, что условие поиска задается на одной таблице, а результат выдает­ся из другой.

Вычисляемые столбцы. Во фразе SELECT может быть сформирован новый столбец, значение которого вычис­ляет­ся из других столбцов соединяемых таблиц. Приводимый далее запрос выдает сведения обо всех кафедрах факультета информатики с их фондами финансирования и процентом, который этот фонд составляет по отноше­нию к фонду факультета.

SELECT d.Name, d.Fund, ( d.Fund / f.Fund ) * 100

FROM FACULTY f, DEPARTMENT d

WHERE f.#F = d.#F

Экви-соединение. Если таблицы соединяются по равенству значений одной или нескольких пар столбцов, причем из каждой таблицы выбираются ВСЕ столбцы, то такое соединение выражает операцию экви-соединения реляцион­ной алгебры, например:

SELECT f.*, d.*

FROM FACULTY f, DEPARTMENT d

WHERE f.#F = d.#F

Естественное соединение. Операция реляционной алгебры естественного соединения выражается соединением двух или нескольких таблиц по предикату равенства с последующим удалением повторяющихся столбцов путем явного перечисления всех необходимых столбцов во фразе SELECT, например:

SELECT f.#F, f.Name, f.Dean, f.Building, f.Fund,

d.#D, d.Name, d.Head, d.Building, .Fund

FROM FACULTY f, DEPARTMENT d

WHERE f.#F = d.#F

Обратим внимание, что хотя столбцы Name, Building, Fund встречаются в обеих таблицах, однако они не рассма­т­ри­вают­ся как повторяющиеся, так как несут различную семантическую нагрузку, повторяющимся столбцом является тот единственный, по которому производится соединение – столбец #F, который выполняет роль внешнего ключа в таблице DEPARTMENT.

Тета-соединение. Это соединение по любому другому условию, отличающемуся от равенства. В этом случае соединение производится не по первичному-внешнему ключам, а по некоторым другим столбцам и имеет более глубокую семантику.

Соединение таблицы со своей копией. В некоторых случаях необходимо соединить таблицу с собой. В этом случае во фразе FROM указывается дважды имя таблицы с разными алиасами, чтобы можно было к каждой из таблиц ссылаться самостоятельно. Рассмотрим такой пример: пусть нам необходимо проверить, есть ли в таблице FACULTY такие пары строк, что имена факультетов совпадают, а их ключи #F разные. Для этого следует записать:

SELECT f1.Name, f1.#F, f2.#F

FROM FACULTY f1, FACULTY f2

WHERE f1.name = f2.Name AND f1.#F != f2.#F

 

 

Соединять можно и по трем, четырем и т.д. таблицам. Язык не ограничивает количество соединяемых таблиц. Но при этом следует помнить, что крайне важно производить именно соединение по некоторому условию,а не декартово произведение таблиц. Имейте в виду, что если произвести декартово произведе­ние пяти таблиц, каждая из которых содержит всего по 20 строк, то результирующая таблица будет иметь довольно внушительный размер - 3,200,000 строк. Декартово произведение двух таблиц с десятками тысяч строк каждая может длиться часами!!! А объем результирующей таблицы может исчисляться десятками гигабайт!!!

Приведем несколько запросов, которые использовались при описании реляционной алгебры (подраздел 4.6.3), приводя тексты запросов в SQL и в реляционной алгебре (нумерация запросов сохраняется).

Запрос 6. Выдать список всех кафедр факультета информатики

SELECT DEPARTMENT.Name

FROM FACULTY, DEPARTMENT

WHERE FACULTY.#F = DEPARTMENT.#F AND FACULTY.Name = "IT"

( ( FACULTY [ #F = #F ] DEPARTMENT ) ) [FACULTY.Name = "IT"] ) [DEPARTMENT.Name]

Запрос 7. Выдать список всех преподавателей с их телефонами кафедры вычислительной техники.

SELECT TEACHER.Name, Tel

FROM DEPARTMENT, TEACHER

WHERE DEPARTMENT.#D = TEACHER.#D AND DEPARTMENT.Name = "CS"

( ( DEPARTMENT [ #D = #D ] TEACHER ) [ DEPARTMENT.Name = "CS" ] ) [ TEACHER.Name, Tel ]

Запрос 8. Выдать список всех преподавателей с их телефонами факультета информатики

SELECT TEACHER.Name, Tel

FROM FACULTY, DEPARTMENT, TEACHER

WHERE FACULTY.#F = DEPARTMENT.#F AND

DEPARTMENT.#D = TEACHER.#D AND

FACULTY.Name = "IT"

((( FACULTY [#F = #F] DEPARTMENT) [#D = #D] TEACHER) [FACULTY.Name = "IT"] ) [TEACHER.Name, Tel]

Запрос 9. Выдать список номеров всех групп первого курса кафедры вычислительной техники.

SELECT Num

FROM GROUP, DEPARTMENT

WHERE GROUP.#D = DEPARTMENT.#D AND

Name = "CS" AND COURSE = 1

( ( GROUP [#D = #D] DEPARTMENT ) [Name = "CS", COURSE = 1 ] ) [ Num ]

Запрос 10. Уточнение. Выдать список номеров всех групп первого курса кафедры вычислительной техники вместе с кураторами этих групп.

SELECT Num, TEACHER.Name

FROM GROUP, DEPARTMENT, TEACHER

WHERE GROUP.#D = DEPARTMENT.#D AND

GROUP.#Curator = TEACHER.#T AND

Name = "CS" AND COURSE = 1

(((GROUP[#D = #D] DEPARTMENT))[#Curator = #T] TEACHER)[Name = "CS", COURSE = 1])[Num, TEACHER.Name ]

Запрос 11. Привести список лекций, на которых количество студентов в группе превышает количество мест в аудитории. В списке указать номер аудитории, номер группы, читаемую дисциплину, неделю, день недели.

SELECT ROOM.Num, GROUP,Num, SUBJECT.Name, Week, Day

FROM LECTURE, GROUP, SUBJECT, ROOM

WHERE LECTURE.#G = GROUP.#G.#D AND

LECTURE.#S = SUBJECT.#S AND

LECTURE.#R = ROOM.#R AND

GROUP.Quantity > ROOM.Seats

((((LECTURE [ #G = #G ] GROUP ) [ #S = #S ] SUBJECT ) [ #R = #R ] ROOM ) [ GROUP.Quantity > ROOM.Seats ] ) [ ROOM.Num, GROUP,Num, SUBJECT.Name, Week, Day ]



<== предыдущая лекция | следующая лекция ==>
Выражения, условия и операторы | Использование агрегатных функций


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


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

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

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


 


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

 
 

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

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