Лабораторная работа № 8
Цель работы: Сформировать умения создавать запросы с помощью языка структурированных запросов SQL.
В предыдущих лабораторных работах мы научились создавать запросы с помощью таких средств, как мастер и конструктор. В данной работе мы научимся использовать для этих целей язык структурированных запросов SQL (Structured Query Language). Основным оператором языка SQL, позволяющим осуществлять отбор информации из базы данных, является оператор SELECT, который в простейшем виде может быть задан следующим образом:
SELECT < список колонок, включаемых в ответ> FROM < список таблиц> WHERE < условие>;
Предложения SELECT (отобрать) и FROM (из) должны присутствовать обязательно. Условие WНERE (где) может быть опущено. Тогда в ответ войдут все строки, имеющиеся в таблице (SQL позволяет управлять выводом в ответ повторяющихся строк, и можно добиться как вывода только уникальных строк, так и включения в ответ повторяющихся строк). Оператор SELECT может включать в себя и другие предложения, позволяющие, в частности, осуществлять упорядоченность ответа, выполнять обобщающие функции. Если в ответ должны войти все колонки, имеющиеся в исходной таблице, то вместо их перечисления в SELECT можно поставить знак «*». Так, например, запрос «Выдать всю информацию о читателях из таблицы Читатели, которые проживают на улице Чкалова» может быть представлен на SQL следующим образом:
SELECT Читатели.* FROM Читатели WHERE ((Читатели.[Домашний адрес]) Like " ул. Чкалова" & " *");
Условие, задаваемое в предложении WHERE, может быть простым и сложным. Для формулирования сложного условия могут быть использованы логические операторы And и Or. Так, например, ранее составленный запрос Операторы сравнения для поиска цены может быть представлен на SQL следующим образом:
SELECT Книги.Автор, Книги.Название, Книги.[Год издания], Книги.Стоимость FROM Книги WHERE ((Книги.Стоимость)> =20000 And (Книги.Стоимость) < =30000) ORDER BY Книги.Стоимость;
Оператор SELECT оперирует над множествами и результатом обработки в общем случае является множество строк. К этим множествам могут быть применены теоретико-множественные операции объединение (UNION), пересечение (INTERSECTION), разность (DIFFERENCE, MINUS, EXCEPT) и др. В разных реализациях языка SQL наборы теоретико-множественных операций различаются. Язык SQL позволяет запрашивать вычисляемые значения. В этом случае в предложении SELECT указывается выражение для вычисления значения колонки. Например, в рассмотренном ранее запросе Стоимость книг в условных единицах запрашивается вывод стоимости книг в условных единицах путем ее вычисления на основе хранящейся в таблице Книги стоимости по соответствующей формуле:
SELECT Книги.Автор, Книги.Название, Книги.[Год издания], [Стоимость] /2165 AS [Цена в у_е] FROM Книги;
С помощью конструкции AS в этом запросе задано имя столбца-результата. Запрос может быть простым, состоящим из одного оператора SELECT, и вложенным, кoгдa один оператор SELECT включается в состав другого оператора. Этот включенный оператор называется подзапросом (subselect) или подчиненным запросом. Существуют два типа вложенных подзапросов: обычный и коррелированный. В обычном подзапросе внутренний запрос выполняется первым, и его результат используется для выполнения основного запроса. В коррелированном подзапросе внешний запрос выполняется первым, и его результат используется для выполнения внутреннего запроса. Внутренний запрос выполняется для каждой строки, возвращенной внешним запросом. В запросе можно указать упорядоченность ответа по определенному признаку (полю, совокупности полей, выражению). Возможна подгруппировка данных в целях получения подытогов или других обобщающих величин (среднее, минимум, максимум и др.). Набор агрегатных функций отличается в разных системах. В запросе допускается только один уровень группировки. Группировка может осуществляться как по одному полю, так и по совокупности полей. В некоторых реализациях языка SQL отобранные оператором SELECT данные могут быть сохранены в виде таблицы базы данных При выполнении запроса может возникнуть необходимость соединения двух или более таблиц. Возможны разные способы задания условия соединения (вложенные запросы, задание условия соединения в предложении WHERE, операция JOIN в предложении FROM).
Общая характеристика оператора SELECТ Для отбора информации из базы данных служит оператор SELECT. Синтаксис оператора выглядит следующим образом:
SELECT [DISTINCT] {{функция агрегирования | выражение для вычисления значения [AS имя столбца]}., } | {спецификатор.*} |* FROM {{ имя таблицы [АS][имя корреляции].[(имя столбца.,..)]} | {подзапрос [АS][имя корреляции.[имя столбца.,..]} | соединенная таблица }.,.. [WHERE предикат] [GROUP ВУ {{[ имя таблицы | имя корреляции]}.| имя столбца}.,..}] [HAVING предикат] [UNION IINTERSECT | ЕХСЕРТ}[АLL] [CORRESPONDING [ВУ (имя столбца.,..)]] оператор SELECT | TABLE имя таблицы | конструктор значений таблицы] [ORDER ВУ{{столбец-результат [ASC | DESC]}.,..} | {{положительное число[АSС | DESC]}.,..}]};
Оператор состоит из предложений SELECT, FROM, WHERE, GROUP ВУ, HAVING, ORDER ВУ, которые должны быть записаны в команде именно в той последовательности, в которой они перечислены в синтаксической формуле. Предложение SELECT определяет столбцы таблицы, получаемой в результате выполнения запроса. Столбец результатной таблицы может быть задан именем столбца исходной таблицы. Если в запросе используется несколько таблиц и в них имеются поля, имеющие одинаковые имена, то для указания такого поля используется конструкция < имя таблицы>.< имя поля>. Кроме того, в предложении SELECT могут использоваться любые допустимые выражения, которые зададут формулу для определения вычисляемого поля. С помощью конструкции [AS < имя столбца> ] можно задать имя столбца-результата. Конструкцию AS можно использовать не только тогда, когда определяются вычисляемые поля, но и во всех других случаях, когда нужно задать имя столбца-результата, отличающееся от имени столбца исходной таблицы. Результат выборки может в принципе содержать повторяющиеся строки. Чтобы избежать вывода повторяющихся строк в ответе, используется параметр DISTINCT. Запросы могут использовать функции агрегирования. Стандарт языка SQL предусматривает использование следующих функций агрегирования: Count – подсчет, Sum – сумма, Мax – максимум, Min – минимум, Avg - среднее. Чаще всего функции агрегирования используются совместно с предложением GROUP ВУ, но могут применяться и самостоятельно. В последнем случае результат относится не к какой-то группе, а ко всей выборке. Существуют два типа функции COUNT. Первый тип использует символ «*». В этом случае функция подсчитывает количество строк в группе. Отдельные значения столбцов при этом не учитываются, и результат не будет зависеть от того, имеются ли в полях значения Null и указан ли параметр DISTINCT. Второй тип функции COUNT игнорирует значения Null. Если в ответ требуется включить все поля таблицы, то для этого можно использовать символ «*». Если запрос многотабличный, то следует применять конструкцию {спецификатор. *}. В предложении FROM указываются таблицы, которые используются при формулировании запроса. Кроме этого, в качестве источника данных в запросе могут быть заданы представления. Начиная со стандарта SQL-92, в предложение FROM можно включaть встроенный оператор JOIN, который служит для задания разнообразных условий соединения таблиц, участвующих в запросе. В предложении WHERE задается условие отбора записей. Предложение может включать одно выражение или несколько. Части сложного условия соединяются логическими операторами AND (И) или OR (ИЛИ). В выражениях могут использоваться следующие операторы сравнения: = (равно), < > (не равно), < (меньше), < = (меньше или равно), > (больше), > = (больше или равно), которые могут предваряться оператором NOT. Выражение может принимать одно из трех значений: TRUE, FALSE, UNKNOWN. В результатную таблицу переносятся те строки, для которых значение предиката равно TRUE. Кроме стандартных операторов сравнения в SQL можно использовать специальные операторы предикатов: < интервальный предикат >, < предикат IN>, < предикат проверки на неопределенное значение>, < предикат подобия>. При использовании интервального предиката диапазон значений можно задавать в виде WHERE [NОТ] < выражение> BETWEEN < нижнее выражение> AND < верхнее выражение> При использовании предиката IN предложение WHERE будет иметь следующий вид: WHERE [NOT] < выражение> [NOT] IN < список значений> |< подзапрос> Предикат подобия применяется для поиска подстроки в указанной строке. Предложение WHERE при использовании предиката этого типа будет иметь следующий вид: WHERE [NОТ] < выражение для вычисления значения строки 1> [NOT] LIKE < выражение для вычисления значения строки 2> Предикат проверки на неопределенное значение имеет вид предикат NULL:: = конструктор значения строки IS [NОТ] NULL При использовании подзапросов в условии WHERE может быть использован квантор существования EXISTS. Формат условия WHERE в этом случае имеет вид WHERE [NОТ] EXISTS < подзапрос> Предложение GROUP ВY используется для определения групп выходных строк, к которым могут применяться те или иные агрегатные функции. Предложение GROUP ВУ всегда используется со встроенными агрегатными функциями. Обратное утверждение неверно. Агрегатные функции могут использоваться в предложениях SELECT, HAVING. Если агрегатные функции используются без предложения GROUP ВY, то они будут применяться ко всему набору строк, удовлетворяющему условию запроса. Конструкция GROUP ВY работает только на одном уровне. Нельзя разбить каждую из этих групп на группы более низкого уровня, а затем применять стандартную функцию на каждом уровне подчиненности. Фраза GROUP ВY означает логическую перекомпоновку (группировку) таблицы по указанной колонке (колонкам). Физически таблицы в базе данных не перекомпоновываются. Логика выполнения запроса при использовании GROUP ВY несколько отличается от реализации обычного запроса. Фраза SELECT при использовании GROUP ВY применяется к каждой группе, а не к каждой строке, как обычно. Каждое выражение во фразе SELECT должно принимать единственное значение для группы, т.е. оно может быть либо самой колонкой, либо арифметическим выражением, включающим эту колонку, либо агрегатной функцией, которая получает в результате единственное значение для группы. Кроме того, в SELECT может быть включена константа. Вместе с предложением GROUP ВY может использоваться предложение HAVING, которое для групп имеет то же значение, что и фраза WНERE – для строк. Корректирующие операторы Оператор INSERT позволяет включить в таблицу новые строки. Он имеет следующий вид: INSERT INTO имя таблицы [(имя столбца,...)] выражение запроса [конструктор значений таблицы] |{DEFAULT VALUES} Если список столбцов не задан, то значения должны вводиться в каждый столбец таблицы; если список столбцов задан, то значения соответственно должны вводиться в те столбцы, которые перечислены в списке, и в том порядке, в котором они расположены в нем. Элементы в списке значений могут быть константами, функциями, переменными памяти. Если эти элементы являются константами, то при их задании используются определенные разделители в зависимости от типа вводимых данных: символьные данные заключаются в кавычки, даты – в фигурные скобки, логические – в точки, числовые данные вводятся без разделителей. Пример использования оператора INSERT: INSERT INTO Издательства VALUES (6, " Новое знание", " Минск"); В данном примере значения вводятся во все столбцы таблицы, поэтому < список столбцов> не указан. Если значения, которые необходимо ввести, являются результатом выполнения запроса, то эти значения также помещаются в специфицированные колонки и должны соответствовать им по типу. При использовании < подзапроса> в указанную таблицу вводятся данные, отобранные из другой таблицы (или даже нескольких таблиц). Командой, позволяющей корректировать содержание таблицы, является оператор UPDATE, имеющий следующий формат: UPDATE < имя таблицы> SET < имя столбца> = < новое значение> [, < имя столбца> = < новое значение>...] [< предложение WHERE> ]; Используя оператор UPDATE, можно изменить значения указанного столбца для всех записей таблицы, если предложение WHERE не задано, или для записей, удовлетворяющих условию запроса, если используется предложение WHERE. Оператор UPDATE Книги SET Стоимость=Стоимость*1.1; увеличивает стоимость книг для всех записей в таблице Книги на 10 %. Оператор UPDAТЕ Книги SET Стоимость=Стоимость*0.9 WHERE [Год издания] < 2000; уменьшает стоимость книг, изданных до 2000 года, на 10 %. Оператор DELETE можно использовать для удаления строк таблицы: DELETE FROM < имя таблицы> [< предложение WHERE> ]; Следует быть осторожным при использовании оператора DELETE, поскольку, если фраза WHERE в операторе DELETE отсутствует, будут удалены все строки таблицы. То же самое произойдет, если неправильно указать условие отбора и в результате не будет отобрано ни одной строки в таблице. Оператор DELETE физически удаляет строки таблицы.
|