Средства манипулирования данными. Запросы на вставку, выборку, обновление и удаление данных
Оператор выборки данных SELECT является наиболее важным и самым часто используемым оператором языка SQL. Он один реализует все 8 операций реляционной алгебры, описанной ранее. Его задача, как уже говорилось, – выбрать из базы данных те или иные данные, исходя из заданных оператором условий. Несмотря на кажущуюся простоту (один оператор заменил 8 операций реляционной алгебры), его использование сродни составлению алгоритмов для простых программ и требует определенных навыков.
Синтаксис оператора SELECT имеет следующий вид:
SELECT [ALL | DISTINCT] (список_полей | *)
FROM список_таблиц
[WHERE условия_выбора_или_соединения]
[GROUP BY выражение_группировки]
[HAVING условие_группы]
[ORDER BY условие_сортировки]
Как и в описаниях предыдущих операторов, квадратные скобки [] указывают на необязательность того или иного предложения в запросе.
Ключевое слово ALL означает, что результирующий запрос содержит все строки, удовлетворяющие условиям запроса. В этом случае в результирующий набор могут попасть одинаковые строки, что нарушает принципы теории отношений (отсутствие одинаковых кортежей). Ключевое слово DISTINCT означает, что результирующий запрос содержит только разные строки, то есть дубликаты не включаются.
Аргумент «список_полей» описывает необходимые столбцы, которые будут включены в результирующее отношение. Символ * в списке полей означает, что будут включены все столбцы исходных таблиц запроса. В случае выбора данных из одной таблицы допустимы следующие варианты: * - все столбцы таблицы, имя_столбца, …, имя_столбца – указанные столбцы таблицы. В случае выбора данных из нескольких таблиц необходимо дополнительно указывать имя таблицы, допустимы следующие варианты: * - все столбцы всех таблиц, имя_таблицы.* - все столбцы указанной таблицы, имя_таблицы.имя_столбца – указанный столбец указанной таблицы.
Если в двух таблицах, участвующих в запросе, есть столбцы с одинаковыми именами, имена второго и последующих столбцов изменяются автоматически (добавляется номер, например два столбца NAME и NAME становятся NAME и NAME1). Чтобы избежать проблем, связанных с подобным автоматическим переименованием, допускается в списке полей указать псевдоним, под которым этот столбец будет присутствовать в результирующем отношении (фактически, определить имя, с которым он и будет переименован). В этом случае к имени столбца необходимо добавить фразу: AS новое_имя.
Аргумент «список_таблиц» указывает перечень имен таблиц, из которых производится выборка сведений, условия которой задаются значением аргумента «условия_выборки_или_соединения». Как видно, условие выборки необязательно, когда оно не указано, будут выбраны все кортежи. Например, следующий запрос выберет все кортежи отношения Студент, отобразив все столбцы:
SELECT * FROM students
Чтобы выбрать только столбцы, соответствующие имени студента, необходимо * заменить на перечень необходимых столбцов. Столбцы указываются в той последовательности, в которой будет осуществляться их вывод, запятые между столбцами обязательны:
SELECT last_name, first_name, mid_name FROM students
Оператор SELECT также позволяет отбирать не только значения столбцов, но и в качестве дополнительного столбца значения арифметических выражений. Например, можно выполнить запрос, отображающий сумму стипендии, выплачиваемой студенту за год:
SELECT last_name, first_name, mid_name, grant, (grant * 12) AS annual_grant
FROM students
Чтобы отобрать не все записи таблицы или набора таблиц, используется условие выборки, которое представляет собой логическое выражение, составленное из простейших операций сравнения с помощью логических операторов AND (И), OR (ИЛИ) и NOT (НЕ) (естественно, как и в любых сложных выражениях допускается использование скобок). В простейших операциях сравнения могут участвовать как имя столбца и некоторая константа, так и имена двух столбцов. Первый случай отвечает собственно за выборку (фильтрацию), второй – за соединение.
Пусть нам требуется определить имя студента, чей студенческий билет имеет номер 123123, тогда необходимо выполнить следующий запрос (в этом примере тип столбца считается числовым):
SELECT last_name, first_name, mid_name FROM students WHERE id_card_num=123123
Если же тип столбца строковый, то текстовую константу необходимо заключить в одинарные кавычки:
SELECT last_name, first_name, mid_name FROM students WHERE id_card_num=’сб1048а’
Пусть теперь нам требуется выбрать из базы данных информацию о студенте Петрове и преподавателе, который руководит его дипломной работой. Очевидно, в этом запросе уже будут участвовать две сущности Студент и Преподаватель (таблицы students и professors), а условие выбора в этом случае будет составным – одной частью будет условие соединения этих сущностей, а второй частью будет условие на фамилию студента:
SELECT * FROM students, professors
WHERE students.teacher = professors.id AND students.last_name = ‘Петров’
Как видно из примера, в случае выбора более чем из одной таблицы необходимо указывать не только имена столбцов, но и имена таблиц, из которых эти столбцы берутся. В нашем примере в столбце teacher сущности Студент хранится уникальный идентификатор преподавателя, который руководит его работой. Этот уникальный идентификатор должен совпадать со значением столбца id сущности Преподаватель (условие соединения). Условием фильтрации является равенство значения столбца last_name (фамилия) значению «Петров».
Выражение группировки и ключевое слово GROUP BY позволяют сгруппировать строки результирующего отношения по значению определенного столбца (выражение). Этот столбец или выражение должно быть указано в качестве выражения группировки. В этом случае можно использовать групповые функции для получения информации по каждой группе.
Например, можно подсчитать количество студентов, учащихся в группе номер 113. Для этого потребуется выполнить следующий запрос:
SELECT group_num, count(group_num) FROM students WHERE group_num=113
GROUP BY group_num
Если же убрать условие на номер группы, то можно получить список всех групп с указанием числа их учащихся:
SELECT group_num, count(group_num) FROM students
GROUP BY group_num
Для исключения некоторых групп нельзя использовать ключевое слово WHERE. Для этого требуется использовать специальное ключевое слово HAVING. Синтаксис его использования следующий:
HAVING условие_ограничения_групп
Условие, определяющее ограничения на группы, определяется так же, как и условия для ключевого слова WHERE – это логическое выражение, состоящее из простейших сравнений, в которые входит столбец или выражение, по которому производится группировка. Например, если требуется вывести группы только пятого курса, условие может выглядеть следующим образом:
SELECT group_num, count(group_num) FROM students
GROUP BY group_num
HAVING group_num >=500
Ключевое слово ORDER BY позволяет отсортировать кортежи результирующего отношения в необходимом порядке. Синтаксис использования оператора следующий:
ORDER BY имя_столбца [порядок_сортировки], …, имя_столбца [порядок_сортировки]
Поддерживаются два порядка сортировки: по убыванию и по возрастанию. При этом сортировка может производиться не только по одному столбцу, но и по нескольким столбцам в разных порядках. Для сортировки по возрастанию используется ключевое слово ASC, для сортировки по убыванию – DESC. Порядок сортировки можно и не указывать, тогда по умолчанию производится сортировка по возрастанию. Например, для сортировки списка студентов по фамилии в алфавитном порядке (по возрастанию), необходимо выполнить запрос:
SELECT last_name, first_name, mid_name FROM students
ORDER BY last_name ASC
или просто без указания порядка:
SELECT last_name, first_name, mid_name FROM students
ORDER BY last_name
Если требуется отобразить студентов по дате поступления, так чтобы поступившие недавно возглавляли список, необходимо отсортировать данные по столбцу «Дата поступления» (столбец date_in) в порядке убывания:
SELECT last_name, first_name, mid_name, date_in FROM students
ORDER BY date_in DESC
В случае использования в запросе не только столбцов, но и выражений, допускается сортировка результирующего отношения по выражению. Тогда вместо всего выражения можно указать его номер:
SELECT last_name, first_name, mid_name, grant, (grant * 12) AS annual_grant
FROM students ORDER BY 5
Чтобы отсортировать сведения о студентах по полному имени, требуется указать все три составляющие имени в качестве столбцов сортировки:
SELECT last_name, first_name, mid_name FROM students
ORDER BY last_name ASC, first_name ASC, mid_name ASC
Описанный ранее пример по выбору номеров групп с числом учащихся в них можно улучшить, отсортировав группы по возрастанию номеров:
SELECT group_num, count(group_num) FROM students
GROUP BY group_num
ORDER BY group_num ASC
Вообще же при группировании строк допускается использование следующих групповых функций:
COUNT Вычисляет количество кортежей в группе
SUM Вычисляет в группе сумму всех значений в указанном столбце
AVG Вычисляет в группе среднее значение для указанного столбца
MIN Вычисляет в группе минимальное значение в указанном столбца
MAX Вычисляет в группе максимальное значение в указанном столбце
Необходимо также отметить, как влияет неопределенное значение NULL на работу групповых функций. Функция COUNT: если в столбце есть неопределенные значения, то функция COUNT вернет количество тех кортежей, для которых значение определено и к которым применимо условие группирования. Функция COUNT(*) подсчитает все кортежи, включая те, в которых встречается неопределенное значение. Функция AVG: если в столбце есть неопределенные значения, то функция AVG вычислит среднее значение среди всех известных значений. Если же все значения будут NULL, то функция AVG вернет также значение NULL.
Особый интерес представляют вложенные запросы, когда оператор SELECT выбирает данных на основе результата выборки другого оператора SELECT. В этом случае синтаксис оператора SELECT следующий:
SELECT (список_полей | *)
FROM имя_таблицы
WHERE выражение оператор
(SELECT (список_полей | *)
FROM имя_таблицы
……............................)
Здесь в качестве «оператора» могут выступать обычные арифметические операции сравнения или оператор IN. По количеству кортежей, возвращаемых вложенным запросом, подзапросы разделяют на однострочные и многострочные. В первом случае, когда подзапрос возвращает один кортеж (одно значение), можно пользоваться операторами =, >, <, <=, >=, <>. А вот в случае многострочных подзапросов, когда возвращается целое множество значений, допустимо использование только оператора IN (NOT IN).
Правила оформления подзапроса следующие:
- подзапрос должен быть заключен в круглые скобки;
- подзапрос должен находиться справа от оператора сравнения в выражении сравнения;
- в подзапросе нельзя использовать оператор ORDER BY.
Вложенная команда SELECT выполняется первой. После этого результат выполнения передается во внешнюю команду. Например, пусть нам требуется выбрать всех студентов, обучающихся в той же группе, что и студент «Петров Иван Павлович», тогда запрос должен быть следующим:
SELECT last_name, first_name, mid_name, group_num
FROM students
WHERE group_num = (SELECT group_num
FROM students
WHERE last_name = ‘Петров’ AND first_name = ‘Иван’
AND mid_name= ‘Павлович’)
Приведенный выше пример является случаем однострочного подзапроса (при условии, что полный тезка студента не учится вместе с ним в университете). Рассмотрим теперь случай многострочного подзапроса, например, когда нужно имена студентов, которыми руководят преподаватели «Кузнецов Петр Иванович» и «Селиванов Константин Сергеевич»:
SELECT last_name, first_name, mid_name
FROM students
WHERE professor_id IN (SELECT id
FROM professors
WHERE (last_name = ‘Кузнецов’ AND first_name = ‘Петр’
AND mid_name= ‘Иванович’) OR
(last_name = ‘Селиванов’ AND first_name = ‘Константин’
AND mid_name= ‘Сергеевич’))
Очевидно, что в данном случае вложенный подзапрос вернет множество из двух значений, а значит необходимо уже пользоваться оператором IN.
Также подзапросы можно использовать не только в предложении WHERE, но и в предложении HAVING (в случае группировки результатов).
Вернемся теперь к собственно манипулированию данными, то есть к наполнению базы данных сведениями (оператор INSERT), исправлению данных (оператор UPDATE) и удалению данных (оператор DELETE).
Синтаксис команды INSERT следующий:
INSERT INTO имя_таблицы [(имя_столбца [, имя_столбца…])]
VALUES (значение [, значение, …, значение])
Команда INSERT вставляет в таблицу новую строку целиком, то есть содержащую значения для каждого из столбцов, в том числе неопределенные. Для того, чтобы вставить значения для нескольких столбцов, необходимо явно указать их имена после названия таблицы, при этом значения для столбцов, не указанных в запросе, считаются неопределенными. Значения для столбцов указываются после слова VALUES в том порядке, в каком следуют названия столбцов. Строковые значения и даты заключаются в одинарные кавычки.
Пусть в таблице students содержится 5 полей: фамилия, имя, отчество, дата рождения и номер группы. Тогда добавление записи в таблицу может производится следующим запросом:
INSERT INTO students VALUES (‘Петров’, ‘Семен’, ‘Сергеевич’, ’12.12.1983’, 331)
Любое из добавляемых значений может быть принудительно задано неопределенным, для этого вместо значения необходимо указать ключевое слово NULL:
INSERT INTO students VALUES (‘Петров’, ‘Семен’, ‘Сергеевич’, NULL, 331)
Если же требуется ввести данные не во все столбцы таблицы, то имена требуемых столбцов необходимо задать явно:
INSERT INTO students last_name, first_name, group_num
VALUES (‘Петров’, ‘Семен’, 331)
В этом случае все другие столбцы будут иметь неопределенное значение NULL.
При добавлении строк в таблицу допускается использование подзапросов. В этом случае синтаксис запроса следующий:
INSERT INTO имя_таблицы [(имя_столбца [, имя_столбца…])]
подзапрос
Однако, в этом случае надо быть особенно внимательным, если явно не указывать имена столбцов, так как в этом случае потребуется совпадение структуры исходной таблицы и той, в которую данные переносятся. В любом случае, количество столбцов таблицы и количество столбцов подзапроса должно совпадать.
Например, можно перенести данные из таблицы поступающих в таблицу студентов (после принятия экзамена, также считая, что структуры таблиц идентичны):
INSERT INTO students
SELECT * FROM entrants WHERE exam_pass = ‘true’
Если же структуры таблиц не совпадают, то потребуется указать имена переносимых столбцов (фамилия, имя, отчество, дата рождения):
INSERT INTO students (last_name, first_name, mid_name, birth_date)
SELECT last_name, first_name, mid_name, birth_date FROM entrants
WHERE exam_pass = ‘true’
Обновление значений в таблице происходит во многом аналогично. Синтаксис оператора UPDATE следующий:
UPDATE имя_таблицы
SET имя_столбца = значение [, имя_столбца = значение, …]
[WHERE условие]
Условие оператора WHERE позволяет ограничить перечень строк, в которых будут обновлены значения. В отсутствие условия значения будут обновлены во всей таблице.
Например, для перевода студентов из 211 в 311 группу, необходимо выполнить запрос:
UPDATE students
SET group_num = 311
WHERE group_num = 211
Чтобы изменить дату рождения преподавателя «Петров Алексей Дмитриевич», необходимо выполнить запрос:
UPDATE professors
SET birth_date = ‘1.4.1958’
WHERE last_name = ‘Петров’ AND first_name = ‘Алексей’ AND mid_name = ‘Дмитриевич’
Увеличить зарплату каждого преподавателя на 3000 можно следующим запросом (обратите внимание, что оператор WHERE отсутствует):
UPDATE professors
SET salary = salary + 3000
Вместе с зарплатой можно одновременно увеличить и премии на 1000 рублей, тогда запрос будет следующий:
UPDATE professors
SET salary = salary + 3000, bonus = bonus + 1000
С помощью оператора UPDATE можно также и изменить значение на неопределенное:
UPDATE professors
SET birth_date = NULL
WHERE last_name = ‘Петров’ AND first_name = ‘Алексей’ AND mid_name = ‘Дмитриевич’
Удаление строк из таблиц производится еще более просто. Синтаксис оператора DELETE следующий:
DELETE FROM имя_таблицы
[WHERE условие]
Как и в случае оператора UPDATE, указание условия фильтрации (предложение WHERE) необязательно. В этом случае будут удалены все строки из таблицы. Если же требуется удалить не все строки, то необходимый перечень строк определяется условием.
Например, очистить таблицу с абитуриентами после поступления можно следующим образом:
DELETE FROM entrants
Удалить отдельного студента из таблицы после отчисления можно с помощью следующего запроса:
DELETE FROM students
WHERE last_name=’Курилова’ AND first_name = ‘Юлия’ AND mid_name = ‘Викторовна’
Ян ОПИ(Э) 07 27 октября, 2009 в 13:52:56
а во нашел :DDD что-то сразу не заметил ппц
Добавить комментарий