SQL позволяет использовать одни запросы внутри других запросов, то есть вкладывать запросы друг в друга. Предположим, известна фамилия студента («Петров»), но неизвестно значение поля student_id для него.
Чтобы извлечь данные обо всех оценках этого студента, можно записать следующий запрос:
SELECT *
FROMEXAM_MARKS
WHERESTUDENT_ID =
(SELECTSTUDENT_ID
FROMSTUDENT WHERESURNAME = 'Петров');
Как работает запрос SQL со связанным подзапросом?
· Выбирается строка из таблицы, имя которой указано во внешнем запросе.
· Выполняется подзапрос и полученное значение применяется для анализа этой строки в условии предложения WHEREвнешнего запроса.
· По результату оценки этого условия принимается решение о включении или не включении строки в состав выходных данных.
· Процедура повторяется для следующей строки таблицы внешнего запроса
Приведенный выше запрос корректен только в том случае, если в результате выполнения, указанного в скобках подзапроса возвращается единственное значение. Если в результате выполнения подзапроса будет возвращено несколько значений, то этот подзапрос будет ошибочным. В данном примере это произойдет, если в таблице STUDENT будет несколько записей со значениями поля SURNAME='Петров'.
В некоторых случаях для получения единственного значения в результате выполнения подзапроса используется DISTINCT. Одним из видов функций, которые всегда выдают единственное значение являются агрегирующие функции.
Оператор IN используется в подзапросах.
Подзапросы можно применять внутри предложения HAVING
Пусть требуется определить количество предметов обучения с оценкой, превышающей среднее значение оценки студента с идентификатором 301.
FROMEXAM_MARKS
GROUP BY MARK
HAVING MARK>
(SELECT AVG(MARK) FROM EXAM_MARKS WHERESTUDENT_ID=301);
Команды манипулирования данными
В SQL для выполнения операций ввода данных в таблицу их изменения и удаления предназначены три команды манипулирования данными (DML). Это команды INSERT(вставить), update(обновить), delete(удалить).
Команда INSERTосуществляет вставкув таблицу новой строки. В простейшем случае она имеет вид:
При такой записи указанные в скобках после ключевого слова valuesзначения вводятся в поля добавленной в таблицу новой строки в том порядке, в котором соответствующие столбцы указаны при создании таблицы, то есть в операторе CREATE TABLE.
Например, ввод новой строки в таблицу student может быть осуществлен следующим образом:
Чтобы команда могла быть выполнена, таблица с именем (student) должна быть создана командой create table.Если в какое-либо поле необходимо вставить NULL-значение, то оно вводится как обычное значение;
В случаях, когда необходимо ввести значения полей в порядке, отличном от порядка столбцов, заданного командой create table,или требуется ввести значения не во все столбцы, следует
использовать следующую форму команды insert
INSERT INTOSTUDENT (STUDENT_ID, CITY, SURNAME, NAME)
VALUES (101, ‘Москва’, ‘Иванов’, ‘Саша’);
С помощью команды insertможно извлечь значение из одной таблицы и разместить его в другой, например, запросом