Поможем написать учебную работу
Если у вас возникли сложности с курсовой, контрольной, дипломной, рефератом, отчетом по практике, научно-исследовательской и любой другой работой - мы готовы помочь.
Если у вас возникли сложности с курсовой, контрольной, дипломной, рефератом, отчетом по практике, научно-исследовательской и любой другой работой - мы готовы помочь.
Практическая работа №8
Тема: Создание простых запросов на выборку SQL. Подчиненные запросы.
Цель: научиться создавать SQL-запросы на выборку данных, использовать функции SQL, создавать подзапросы с одним и несколькими уровнями сложности.
Ход работы
Синтаксис оператора SELECT
Предложение SELECT может использоваться как:
• самостоятельная команда на получение и вывод строк таблицы, сформированной из столбцов и строк одной или нескольких таблиц (представлений);
• элемент WHERE- или HAVING-условия (сокращенный вариант предложения, называемый "вложенный запрос");
• фраза выбора в командах CREAT VIEW, DECLARE CURSOR или INSERT;
• средство присвоения глобальным переменным значений из строк сформированной таблицы (INTO-фраза). Здесь в синтаксических конструкциях используются следующие обозначения:
• звездочка (*) для обозначения "все" - употребляется в обычном для программирования смысле, т.е. "все случаи, удовлетворяющие определению";
• квадратные скобки ([]) означают, что конструкции, заключенные в эти скобки, являются необязательными (т.е. могут быть опущены);
• фигурные скобки ({}) означают, что конструкции, заключенные в эти скобки, должны рассматриваться как целые синтаксические единицы, т.е. они позволяют уточнить порядок разбора синтаксических конструкций, заменяя обычные скобки, используемые в синтаксисе SQL;
• многоточие (...) указывает на то, что непосредственно предшествующая ему синтаксическая единица факультативно может повторяться один или более раз;
• прямая черта (|) означает наличие выбора из двух или более возможностей. Например обозначение ASC|DESC указывает, можно выбрать один из терминов ASC или DESC; когда же один из элементов выбора заключен в квадратные скобки, то это означает, что он выбирается по умолчанию (так, [ASC]|DESC означает, что отсутствие всей этой конструкции будет восприниматься как выбор ASC); • точка с запятой (;) завершающий элемент предложений SQL;
• запятая (,) используется для разделения элементов списков;
• пробелы ( ) могут вводиться для повышения наглядности между любыми синтаксическими конструкциями предложений SQL;
• прописные жирные латинские буквы и символы используются для написания конструкций языка SQL и должны (если это специально не оговорено) записываться в точности так, как показано;
• строчные буквы используются для написания конструкций, которые должны заменяться конкретными значениями, выбранными пользователем, причем для определенности отдельные слова этих конструкций связываются между собой символом подчеркивания (_);
• термины таблица, столбец, ... заменяют (с целью сокращения текста синтаксических конструкций) термины имя_таблицы, имя_столбца, ..., соответственно;
• термин таблица используется для обобщения таких видов таблиц, как базовая_таблица, представление или псевдоним; здесь псевдоним служит для временного (на момент выполнения запроса) переименования и (или) создания рабочей копии базовой_таблицы (представления). Предложение SELECT (выбрать) имеет следующий формат: подзапрос [UNION [ALL] подзапрос] ... [ORDER BY {[таблица.]столбец | номер_элемента_SELECT} [[ASC] | DESC] [,{[таблица.]столбец | номер_элемента_SELECT} [[ASC] | DESC]] ...;
и позволяет объединить (UNION) а затем упорядочить (ORDER BY) результаты выбора данных, полученных с помощью нескольких "подзапросов". При этом упорядочение можно производить в порядке возрастания - ASC (ASCending) или убывания DESC (DESCending), а по умолчанию принимается ASC.
В этом предложении подзапрос позволяет указать условия для выбора нужных данных и (если требуется) их обработки
SELECT (выбрать) данные из указанных столбцов и (если необходимо) выполнить перед выводом их преобразование в соответствии с указанными выражениями и (или) функциями
FROM (из) перечисленных таблиц, в которых расположены эти столбцы
WHERE (где) строки из указанных таблиц должны удовлетворять указанному перечню условий отбора строк
GROUP BY (группируя по) указанному перечню столбцов с тем, чтобы получить для каждой группы единственное агрегированное значение, используя во фразе SELECT SQL-функции SUM (сумма), COUNT (количество), MIN (минимальное значение), MAX (максимальное значение) или AVG (среднее значение)
HAVING (имея) в результате лишь те группы, которые удовлетворяют указанному перечню условий отбора групп и имеет формат
SELECT [[ALL] | DISTINCT]{ * | элемент_SELECT [,элемент_SELECT] ...} FROM {базовая_таблица | представление} [псевдоним] [,{базовая_таблица | представление} [псевдоним]] ... [WHERE фраза] [GROUP BY фраза [HAVING фраза]];
Элемент_SELECT - это одна из следующих конструкций: [таблица.]* | значение | SQL_функция | системная_переменная
где значение это: [таблица.]столбец | (выражение) | константа | переменная
Синтаксис выражений имеет вид ( {[ [+] | - ] {значение | функция_СУБД} [ + | - | * | ** ]}... )
а синтаксис SQL_функций одна из следующих конструкций: {SUM|AVG|MIN|MAX|COUNT} ( [[ALL]|DISTINCT][таблица.]столбец ) {SUM|AVG|MIN|MAX|COUNT} ( [ALL] выражение ) COUNT(*)
Фраза WHERE включает набор условий для отбора строк: WHERE [NOT] WHERE_условие [[AND|OR][NOT] WHERE_условие]...
где WHERE_условие одна из следующих конструкций: значение { = | <> | < | <= | > | >= } { значение | ( подзапрос ) } значение_1 [NOT] BETWEEN значение_2 AND значение_3 значение [NOT] IN { ( константа [,константа]... ) | ( подзапрос ) } значение IS [NOT] NULL [таблица.]столбец [NOT] LIKE 'строка_символов' [ESCAPE 'символ'] EXISTS ( подзапрос )
Кроме традиционных операторов сравнения (= | <> | < | <= | > | >=) в WHERE фразе используются условия BETWEEN (между), LIKE (похоже на), IN (принадлежит), IS NULL (не определено) и EXISTS (существует), которые могут предваряться оператором NOT (не). Критерий отбора строк формируется из одного или нескольких условий, соединенных логическими операторами:
AND - когда должны удовлетворяться оба разделяемых с помощью AND условия;
OR - когда должно удовлетворяться одно из разделяемых с помощью OR условий;
AND NOT - когда должно удовлетворяться первое условие и не должно второе;
OR NOT - когда или должно удовлетворяться первое условие или не должно удовлетворяться второе,
причем существует приоритет AND над OR (сначала выполняются все операции AND и только после этого операции OR). Для получения желаемого результата WHERE условия должны быть введены в правильном порядке, который можно организовать введением скобок.
При обработке условия числа сравниваются алгебраически - отрицательные числа считаются меньшими, чем положительные, независимо от их абсолютной величины. Строки символов сравниваются в соответствии с их представлением в коде, используемом в конкретной СУБД, например, в коде ASCII. Если сравниваются две строки символов, имеющих разные длины, более короткая строка дополняется справа пробелами для того, чтобы они имели одинаковую длину перед осуществлением сравнения.
Наконец, синтаксис фразы GROUP BY имеет вид
GROUP BY [таблица.]столбец [,[таблица.]столбец] ... [HAVING фраза]
GROUP BY инициирует перекомпоновку формируемой таблицы по группам, каждая из которых имеет одинаковое значение в столбцах, включенных в перечень GROUP BY. Далее к этим группам применяются агрегирующие функции, указанные во фразе SELECT, что приводит к замене всех значений группы на единственное значение (сумма, количество и т.п.).
С помощью фразы HAVING (синтаксис которой почти не отличается от синтаксиса фразы WHERE)
HAVING [NOT] HAVING_условие [[AND|OR][NOT] HAVING_условие]...
можно исключить из результата группы, не удовлетворяющие заданным условиям:
значение { = | <> | < | <= | > | >= } { значение | ( подзапрос )
| SQL_функция }
{значение_1 | SQL_функция_1} [NOT] BETWEEN
{значение_2 | SQL_функция_2} AND {значение_3 | SQL_функция_3}
{значение | SQL_функция} [NOT] IN { ( константа [,константа]... )
| ( подзапрос ) }
{значение | SQL_функция} IS [NOT] NULL
[таблица.]столбец [NOT] LIKE 'строка_символов' [ESCAPE 'символ']
EXISTS ( подзапрос )
Запросы с использованием одной таблицы
1. Простая выборка (выбрать полную информацию о продуктах с сортировкой по алфавиту)
SELECT *
FROM Продукты
ORDER BY Продукт;
Здесь "звездочка" (*) служит кратким обозначением всех имен полей в таблице, указанной во фразе FROM. При этом порядок вывода полей соответствует порядку, в котором эти поля определялись при создании таблицы.
Запрос выдает результат, указанный на Рис. 3-9, б.
2. Исключение дубликатов (выдать перечень проданных продуктов без повторений)
Этот запрос является аналогом операции проекции реляционной алгебры.
Для исключения дубликатов и одновременного упорядочения перечня необходимо дополнить запрос ключевым словом DISTINCT (различный, различные), как показано в следующем примере:
SELECT DISTINCT КодПрод
FROM Продажи;
Результат запроса приведен на Рис. 3-10, б.
Возможности совместной обработки нескольких таблиц
1. Декартово произведение
Декартово произведение может потребоваться для получения всех сочетаний значений таблиц. Получим все возможные сочетания поставщиков и продуктов, т.е. ВСЕ поставщики поставляют ВСЕ продукты.
SELECT *
FROM Поставщики, Продукты;
Или SELECT Поставщики.*, Продукты.*
FROM Поставщики, Продукты;
Результат запроса приведен на Рис. 3-14, б.
2. Естественное соединение
Получить список продаж с характеристиками продуктов. Поскольку продажи продуктов хранятся в таблице Продажи, а названия в таблице Продукты, то для получения необходимого результата в запросе нужно использовать обе таблицы. В результат должны быть включены те записи, для которых код продукта из таблицы Продукты совпадает с кодом продукта из таблицы Продажи.
SELECT Продажи.*, Продукт, ЕдИзм, [СрокХран(дней)], УсловияХран
FROM Продукты, Продажи
WHERE Продукты.КодПрод = Продажи.КодПрод;
Результат запроса приведен на Рис. 3-15, б.
3. Условное соединение
Получить названия и вес продуктов, проданных 2 января 2004г. В отличие от предыдущего запроса здесь к условию связи таблиц по поля код продукта добавляется условие отбора даты продажи
SELECT ДатаПродажи, Продукт, Количество, ЕдИзм
FROM Продукты, Продажи
WHERE ДатаПродажи = #1-2-2004# AND Продукты.КодПрод = Продажи.КодПрод;
Результат запроса приведен на Рис. 3-16, б.
4. Объединение двух таблиц содержит те записи, которые есть либо в первой, либо во второй, либо в обеих таблицах. Объединить записи таблиц Продукты и НовыеПродукты. Поскольку таблицы имеют эквивалентные схемы, то в запрос можно включить все поля:
SELECT Продукты.*
FROM Продукты
UNION SELECT НовыеПродукты.*
FROM НовыеПродукты;
Вложенные подзапросы
Виды вложенных подзапросов Вложенный подзапрос - это подзапрос, заключенный в круглые скобки и вложенный в WHERE (HAVING) фразу предложения SELECT или других предложений, использующих WHERE фразу. Вложенный подзапрос может содержать в своей WHERE (HAVING) фразе другой вложенный подзапрос и т.д. Вложенный подзапрос создан для того, чтобы при отборе записей таблицы, сформированной основным запросом, можно было использовать данные из других таблиц. Существуют простые и коррелированные вложенные подзапросы. Они включаются в WHERE (HAVING) фразу с помощью условий IN, EXISTS или одного из условий сравнения ( = | <> | < | <= | > | >= ). Простые вложенные подзапросы обрабатываются системой "снизу вверх". Первым обрабатывается вложенный подзапрос самого нижнего уровня. Множество значений, полученное в результате его выполнения, используется при реализации подзапроса более высокого уровня и т.д. Запросы с коррелированными вложенными подзапросами обрабатываются системой в обратном порядке. Сначала выбирается первая строка рабочей таблицы, сформированной основным запросом, и из нее выбираются значения тех столбцов, которые используются во вложенном подзапросе (вложенных подзапросах). Если эти значения удовлетворяют условиям вложенного подзапроса, то выбранная строка включается в результат. Затем выбирается вторая строка и т.д., пока в результат не будут включены все строки, удовлетворяющие вложенному подзапросу (последовательности вложенных подзапросов).
Вложенные подзапросы с предикатом IN
Простые вложенные подзапросы используются для представления множества значений, исследование которых должно осуществляться в каком-либо предикате IN
Выдать название и телефон поставщиков продукта с кодом 9, т.е. моркови.
SELECT Поставщик, Телефон
FROM Поставщики
WHERE КодПост IN
(SELECT КодПост
FROM Поставки
WHERE КодПрод=9);
Как уже отмечалось, при обработке полного запроса система выполняет прежде всего вложенный подзапрос. Этот подзапрос выдает множество номеров поставщиков, которые поставляют продукт с кодом КодПрод = 9, а именно множество (1, 2, 3). Поэтому первоначальный запрос эквивалентен такому простому запросу:
SELECT Поставщик, Телефон
FROM Поставщики
WHERE КодПост IN (1,2,3);
2. Подзапрос с несколькими уровнями вложенности
Пусть требуется узнать не поставщиков продукта 9, как это делалось в предыдущем запросе, а поставщиков моркови
SELECT Поставщик, Телефон
FROM Поставщики
WHERE КодПост IN
(SELECT КодПост
FROM Поставки
WHERE КодПрод IN
(SELECT КодПрод
FROM Продукты
WHERE Продукт = 'Морковь'));
В данном случае результатом самого внутреннего подзапроса является только одно значение (9). Как уже было показано выше, подзапрос следующего уровня в свою очередь дает в результате множество (1, 2, 3). Последний, самый внешний SELECT, вычисляет приведенный выше окончательный результат. Вообще допускается любая глубина вложенности подзапросов.
SQL позволяет одни и те же запросы формулировать несколькими способами.
Тот же результат можно получить с помощью следующего запроса:
SELECT Поставщик, Телефон
FROM Поставщики, Поставки, Продукты
WHERE Поставщики.КодПост = Поставки.КодПост
AND Поставки.КодПрод = Продукты.КодПрод
AND Продукт = 'Морковь';
При выполнении этого компактного запроса система должна одновременно обрабатывать данные из трех таблиц, тогда как в предыдущем примере эти таблицы обрабатываются поочередно. Естественно, что для их реализации требуются различные ресурсы памяти и времени, однако этого невозможно ощутить при работе с ограниченным объемом данных в иллюстративной БД «Магазин».
3. Пересечение двух таблиц
Найти продукты, которые есть и в таблице Продукты, и в таблице НовыеПродукты
SELECT Продукт
FROM Продукты
WHERE Продукт IN
(SELECT Продукт
FROM НовыеПродукты);
Или
SELECT Продукты.Продукт
FROM Продукты, НовыеПродукты
WHERE Продукты.Продукт = НовыеПродукты.Продукт;
4. Разность двух таблиц
Найти продукты, которые есть в таблице Продукты, но отсутствуют в таблице НовыеПродукты
SELECT Продукт
FROM Продукты
WHERE Продукт NOT IN
(SELECT Продукт
FROM НовыеПродукты);
Вложенный подзапрос с оператором сравнения, отличным от IN
Выдать продукты, имеющие ту же единицу измерения, что и молоко.
SELECT Продукт
FROM Продукты
WHERE ЕдИзм =
(SELECT ЕдИзм
FROM Продукты
WHERE Продукт = 'Молоко');
В подобных запросах можно использовать и другие операторы сравнения (<>, <=, <, >= или >), однако, если вложенный подзапрос возвращает более одного значения и не используется оператор IN, будет возникать ошибка.
Письменно ответить на вопросы:
Сделать вывод по проделанной работе.