Соединения, не основанные на равенстве
Условие соединения таблиц не обязательно является равенством. Здесь можно использовать любую другую операцию сравнения: не равно (!=), больше чем (>), меньше чем (<), больше или равно (>=), меньше или равно (<=). Язык Transact-SQL также содержит операции !> и !< , которые эквивалентны операциям меньше или равно и больше или равно соответственно.
В следующем примере используется операция “больше чем” для нахождения авторов, которые публиковались издательством New Age Books и которые живут в штатах, названия которых больше чем название штата Массачусетс (в алфавитном порядке):
Соединение таблиц – это набор результатов от операции соединения, выполненной над двумя или несколькими таблицами. При выполнении соединения имена таблиц перечисляются в предложении запроса FROM, результатом запроса будет декартово произведение таблиц, т.к. не определены связи между таблицами. Связи между таблицами в SQL могут быть установлены с помощью предложений WHERE и INNER JOIN.
Связь между таблицами с помощью предложения WHERE.
Если в качестве критерия поиска в предложении WHERE задаются условия, основанные на равенствах, то выполняется внутреннее соединение 2-х таблиц. Такое соединение называется эквисоединением. Синтаксис запроса на соединение будет иметь вид:
SELECT список_полей
FROM таблица_1 , таблица_2
WHERE таблица_1.поле_1 оператор таблица_2.поле_2
Где:
· таблица_1, таблица_2 - имена таблиц, записи которых подлежат объединению;
· поле_1, поле_2 - имена объединяемых полей. Если эти поля не являются числовыми, то должны иметь одинаковый тип данных и содержать данные одного рода, однако, поля могут иметь разные имена;
· оператор -любой оператор сравнения: "=," "<," ">," "<=," ">=," или "<>".
Множественные соединения (более чем двух) таблиц будут выполняться, если пары связанных полей связать логической операцией AND. Синтаксис запроса на множественное соединение:
SELECT список_полей
FROM таблица_1 , таблица_2 , таблица 3
WHERE таблица_1.поле_1 оператор таблица_2.поле_2 AND таблица_2.поле_1 оператор таблица_3.поле_1
Связь между таблицами с помощью предложения INNER JOIN.
Внутреннее соединение (INNER JOIN) является типом соединений, принятым по умолчанию. В этом случае синтаксис запроса на соединение будет иметь вид:
SELECT список_полей
FROM таблица_1 INNER JOIN таблица_2
ON таблица_1.поле_1 оператор таблица_2.поле_2
Чтобы установить связь по нескольким полям, следует связать несколько предложений ON в инструкции JOIN:
SELECT список_полей
FROM таблица_1 INNER JOIN таблица_2
ON таблица_1.поле_1 оператор таблица_2.поле_1 {AND| OR}
ON таблица_1.поле_2 оператор таблица_2.поле_2
Внутреннее соединение задает набор результатов, в который будут включены лишь те строки, которые соответствуют условию ON, а все несоответствующие строки будут отброшены.
Полные внешние соединения (FULL OUTER JOIN) задают набор результатов, состоящих из строк, соответствующих условию ON, так и из строк, не соответствующих условию ON. Для строк, не соответствующих условию ON, значением колонки станет NULL. В этом случае синтаксис запроса на соединение будет иметь вид:
SELECT список_полей
FROM таблица_1 FULL OUTER JOIN таблица_2
ON таблица_1.поле_1 оператор таблица_2.поле_2
Левые внешние соединения (LEFT OUTER JOIN) возвращают строки, в которых произошло соответствие условию поиска, плюс все строки из таблицы, заданной слева от ключевого слова JOIN. В этом случае синтаксис запроса на соединение будет иметь вид:
SELECT список_полей
FROM таблица_1 LEFT OUTER JOIN таблица_2
ON таблица_1.поле_1 оператор таблица_2.поле_2
Правые внешние соединения (RIGHT OUTER JOIN) возвращают строки, в которых произошло соответствие условию поиска, плюс все строки из таблицы, заданной справа от ключевого слова JOIN. В этом случае синтаксис запроса на соединение будет иметь вид:
SELECT список_полей
FROM таблица_1 RIGHT OUTER JOIN таблица_2
ON таблица_1.поле_1 оператор таблица_2.поле_2
25. Подзапросы. Основные правила при задании подзапросов.
Подзапрос -это оператор выбора, который содержится внутри другого оператора выбора, вставки, обновления или удаления, внутри условного оператора или внутри другого подзапроса.
В этой главе обсуждаются следующие темы:
· Что такое подзапросы;
· Типы подзапросов;
· Выражения с подзапросами;
· Квантифицированные предикаты с подзапросами;
· Коррелирующиеся подзапросы.
ЧТО ТАКОЕ ПОДЗАПРОСЫ
Подзапросы обычно содержатся в предложениях whereили havingSQL оператора или в списке выбора этого оператора. С помощью подзапросов можно проводить дальнейший отбор данных из результатов других запросов. Оператор, содержащий подзапрос, может обрабатывать строки некоторой таблицы, основываясь на результатах вычисления списка выбора подзапроса, который в свою очередь может ссылаться на эту же таблицу как внешний запрос, или обращаться к другой таблице. В языке Transact-SQL подзапросы допускаются почти везде, где допускаются выражения, если подзапрос возвращает одно значение.
Операторы выбора, содержащие один или несколько подзапросов, называются также составными запросамиили составными операторами выбора. Возможность включения одного оператора выбора внутрь другого является одной из причин, по которой язык SQL называется “структурированным” (Structured Query Language).
SQL оператор, который включает подзапросы, называемые также внутренними запросами, можно иногда заменить соединением. Есть вопросы, которые можно сформулировать только с помощью подзапросов. Некоторые люди предпочитают всегда использовать подзапросы, поскольку находят их легкими для понимания. Другие стремятся их избегать всегда, когда это возможно. Читатель может выбрать сам удобный для себя способ. (SQL Сервер также переводит некоторые подзапросы в соединения, прежде чем выполнять их).
Примеры использования подзапросов
Если нужно найти все книги, имеющие ту же цену, что и книга Straight Talk About Computers, то это можно сделать за два шага. Во-первых найти цену этой книги:
Select price
From titles
where title = "Straight Talk About Computers"
price
-------------
$19.99
(Выбрана 1 строка)
Затем, используя этот результат во втором запросе, уже можно найти все книги, имеющие ту же стоимость, что и Straight Talk:
Select title, price
From titles
where price = $19.99
title price
------------------------------------------------------------- --------
The Busy Executive's Database Guide 19.99
Straight Talk About Computers 19.99
Silicon Valley Gastronomic Treats 19.99
Prolonged Data Deprivation: Four Case Studies 19.99
(Выбрано 4 строки)
С помощью подзапроса эта задача решается одним оператором:
Select title, price
From titles
where price =
(select price
From titles
where title = "Straight Talk About Computers")