Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Учебное пособие 3000555.doc
Скачиваний:
31
Добавлен:
30.04.2022
Размер:
19.12 Mб
Скачать

9.2.2. Подзапросы

С помощью SQL можно не только создавать запросы, но и вкладывать запросы внутрь друг друга.

Обычно, внутренний запрос генерирует значение, которое проверяется в предикате внешнего запроса, определяющего верно оно или нет.

Например, предположим, что имеется виртуальная база данных с рядом таблиц, среди которых таблица Prodavsy, в которой среди прочих полей имеется поле NumberP (Номер прдавца) и поле NameP(имя продавца). Мы знаем имя продавца, например, Иванов, но не знаем значение его поля NumberP (SQL имеет механизмы, которые определяют - кто имеет привилегии, чтобы делать что-то в определенной таблице).

В этой же базе данных имеется таблица Pokypca, и мы хотим извлечь из нее все данные, касающиеся продавца Иванова.

SQL позволяет сделать это с помощью следующего запроса с подзапросом

SELECT *

FROM Pokypca

WHERE NumberP =

( SELECT NumberP

FROM Prodavsy

WHERE NameP = 'Иванов');

Чтобы оценить внешний( основной ) запрос, SQL сначала должен оценить внутренний запрос ( или подзапрос ) внутри предложения WHERE.

Он делает это так, как и должен делать запрос, имеющий единственную цель - отыскать через таблицу Продавцов все строки, где поле NameP равно значению Иванов, и затем извлечь значения поля NumberP из этих строк.

Единственной найденной строкой естественно будет поле NumberP, соответствующее имени Иванов.

Пусть, например, номер Иванова равен 10. Однако SQL, не просто выдает это значение, а поместит его в предикат основного запроса вместо самого подзапроса так, чтобы предикат прочитал, что WHERE NumberP = 10

Основной запрос затем выполняется, как обычно, с вышеупомянутыми результатами.

Конечно же, подзапрос должен выбрать один и только один столбец, а тип данных этого столбца должен совпадать с тем значением, с которым он будет сравниваться в предикате.

Вообще, результатом внутреннего запроса, должна быть только одна строка.

Если внутренний запрос вернёт несколько строк или вообще ничего не вернёт, то могут возникнуть проблемы.

Для большей надёжности используйте с подзапросом оператор DISTINCT.

Единственный случай, когда подзапрос может выдавать в результате несколько строк, это когда в основном запросе используется оператор IN.

Вообще, подзапросы в SQL –это одна из сложных тем.

При создании сложных запросов с подзапросами могут применяться, кроме указанных выше, специальные операторы подзапросов Exist, Any, All, Some и некоторые другие.

Более подробно с этой темой можно ознакомиться в специальной литературе, например, в [10].

9.3. Операторы наполнения баз данных sql

В предыдущем разделе мы занимались выборками из таблиц базы данных, при этом содержание самих таблиц не менялось.

Но SQL позволяет не только делать выборку, но и менять содержимое таблиц.

Для этого в SQLимеются операторы

INSERT (Вставить)

UPDATE (Модифицировать)

DELETE (Удалить)

9.3.1. Ввод значений

Все строки в таблицу SQL вводит с использованием команды INSERT.

В самой простой форме, команда INSERT использует следующий синтаксис:

INSERT INTO <TABLE name>VALUES ( , . . .);

Предположим, что имеется таблица Sotrydniki (Сотрудники), содержащая четыре столбца (поля): номер сотрудника (NumberS), его имя (NameS), его стаж(AgeS) и название фирмы (OfficeS)

Ввести в таблицу Sotrydniki новую строку, можно следующей командой:

INSERT INTO Sotrydniki

VALUES (105, 'Ivanov', 12, 'Stele');

Команда INSERT не производит никакого вывода, и программист должен сам обеспечить некоторое подтверждение того, что данные были введены.

Каждое значение, пронумерованное в предложении значений, должно совпадать с типом данных столбца, в который оно вставляется. Значения не могут составлять выражений, например, значение поля AgeS = 12 доступно, а значение поля AgeS = 11 + 1 - нет.

Должно соблюдаться полное совпадение между порядком следования столбцов в таблице и в команде INSERT, так как значения вводятся в таблицу в поименном порядке, т. е. первое значение автоматически попадает в столбец 1, второе в столбец 2, и так далее.

Если в таблицу нужно ввести пустое значение(NULL), оно вводится точно так- же как и обычное значение.

Предположим, что еще не имелось поля AgeS для Ivanov. В этом случае можно вставить в это поле значение, равное NULL, следующим образом:

INSERT INTO Sotrydniki

VALUES (105, 'Ivanov', NULL, 'Stele');

Так как значение NULL - это специальный маркер, а не просто символьное значение, он не включается в одиночные кавычки.

В предложении INSERT можно указывать в произвольном порядке столбцы, куда вы хотите вставить значения. Для этого нужно после имени таблицы в круглых скобках через запятую указать желаемый порядок следования полей. Это позволяет вставлять значения в том же порядке.

Например,

INSERT INTO Sotrydniki (NumberS, OfficeS, AgeS, NameS)

VALUES (105, , 'Stele', , 38); 'Ivanov'

Если некоторые столбцы не перечислены, то их значения устанавливаются по умолчанию

Команду INSERT можно также использовать, чтобы получать или выбирать значения из одной таблицы и помещать их в другую, чтобы использовать их вместе с запросом. Чтобы это сделать, нужно просто заменить предложение VALUES (из предыдущего примера) на соответствующий запрос:

INSERT INTO Age

SELECT *

FROM Sotrydniki

WHERE AgeS =15;

Здесь выбираются все значения, произведенные запросом, т. е. все строки из таблицы Sotrydniki со значениями AgeS = 15, и помещаются в таблицу, называемую Age (стаж). Чтобы все это работало, таблица Age должна отвечать следующим условиям: *

  • Она должна уже быть создана командой CREATE TABLE.

  • Она должна иметь четыре столбца, которые совпадают с таблицей Sotrydniki в терминах типа данных; то есть первый, второй, и так далее, столбцы каждой таблицы, должны иметь одинаковый тип данных ( причем они не должны иметь одинаковых имен ).