- •Глава 1. Историческая справка. 10
- •Глава 2. Пример бд «Ресторан». 20
- •Глава 3. Выборка данных. 25
- •Глава 4. Подзапросы и производные таблицы 65
- •Глава 5. Функции ранжирования. 86
- •Глава 1. Историческая справка.
- •Стандарты.
- •1.2. Структура sql.
- •Глава 2. Пример бд «Ресторан».
- •2.1. Описание.
- •2.2. Диаграмма.
- •2.3. Данные в таблицах.
- •Глава 3. Выборка данных.
- •3.1. Оператор select. Синтаксис.
- •3.2. Примеры запросов с использованием единственной таблицы.
- •3.2.1. Выборка без использования фразы where.
- •3.2.1.1. Простейшие примеры.
- •3.2.1.2. Исключение дубликатов (distinct).
- •3.2.1.3. Выборка вычисляемых значений.
- •3.2.2. Выборка c использованием фразы where.
- •3.2.2.1. Использование операторов сравнения.
- •3.2.2.2. Сравнение с null.
- •3.2.2.3. Использование between.
- •3.2.2.4. Использование in (not in).
- •3.2.2.5. Использование like.
- •3.2.2.6. Выборка с упорядочением.
- •3.2.3. Использование агрегатных функций для подведения итогов.
- •3.2.3.1. Агрегатные функции без использования фразы group by.
- •3.2.3.2. Фраза group by.
- •3.2.3.3. Раздел having.
- •3.3. Примеры запросов с использованием нескольких таблиц.
- •3.3.1. Соединения «с условием where».
- •3.3.2. Соединение таблиц с дополнительными условиями.
- •3.3.2.1. Соединение таблицы со своей копией.
- •3.4. Соединения нескольких таблиц, используя join.
- •3.4.1. Внутреннее соединение.
- •3.4.2. Внешнее соединение.
- •3.4.2.1. Левое внешнее соединение.
- •3.4.2.2. Правое внешнее соединение.
- •3.4.2.3. Полное внешнее соединение.
- •3.4.2.4. Перекрёстное соединение.
- •3.4.3. Реальные примеры соединений.
- •Isnull(cast(n.Количество as varchar), ’нет’) as на_складе
- •Isnull(cast(n.Количество as varchar),’нет’) as на_складе
- •Глава 4. Подзапросы и производные таблицы
- •4.1.Производная таблица.
- •4.2. Вложенные подзапросы
- •4.2.1 Простые вложенные подзапросы
- •4.2.2. Использование одной и той же таблицы во внешнем и вложенном подзапросе
- •4.2.3. Использование агрегатных функций в подзапросах.
- •4.2.4. Подзапросы в предложении having.
- •4.3. Соотнесенные подзапросы.
- •4.4 Использование оператора exists.
- •4.5. Использование операторов any и all.
- •4.6. Объединение запросов union.
- •4.6.1. Union и устранение дубликатов.
- •4.6.2. Использование строк и выражений с union.
- •4.6.3. Использование union с order by.
- •4.6.4. Реализация внешнего полного соединения через запросы с union.
- •Глава 5. Функции ранжирования.
- •5.1. Функция row_number.
- •5.2. Функции rank() и dense_rank()
- •Глава 6. ИспользованиеPivoTиUnpivot.
- •In ([Овощи], [Мясо], [Рыба], [Молоко], [Яйца], [Крупа], [Фрукты], [Кофе])
- •In ( [первый сведенный столбец], [второй сведенный столбец],
- •In ([Овощи], [Мясо], [Рыба], [Молоко], [Яйца], [Крупа], [Фрукты], [Кофе])
- •Insert into Продукты (id_Продукта, Продукт, Белки)
- •Values (18, 'Горох', 180 );
- •Insert into Продукты (Продукт, Белки, Жиры)
- •7.4. Оператор update.
- •Глава 8. Представление.
- •Insert into Список_блюд values (36, 'Рагу', 3, 20);
- •Глава 9. Создание, изменение и удаление таблиц.
- •9.1. Оператор create table
- •6. Ограничение identity (автоинкрементное поле).
- •9.2. Изменение таблицы после того как она была создана (alter table).
- •9.3. Удаление таблицы (drop table).
- •9.4. Операторы создания и удаления индексов.
- •9.5. Понятие домена
- •Глава 10. Обобщенные табличные выражения (сте).
- •Представления, производные таблицы и выражения cte.
- •Рекурсивные запросы.
- •Id_father integer foreign key references Tree (id),
- •Values (1, null, 'all'), (2, 1, 'sea'), (3, 1, 'earth'),
- •Деревья без рекурсии.
- •Пример использования сте для решения задачи Коммивояжера.
- •Insert into tur select to_town, from_town, miles from tur;
- •Глава 11. Этапы выполнения командыSql.
- •11.1. Оптимизация запросов.
- •Приложение 1. Реализация реляционной алгебры средствами оператора select (Реляционная полнота sql).
- •Intersect
- •Рекомендуемая литература
3.4.2.3. Полное внешнее соединение.
В полном внешнем соединении результатом являются строки обеих таблицы, вне зависимости от того, имеют ли они соответствия в другой таблице. Другими словами, оно работает так же, как левое и правое, но на этот раз возвращаются значения обеих таблиц. Рассмотрим пример:
SELECT А, В
FROM R1 FULL OUTER JOIN R2 ON А=В;
Опять же, R1 — левая таблица, а R2 — правая, хотя на этот раз это не так важно. Полное внешнее coединение возвратит строки из всех таблиц, включая и те, что соответствуют условию, если такие найдутся (см. Рис. 3.7.).
|
|
B | ||||||||||||||||
102 |
|
101 | ||||||||||||||||
104 |
|
102 | ||||||||||||||||
106 |
|
104 | ||||||||||||||||
107 |
|
106 | ||||||||||||||||
|
|
108 |
Рис. 3.7. R1 FULL OUTER JOIN R2
Полное внешнее соединение — это комбинация левого и правого соединения. К сожалению, по крайней мере в одной из систем баз данных, они вызовут ошибку. В MySQL, которая не поддерживает FULL OUTER JOIN вопреки стандарту SQL, результатом будет синтаксическая ошибка: SQL Error: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'OUTER JOIN entries ON …'
Различие между внутренними и внешними соединениями.
Результаты внешнего соединения всегда включают в себя результаты соответствующего внутреннего соединения, а также не соответствующие условию строки из левой, правой или обеих таблиц — в зависимости от типа соединения.
Различие между левым и правым внешним соединением лишь в том, что в первом возвращаются все строки левой таблицы с соответствиями из правой, а во втором — наоборот, все строки правой таблицы с соответствиями из левой.
В то же время, полное внешнее объединение всегда включает результаты, как левого, так и правого объединения.
3.4.2.4. Перекрёстное соединение.
В перекрёстном соединении каждая строка из одной таблицы соединяется с каждой строкой из другой таблицы. Отличительной чертой перекрёстного соединения является отсутствие условия ON, как вы можете заметить из следующего запроса:
SELECT A, B FROM R1 CROSS JOIN R2
A
B
102
101
104
102
06
104
107
106
108
Результат |
|
|
|
|
А |
В |
|
Продолжение | |
102 |
101 |
|
106 |
101 |
102 |
102 |
|
106 |
102 |
102 |
104 |
|
106 |
104 |
102 |
106 |
|
106 |
106 |
102 |
108 |
|
106 |
10 |
104 |
101 |
|
107 |
101 |
104 |
102 |
|
107 |
102 |
104 |
104 |
|
107 |
104 |
104 |
106 |
|
107 |
106 |
104 |
108 |
|
107 |
108 |
Рис. 3.8. R1 CROSS JOIN R2
Как можно видеть, перекрестное соединение эквивалентно декартову произведению. Перекрёстные соединения могут быть полезны, но используются чрезвычайно редко. Они применяются для генерации табличной структуры, содержащей все возможные комбинации двух наборов значений (в нашем примере, значений полей двух таблиц; это полезно при генерации тестовых данных или поиске недостающих значений).