Оператор SELECT. Выбор данных из двух и более таблиц. Подзапросы. Пример.
Оператор SELECT –позволяет производить выборки данных из таблиц и преобразовывать к нужному виду полученные результаты. Оператор SELECT способен выполнять действия, эквивалентные операторам реляционной алгебры, причем в пределах единственной выполняемой команды. При его помощи можно реализовать сложные и громоздкие условия отбора данных из различных таблиц. Оператор SELECT используется для формулирования и выполнения запросов пользователей к данным, хранящимся в базе, то есть производят выборку из базы данных затребованной пользователем информации.
Она состоит из следующих предложений:
SELECT [DISTINCT] {*, столбец [псевдоним], выражение, литерал}
FROM {таблица | (подзапрос)}
[WHERE условия выборки для отдельных строк] [GROUP BY столбцы]
[HAVING критерий выборки для групп] [ORDER BY {столбец [ASC | DESC], …} ]
Фраза FROM определяет одну или несколько таблиц или подзапросов, используемых для извлечения данных.
В простейшем случае оператор SELECT состоит из:
- предложения SELECT с указанием столбцов, которые должны быть в таблице результатов
- предложения FROM, задающие имена таблиц, к которым делается запрос.
Кроме имени таблицы здесь возможно задание подзапроса, результат выполнения которого будет рассматриваться как таблица для выборки данных.
Оператор SELECT определяет поля (столбцы), которые будут входить в результат выполнения запроса. В списке они разделяются запятыми и приводятся в такой очередности, в какой должны быть представлены в результате запроса. Если используется имя поля, содержащее пробелы или разделители, его следует заключить в квадратные скобки. Символом * можно выбрать все поля, а вместо имени поля применить выражение его заменяющее.
Выборка данных из двух и более таблиц
Одна из наиболее важных особенностей SELECT – способность использования связей между различными таблицами, а также вывода содержащейся в них информации. Операция, которая приводит к соединению из двух таблиц всех пар строк, для которых выполняется заданное условие, называется соединением таблиц.
Декартово произведение таблиц
Соединение таблиц – частный случай декартового произведения. Декартово произведение таблиц – таблица, состоящая из всех возможных пар строк таблиц.
Все столбцы:
SELECT * FROM faculty, department
Выбор отдельных столбцов:
SELECT faculty.name, faculty.facPK, department.facFK, department.name
FROM faculty, department;
Соединение таблиц по равенству
Соединение по равенству, в отличие от декартового произведения, позволяет соединить только те пары строк, которые действительно взаимосвязаны друг с другом.
Вывод столбцов разных таблиц
Этот вид запросов характерен тем, что фраза WHERE содержит только условие соединения, а список фразы SELECT содержит имена столбцов из различных таблиц.
Вывод столбцов с условием отбора
Вариант, когда отбираются строки одной таблицы, а условие задается с участием другой
Запрос: вывести названия кафедр факультета информатики
SELECT department.name as “кафедры факультета информатики”
FROM faculty, department
WHERE faculty.facPK=department.facFK AND lower(faculty.name)=’информатика’;
Запросы по трем и более таблицам
SQL позволяет формулировать запросы, которые предполагают использование трех и более таблиц. Методика соединения такая же, как и для двух таблиц.
Запрос: вывести названия тех кафедр факультета информатики, на которых работают профессора
SELECT DISTINCT department.name
FROM faculty, department, teacher
WHERE faculty.facPK=department.facFK AND
department.depPK=teacher.depFK AND
lower(faculty.name)=”информатика” AND
lower(teacher.post)=”профессор”;
Соединение таблиц по неравенству
Запрос: вывести названия кафедр, которые не расположены в одном корпусе с деканатом факультета информатики
SELECT DISTINCT d.name as “названия кафедр”
FROM faculty f, department d
WHERE d.building <> f.building AND lower(f.name)=”информатика”;
Самосоединение таблицы
Чтобы произвести соединение таблицы со своей копией, необходимо указать во фразе FROM имя одной и той же таблицы два или большее количество раз, а во фразе WHERE - условие их соединения.
Различным вхождениям одной и той же таблицы приписываются различные синонимы, и именно по этим синонимам производится обращение к столбцам.
Внешние соединения таблиц
Внешние соединения возвращают строки, которые удовлетворяют условию соединения, а также те строки одной из таблиц, для которых в другой не нашлось удовлетворяющих условию соединения строк. В oracle синтаксис внешнего соединения имеет следующие два вида:
таблица.столбец оператор_сравнения таблица.столбец(+)
таблица.столбец(+) оператор_сравнения таблица.столбец
Когда в результате должны быть включены все строки таблицы, указанной в левой части, следует использовать первый вариант. Такое соединение называется левым внешним соединением. Если необходимо, чтобы в результате присутствовали все строки таблицы в правой части, следует использовать второй вариант, в этом случае говорят о правом внешнем соединении.
Запрос: вывести фамилии всех преподавателей с указанием их кафедры, если она есть
SELECT d.name as “кафедра”, t.name as “преподаватель”
FROM department d, teacher t
WHERE d.depPK(+)=t.depFK;
Соединения с использованием фразы FROM
Рассмотренные типы и способы соединения таблиц можно осуществлять и с помощью фразы FROM. В ней можно не только перечислить имена таблиц, участвующих в запросе, но и указать их соединение, для чего могут использоваться три различные конструкции.
Уточненное соединение – явное задание условия соединения.
Таблица [INNER | {FULL | LEFT | RIGHT} [OUTER]] JOIN
таблица {ON условие | USING (список_столбцов)}
Естественное соединение выполняется по равенству значений всех пар одноименных столбцов таблиц и не требует задания каких-либо условий.
Таблица NATURAL [INNER | {FULL | LEFT | RIGHT} [OUTER]]
JOIN таблица
Перекрестное соединение эквивалентно декартовому произведению таблиц
Таблица CROSS JOIN таблица
Внутреннее соединение
В операторе JOIN внутреннее соединение указывается ключевым словом INNER (когда две таблицы, можно не писать). Если не совпадают имена столбцов, участвующих во внутреннем соединении, или соединение производится не по равенству значений, следует использовать уточненное соединение с фразой ON.
Запрос: вывести названия факультетов и их кафедр, если они имеют одинаковый фонд финансирования.
SELECT faculty.name, department.name
FROM faculty JOIN department ON faculty.facPK=department.facFK AND faculty.fund=department.fund;
Внешнее соединение
Запрос: вывести все факультеты и кафедры с указанием пар факультет/кафедра, имеющих одинаковые фонды финансирования и расположенные в одном корпусе
SELECT faculty.name, department.name
FROM faculty FULL JOIN department ON facuty.fund=department.fund AND faculty.building=department.building;
SELECT faculty.name, department.name
FROM faculty FULL JOIN department USING (fund, building);
Соединение трех и более таблиц
Порядок соединений уточняется круглыми скобками.
Использование скобок важно в связи с тем, что результат нескольких внешних соединений зависит от порядка их выполнения – например, последовательное внешнее соединение таблиц факультетов, кафедр и преподавателей не обязательно равно последовательному внешнему соединению таблиц преподавателей, кафедр и факультетов.
Подзапросы
Вложенный запрос – это заключенный в круглые скобки запрос, присутствующий во фразах WHERE, HAVING, FROM и т.д. Вложенный запрос еще называют подзапросом или дочерним запросом, а запрос, внешний к вложенному, наз. родительским или внешним.
Подзапросы разделяются на два вида – простые и связанные (коррелированные)
Простые подзапросы
Простым вложенным запросом называется такой, результат которого не зависит от внешнего запроса. Такие запросы обрабатываются системой «снизу вверх» - первым обрабатывается подзапрос самого нижнего уровня, полученное множество значений используется в подзапросе более высокого уровня и т.д.
Не нашли, что искали? Воспользуйтесь поиском по сайту:
©2015 - 2024 stydopedia.ru Все материалы защищены законодательством РФ.
|