- •Глава 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.1. Внутреннее соединение.
Во внутреннем соединении возвращаются только те строки, которые соответствуют условию, указанному после ключевого слова ON. Это наиболее распространённый вид соединений. В следующем примере, как и в большинстве случаев, условие ON указывает два поля, которые должны иметь совпадающие значения. Здесь, если значение (поля A) в строке первой таблицы (R1) равно значению (поля В) в строке второй таблицы (R2), условие выполняется и строки соединяются:
SELECT А, В
FROM R1 INNER JOIN R2 ON А=В;
Рисунок иллюстрирует принцип работы внутреннего соединения.
|
|
B | ||||||||||
102 |
|
101 | ||||||||||
104 |
|
102 | ||||||||||
106 |
|
104 | ||||||||||
107 |
|
106 | ||||||||||
|
|
108 |
Рис. 3.4. R1 INNER JOIN R2
Как вы можете видеть, строка из R1 соединяется со строкой из R2, если их значения одинаковы. Поэтому в результате возвращаются значения 102, 104 и 106. Значение 107 из таблицы R1 не имеет соответствий в таблице R2, и поэтому не включается в результат. Аналогично, значения 101 и 108 из таблицы R2 не встречаются в таблице R1, поэтому и они тоже не включаются в набор.
Данная форма эквивалентна следующему запросу с условием WHERE
SELECT А, В FROM R1, R2 WHERE А = В;
3.4.2. Внешнее соединение.
Внешние соединения отличаются от внутренних тем, что могут возвращать строки, соответствующие условию и некоторые из тех, что не соответствуют ему.
3.4.2.1. Левое внешнее соединение.
В левом внешнем соединении результатом являются все строки левой таблицы, вне зависимости от того, имеют ли они подходящую пару в правой таблице. Но какая, же из них левая, а какая правая? Оказывается, это таблицы, указанные слева и справа от ключевых слов OUTER JOIN. Например, в следующей команде, R1 — левая таблица, а R2 — правая, и задано левое внешнее объединение.
SELECT А, В
FROM R1 LEFT OUTER JOIN R2 ON А=В;
Рисунок демонстрирует результаты такого соединения.
Результат |
|
А |
В |
102 |
102 |
104 |
104 |
106 |
106 |
107 |
NULL |
A |
|
B |
102 |
101 | |
104 |
102 | |
106 |
104 | |
107 |
106 | |
|
|
108 |
Рис. 3.5. R1 LEFT OUTER JOIN R2
Заметьте, что все значения из таблицы R1 включены в результат, так как она является левой таблицей. Значение 107, не встречающееся в таблице R2, тоже включено в результат, однако в строке вместе с ним нет значения из R2, оно пустое(NULL).
3.4.2.2. Правое внешнее соединение.
В правом внешнем соединении результатом являются все строки правой таблицы, вне зависимости от того, имеют ли они подходящее соответствие в левой таблице. Другими словами, правое соединение работает так же, как и левое, с тем лишь отличием, что возвращаются все строки из правой таблицы.
SELECT A, B
FROM R1 RIGHT OUTER JOIN R2 ON A=B
В приведённом примере R1 по-прежнему является левой таблицей, а R2 — правой, поскольку именно в таком порядке они указаны по отношению к ключевым словам OUTER JOIN. Поэтому результат соединения содержит все строки таблицы R2 и строки таблицы R1, соответствующие условию, если такие имеются (см. Рис. 3.6.).
Результат |
|
А |
В |
NULL |
101 |
102 |
102 |
104 |
104 |
106 |
106 |
NULL |
108 |
A |
|
B |
102 |
101 | |
104 |
102 | |
106 |
104 | |
107 |
|
106 |
|
108 |
Рис. 3.6. R1 RIGHT OUTER JOIN R2
Правое внешнее соединение противоположно левому. На одинаковых таблицах — левой R1 и правой R2— результаты правого и левого внешних объединений сильно различаются. На этот раз возвращаются все значения таблицы R2. Значения 101 и 108, не встречающиеся в R1, тоже включены в результат — в виде пустого значения в соответствующем поле. Опять-таки, строка включается в результат, несмотря на отсутствие значений в таблице R1.