- •1.1. Технические параметры баз данных
- •1.2. Организация субд
- •1.6. Сетевая и иерархическая модели данных
- •1.7. Case - методы проектирования баз данных
- •1.8. Понятия “сущность” и “взаимосвязь”
- •4. Складывание.
- •5.3. Индексированные файлы
- •5.4. Операции с поиском по неключевым полям
- •6.2. Типы данных в sql
- •Int Число без десятичной точки. Эквивалентно decimal, но без
- •6.3. Обозначения в командах sql
- •6.... Оператор in
- •6.... Оператор between
- •6.... Оператор like
- •6.... Оператор is null
- •7.5... Скалярное выражение на основе выбранных полей
- •7.6... Упорядочение вывода полей
- •7.7.. Объединения нескольких таблиц в запросе
- •7.8.. Создание обьединения
- •7.9..Объединение таблиц через справочную целостность
- •7.10.. Объединения таблиц по равенству значений
- •7.11.. Объединение более двух таблиц
- •7.12. Объединение таблицы с собой
- •8.2. Значения, которые могут выдавать подзапросы
- •8.3. Предикаты с подзапросами являются необратимыми
- •8.4. Использование агрегатных функций в подзапросах
- •8.5. Использование подзапросов которые выдают
- •8.8. Подзапросы в предложении having
- •Insert into Londonstaff
- •Insert into Daytotals (date, total)
- •Insert для этой таблицы. Null - это наиболее широко используемое
- •1009, И Hoffman и Clemens будут также автоматически изменены.
- •Insert Пользователь с этой привилегией может выполнять
- •Insauth Имеет ли пользователь привилегию insert
- •Values ( :id_num, :salesperson, :loc, :comm)
- •Values (:id_num, :salesperson, :loc, :comm);
- •Into :id_num, :salesperson, :loc, :comm
- •Into :salesnum
- •1. Команда выполнилась без ошибки, но не произвела никакого
- •Into :id_num, :salesperson, :loc, :comm;
- •Indicator.
- •Indicator, связывая ее с каждой переменной главного языка, специальным способом, эмулирующим поведение null значений sql.
- •Values (:Id_num, :salesperson, :loc:i_a, :comm:i_b);
- •Indicator. Переменные indicator следуют за другим именами переменных в команде sql, без каких бы то ни было посторонних символов
8.2. Значения, которые могут выдавать подзапросы
Подзапрос должен возвращать одно и только одно значение.
Если в предыдущем подзапросе назначить условие snum “ WHERE city = “London” вместо “WHERE sname = ‘Motika”, то можно получить несколько различных значений. Это может сделать уравнение в предикате основного запроса невозможным для оценки истинности или неистинности, и команда выдаст ошибку.
При использовании подзапросов в предикатах, основанных на реляционных операторах, вы должны убедиться, что использовали подзапрос, который будет выдавать одну и только одну строку вывода. Если вы используете подзапрос, который не выводит никаких значений вообще, команда не потерпит неудачи; но основной запрос не выведет никаких значений.
Подзапросы, которые не производят никакого вывода (или нулевой вывод), вынуждают рассматривать предикат ни как истинный, ни как неистинный, а как неизвестный. Однако, неизвестный предикат имеет тот же самый эффект что и неистинный: никакие строки не выбираются основным запросом.
DISTINCT С ПОДЗАПРОСАМИ
Вы можете использовать DISTINCT, чтобы вынудить подзапрос генерировать одиночное значение. Предположим, что мы хотим
найти все приобретения для тех продавцов, которые обслуживают
Hoffmanа ( cnum = 2001 ).
Имеется один способ, чтобы сделать это:
SELECT *
FROM Orders
WHERE snum =
( SELECT DISTINCT snum
FROM Orders
WHERE cnum = 2001 );
=============== SQL Execution Log ==============
| =============================================== |
| onum amt odate cnum snum |
| ----- --------- --------- ------ ------- |
| 3003 767.19 10/03/1990 2001 1001 |
| 3008 4723.00 10/05/1990 2006 1001 |
| 3011 9891.88 10/06/1990 2006 1001 |
================================================
Подзапрос установил что значение поля snum совпало с Hoffman - 1001, и
затем основной запрос выделил все приобретения с этим значением snum из таблицы Приобретений( не разбирая, относятся они к Hoffman или нет). Так как каждый заказчик назначен к одному и только этому продавцу, мы знаем, что каждая строка в таблице Приобретений с данным значением cnum должна иметь такое же значение snum. Однако так как там может быть любое число таких строк, подзапрос мог бы вывести много ( хотя и идентичных ) значений snum для данного поля cnum. Аргумент DISTINCT предотвращает это. Если наш подзапрос возвратит более одного значения, это будет указывать на
ошибку в наших данных - хорошая вещь для знающих об этом.
.
8.3. Предикаты с подзапросами являются необратимыми
Вы должны обратить внимание что предикаты включающие подзапросы, используют выражение
< скалярная форма > < оператор > < подзапрос >,
а, не < подзапрос > < оператор > < скалярное выражение >
или, < подзапрос > < оператор > < подзапрос >.
Другими словами, вы не должны записывать предыдущий пример так:
SELECT *
FROM Orders
WHERE ( SELECT DISTINCT snum
FROM Orders
WHERE cnum = 2001 )
= snum;
В строгой ANSI реализации, это приведет к неудаче, хотя некоторые программы и позволяют делать такие вещи. ANSI также предохраняет вас от появления обоих значений при сравнении, которые нужно вывести с помощью подзапроса.