Выборка с использованием оператора BETWEEN
Методические указания
к практическим занятиям и самостоятельной работе
по дисциплине
«Проектирование баз данных»
для студентов
направления подготовки:
Прикладная информатика»
Профиль "Прикладная информатика в экономике"
Квалификация: бакалавр
Ставрополь, 2016
Методические указания, составлены в соответствии Федеральным государственным образовательным стандартом высшего образования для студентов направления: 09.03.03 «Прикладная информатика»
Квалификация: бакалавр
.
Составитель: В.И.Дроздова, д.ф.-м.н., профессор
Рецензент: В.П.Мочалов, д.т.н., профессор
Содержание
Занятие 1. Безусловная выборка. Синтаксис запроса. 4
Занятие 2. Расширенные SQL-запросы. Выборка с условием. Выборка вычисляемых значений 8
Выборка с условием.. 10
Выборка с использованием оператора BETWEEN.. 11
Выборка с использованием оператора IN (принадлежит) 11
Выборка с использованием шаблонов. 12
Занятие 3.Расширенные SQL-запросы. Выборка из связанных таблиц. Группировка данных. Сортировка 15
Выборка из связанных таблиц. 15
Соединение с дополнительным условием.. 16
Использование группировки данных при организации запросов. 17
Сортировка. 19
Занятие 4. Расширенные SQL-запросы. Использование квантора существования в запросах. Коррелированные и некоррелированные подзапросы.. 22
Использование квантора существования в запросах. 22
Коррелированные и некоррелированные подзапросы.. 23
Занятие 5. Расширенные SQL-запросы. Модификация, удаление и добавление данных. Проверка условий целостности данных. 25
Модификация данных в таблицах. 25
Удаление данных. 27
Добавление записей. 28
Занятие 6. Объединение, пересечение и разность отношений. Операторы UNION, INTERSECT, EXEPT 31
Объединение множеств. 31
Занятие 7. Соединение отношений. Виды соединений. Оператор JOIN. 35
Занятие 8. Администрирование БД. Привилегии. Представления. 42
Предоставление доступа к отдельным таблицам.. 43
СПИСОК ИСПОЛЬЗОВАННЫХ ИСТОЧНИКОВ.. 45
Занятие 1. Безусловная выборка. Синтаксис запроса.
Цель занятия: изучение синтаксиса простого SQL-запроса.
Теоретическое обоснование
Классификация команд SQL
Команды sql для удобства работы разделяются на следующие группы: Команды определения данных (Data Definition Commands); Команды манипуляции данными (Data Мanipulation Commands); Команда выборки данных (Data Query Commands); Команды управления транзакциями (Transaction Control Commands); Команды управления данными (Data Control Commands). Приведем список команд языка sql для каждой из этих групп в таблицах 1.1 - 1.6.
Таблица 1.1 - Команды определения данных (DDL)
Команда | Назначение |
ALTER TABLE | Изменяет структуру таблицы |
CREATE INDEX | Создает индекс |
CREATE TABLE | Создает таблицу |
CREATE VIEW | Создает представление |
DROP | Удаляет таблицу, индекс, представление |
Таблица 1.2 - Команды манипуляции данными- DML
Команда | Назначение |
DELETE | Удаляет записи таблицы |
INSERT | Добавляет записи в таблицу |
UPDATE | Изменяет данные таблицы |
Таблица 1.3 - Команда выборки данных
Команда | Назначение |
SELECT | Выбирает данные из таблиц |
Таблица 1.4 - Команды управления транзакциями
Команда | Назначение |
СOMMIT | Делает изменения, проведенные с начала транзакции, постоянными |
ROLLBACK | Откатывает все проведенные изменения к точке сохранения или к началу транзакции |
SAVEPOINT | Устанавливает контрольную точку, к которой впоследствии можно будет выполнить откат |
Таблица 1.5 - Команды управления данными
Команда | Назначение |
CHECK DATABASE | Проверяет целостность базы данных |
GRANT | Предоставляет привилегии |
REVOKE | Удаляет предоставленные ранее привилегии |
LOCK/UNLOCK | Блокирует данные и отменяет блокировку |
Таблица 1.6 - Программный SQL
Команда | Назначение |
declare | Определяет курсор для запроса, задает имя курсора, который соответствует виртуальному набору данных. |
open | Открыть курсор. Формирует виртуальный набор данных, соответствующий описанию курсора и текущему состоянию БД. |
fetch | Считать очередную строку, заданную параметром команды из набора данных, соответствующего открытому курсору. |
close | Закрыть курсор |
prepare | Подготовить оператор SQL к динамическому выполнению |
execute | Выполнить оператор, ранее подготовленный к динамическому выполнению |
Курсоры
Если запрос к таблице возвращает несколько строк (больше одной), то для их обработки используется курсор – указатель во множестве строк, выбранных оператором SELECT. Курсор – средство языка SQL, позволяющее получать построчный доступ к результату запроса. Термин «курсор» означает «текущий набор записей - current set of records». Оператором DECLARE в динамическом SQL объявляется курсор для запроса, оператором OPEN этот запрос выполняется и выбранные строки выделяются. Оператор FETCH позволяет перемещаться от одной строки результирующего множества к другой.
Для формирования запросов на языке SQL используется конструкция SELECT. Результатом выполнения запроса является таблица, которая хранится во временном буфере базы данных. Выбранные данные можно использовать для просмотра, формирования графиков или печати отчетов. Длина строки на языке SQL до 255 символов, регистр не имеет значения. Синтаксис команды SELECT:
SELECT [ALL½DISTINCT] список выбираемых полей
FROM список таблиц
[WHERE условие выборки или соединения]
[GROUP BY список полей по условию группировки
[HAVING условие выборки группы]]
[ORDER BY список полей, по которым упорядочить вывод]
При формировании запросов можно использовать уточненные имена полей (например, CUSTOMER.CUSTOMERNO, т.е. Имя_таблицы. Имя_поля).
Ключевое слово ALLподразумевается по умолчанию.
Для выборки всех полей таблицы в том же порядке, что и в таблице, используется следующая форма запроса:
SELECT*FROM таблица.
Запрос вида
SELECT*FROM R1, R2
соответствует декартову произведению таблиц R1 и R2, т. е R=R1х R2.
Запрос
SELECT R1.А, R2.В FROM R1, R2
соответствует проекции декартова произведения таблиц R1 и R2 на столбцы A из таблицы R1 и B – из таблицы R2, то есть операции проекция реляционной алгебры.
Простая выборка
При использовании механизма простой выборки предполагается, что в результате ее выполнения на экран будет выведен некоторый диапазон значений. Например, результатом выполнения запроса
SELECT kod FROM R1
является столбец kod из таблицы R1.
При выполнении данного запроса в результат выборки будут включены все дубликаты строк.
Выборка уникальных значений
Чтобы исключить дубликаты строк из результата выборки используется ключевое слово DISTINCT. Примером запроса, исключающего дублирование записей, является
SELECT DISTINCT kod FROM R1
Задания. Базовый уровень:
1.Составить запрос для выборки всех столбцов таблицы R1 в том же порядке, в котором они находятся в исходной таблице.
2. Составить запрос для выборки всех столбцов таблицы R1(А,В,С,D,G) таким образом, чтобы порядок столбцов в выборке изменился следующим образом: D,G, В,С,А.
3. Составить запрос для выборки уникальных значений G из таблицы R1(А,В,С,D,G).
4. Составить запрос для выборки всех значений G из таблицы R1(А,В,С,D,G).
Повышенный уровень
5. Составить запрос на естественном языке, средствами реляционной алгебры и на языке SQL.
Вопросы. Базовый уровень
9.1. Как исключить дубликаты строк из результата выборки?
9.2. Как получить Декартово произведение отношений?
Повышенный уровень
9.3. Для чего применяются курсоры в динамическом SQL?
Занятие 2. Расширенные SQL-запросы. Выборка с условием.
Выборка вычисляемых значений
Цель занятия: изучение синтаксиса SQL-запроса для выборки с условием и для выборки вычисляемых значений.
Теоретическое обоснование
Результирующая таблица может содержать не только поля исходных таблиц, но и результат вычислений над полями таблицы. В выражениях могут быть использованы арифметические операторы и функции. Перечень допустимых функций определяется используемым диалектом языка SQL.
Пусть в некоторой базе данных содержится таблица Товары, в которой цена (UNITPRICE) указана без учёта налога на добавленную стоимость (НДС). Поля таблицы Товары представлены в таблице 2.1. Тип переменной UNITPRICE – Currency.
Таблица 2.1 – Поля таблицы Товары
Kod1 | UNITPRICE |
1000.0000 | |
2000.0000 | |
10000.0000 |
Необходимо организовать выборку информации из таблицы Товары,указавцены с учетом налога на добавленную стоимость (18%).
SQL-запрос, соответствующий примеру:
SELECT Kod1, UNITPRICE * (1 + 0,18) AS ЦЕНА FROM Товары
Результат выполнения данного запроса представлен в таблице 2.2.
Таблица 2.2 – Результат выборки из таблицы Товары
Kod1 | ЦЕНА |
1180.0000 | |
2360.0000 | |
11800.0000 |
В запросе после ключевого слова AS записано новое название столбца таблицы.
Применение конструкции SELECT в формировании запросов с вычисляемыми полями позволяет использовать в них не только арифметические выражения, но и простые имена полей. Кроме того, в результаты выборки можно добавить константы.
Если в SQL-запрос, соответствующий примеру, добавить строку «Цена указана с учетом НДС», то он примет вид:
SELECT Kod1, UNITPRICE * (1 + 0,18) AS ЦЕНА, «Цена указана с учетом НДС» FROM Товары
Результат выполнения данного запроса представлен в таблице 2.3 .
Таблица 2.3 – Результат выполнения запроса
Kod1 | ЦЕНА | Цена указана с учетом НДС |
1180.0000 | Цена указана с учетом НДС | |
2360.0000 | Цена указана с учетом НДС | |
11800.0000 | Цена указана с учетом НДС |
При выборке с помощью команды SELECT можно использовать статистические (агрегатные) функции:
1) MIN(X) – вычисляет минимальное значение из множества X;
2) MAX(X) – вычисляет максимальное значение из множества X;
3) AVG(X) – вычисляет среднее арифметическое из множества значений X;
4) SUM(X) – вычисляет сумму значений множества X;
5) COUNT(X) – определяет число элементов множества X.
Примеры использования этих функций:
1) SELECT COUNT(*) FROM GOODS – создает выборку, состоящую из одной строки и одного поля, содержащего количество всех строк таблицы GOODS (товары);
2) SELECT MAX(Цена), MIN(Цена), AVG(Цена) FROM GOODS – создает выборку, состоящую из одной строки и трех полей, содержащих минимальное значение цены, максимальное значение цены и её среднее значение.
Выборка с условием
Для задания условия выборки в SQL-запросе используется команда (ключевое слово) WHERE.Условие, следующее за ключевым словом WHERE, может включать:
1) арифметические операторы сравнения: =, <>, > , <, >=, <=;
2) логические операторы – AND, OR, NOT;
3) скобки, определяющие порядок вычислений.
При выполнении условия выборки числа сравниваются алгебраически: отрицательные числа считаются меньше, чем положительные, независимо от их абсолютной величины. Строки сравниваются с их представлением в коде ANSI. При сравнении двух строк, имеющих разные длины, предварительно более короткая строка дополняется справа пробелами для того, чтобы строки имели одинаковую длину.
Пример. Пусть существует некоторая база данных, в которой имеется таблица Table3, содержащая информацию о поставщиках, покупателях, товарах. Предполагается, что покупатель может приобретать товар в кредит. Произвести из данной базы выбор всех кодов (kod) и фамилий (NAME)покупателей, которые находятся в Москве и имеют кредит(CREDITLIMIT) более 200 000.
С помощью языка SQL запрос, соответствующий примеру, можно представить в виде:
SELECT kod, NAME
FROM Table3
WHERE CITY=“Москва”
AND CREDITLIMIT>200000
SELECT kod, NAME, UNITPRICE
FROM Table4
SELECT kod, NAME, UNITPRICE
FROM Table4
SELECT kod, NAME, UNITPRICE
FROM Table4
SELECT kod, NAME, UNITPRICE
FROM Table4
WHERE UNITPRICE=100000
OR UNITPRICE=200000
OR UNITPRICE=500000
Как и в случае с оператором BETWEEN можно также использовать конструкцию NOT IN (не принадлежит), например:
SELECT kod, NAME, UNITPRICE
FROM Table4
SELECT kod, NAME, UNITPRICE
FROM Table4
WHERE NAME LIKE “T%”
пользователь может выбрать из базы данных все товары, наименование которых начинается с буквы “Т”( таблица 2.4).
Таблица 2.4 – результат выборки по шаблону
kod | NAME | UNITPRICE |
Toshiba 1200 | 600.00 | |
Turbo Pascal | 200.00 |
Шаблоны в языке SQL описываются с помощью оператора LIKE, который может быть представлен в виде:
Задания (повышенный уровень)
9.Составить запрос для выборки цены товара (Таблица 10.1) с кодом Kod1=2 со скидкой 5%. Переименовать столбец UNITPRICEи присвоить ему новое имя «Вычисл_цена»
Вопросы. Базовый уровень
1. Как определить количество строк в таблице?
2. Какой запрос возвращает максимальное значение числового поля?
3. Как переименовать столбец в выборке?
4. Как добавить константу в результат выборки?
5. К каким типам переменных можно применять функцию COUNT(*)?
6. К каким типам переменных можно применять функцию SUM(X)?
7. К каким типам переменных можно применять функцию AVG(X)?
8. К каким типам переменных можно применять функцию MAX(X)?
9. К каким типам переменных можно применять функцию MIN(X)?
10. Какие логические операторы может содержать SQL-запрос?
Повышенный уровень
Теоретическое обоснование
Выборка из связанных таблиц
Способность «соединять» две или более таблицы в одну представляет собой одну из наиболее мощных возможностей реляционных баз данных.
Простое соединение
Простое соединение как один способов выбора информации из нескольких связанных таблиц предполагает, что на выбираемую пользователем информацию не накладывается никаких дополнительных условий. Например, с помощью SQL-запроса
SELECT Tab8.kod2, Tab9.NAME
FROM Tab8, Tab9
WHERE Tab8.STOCK= Tab9.STOCK
будет получен список кодов (kod2) и наименований (NAME) проданных покупателям товаров, представленный в таблице 3.1.
Таблица 3.1 – Результат выборки из двух таблиц
Kod2 | NAME |
BORLAND C++ | |
NoSQL СУБД | |
Книга TURBO C++ | |
Книга TURBO C++ |
В данном случае использованы уточнённые имена полей, т.е. ссылки на поля после ключевого слова WHERE уточнены именами содержащих их таблиц. Два поля STOCK являются ключами, с помощью которых установлены постоянные отношения между таблицами.
FROM ORDSALE, GOODS
WHERE ORDSALE.STOCK=GOODS.STOCK
and GOODS.NAME=“ Macintosh”
Результат выполнения данного запроса представлен в таблице 3.2.
Таблица 3.2 – Результат выборки из двух таблиц с условием
ORDSALE.CUSTOMERNO | FIRSTNAME |
Иванов | |
Иванов | |
Петров | |
Сидоров | |
Кузнецов |
Соединение трех таблиц
Для выборки данных из трех таблиц в программном коде после ключевого слова WHERE необходимо указать два условия связи таблиц. Пример SQL-запроса для выбора информации из трех связанных таблиц:вывести на экран фамилии и имена всех покупателей, которые приобрели Macintosh.
CUSTOMER.LASTNAME
SELECT kod, SUM(QUANT)
FROM ORDSALE
GROUP BY kod
SELECT kod, SUM(QUANT)
FROM ORDSALE
WHERE CUSTOMERNO <> 23
GROUP BY kod
служит для выборки информации о товаре, проданном покупателям кроме покупателя с кодом 23.
Строки, не удовлетворяющие условию WHERE, исключаются перед группировкой данных.
Конструкции GROUP BY свойственно ограничение, которое заключается в том, что она работает только на одном уровне. Невозможно разбить каждую из групп на группы более низкого уровня, а затем применить некоторую стандартную функцию, например, SUM или AVERAGE на каждом уровне группировки.
Использование HAVING
Оператор HAVING используется для ограничения записей, участвующих в группировке, его нельзя использовать отдельно от конструкции GROUP BY. Оператор HAVING используется для того, чтобы исключать группы так же, как WHERE используется для исключения записей. Выражение после конструкции HAVING должно принимать единственное для группы значение. В частности, результатом выполнения запроса
SELECT kod FROM ORDSALE GROUP BY kod HAVING COUNT(*)>1
является таблица, в которую включены коды товаров, приобретенных более чем одним покупателем.
Сортировка
ВкладкаOrdered Byв окне дизайнера запросов позволяет управлять порядком расположения записей в результирующей таблице. Для упорядочивания выделите указателем (курсором) поля, которые будут определять порядок сортировки выбранных данных, и перенесите их последовательно в список Ordering criteria.Для каждого выбранного поля можно с помощью переключателя (кнопки) Order optionsустановить критерий упорядочивания по возрастанию (Ascending) или по убыванию (Descending). Порядок сортировки записей результирующей таблицы определяется порядком следования полей в списке Ordering criteria и критерием упорядочивания отдельных полей.
Пример.Для таблицы Table3необходимо произвести выбор кода (kod), имени (NAME)и суммы кредита (CREDITLIMIT) всех покупателей, проживающих в Ставрополе, расположив их в порядке убывания.
SQL-запрос имеет вид:
FROM Table3
WHERE CITY=“Ставрополь”
ORDER BY CREDITLIMIT DESC
В выборках без указания критерия упорядочивания данных результирующая таблица будет упорядочена в соответствии с внутренними алгоритмами их осуществления. Их примера следует, что результат выборки может быть организован в определенной последовательности. Упорядочение данных в выборке может осуществляться по любому полю результирующей таблицы:
имя поля[упорядочение]
[,имя поля [упорядочение]] ...,
где аргумент «упорядочение» может принимать значение ASC(возрастание) или DESC (убывание). По умолчанию устанавливается значение ASC. В качестве аргументов имя поля могут использоваться только поля результирующей таблицы. Поэтому недопустима следующая конструкция:
FROM Table3
ORDER BY CITY
Для идентификации полей, по которым осуществляется упорядочивание, можно использовать не только наименования полей результирующей таблицы, но и их номера (номер поля указывает порядковую позицию данного поля в результирующей таблице запроса). Благодаря этому можно упорядочить результат на основе вычисляемых полей, которые не обладают именами. Например, результатом выполнения запроса:
SELECT Kod1, UNITPRICE * (1 + 0,18)
FROM Товары
ORDER BY 2
будет являться результирующая таблица, во второй столбец которой будет помещена информация о стоимости товаров с учетом НДС. Записи в выборке будут упорядочены по второму столбцу.
Задания:
1. В состав реляционной БД входит отношение GOODS (STOCK, NAME, UNITPRICE). Составить запрос для получения записей, в которых наименование товаров (NAME) начинается с буквы “Т”.
2. В состав реляционной БД входит отношение
GOODS (STOCK, NAME, UNITPRICE). С помощью оператора IN составить SQL-запрос для выборки записей, в которых имя товаров (NAME) равно DVD, HDD или NOTEBOOK.
3. В состав реляционной БД входят отношения
CUSTOMER (CUSTOMERNO, FIRSTNAME, LASTNAME, CITY, CREDITLIMIT) и ORDSALE ( STOCK, CUSTOMERNO, NAME). Составить SQL-запрос для получения таблицы, содержащей без дублирования все атрибуты отношений CUSTOMER и ORDSALE.
4. В состав реляционной БД входит отношение CUSTOMER (CUSTO-MERNO, FIRSTNAME, LASTNAME, CITY, CREDITLIMIT). Вставить с помощью языка SQL запись для покупателя Василия Иванова с кодом (CUSTOMERNO) 23, проживающего в Москве, имеющего кредит (CREDITLIMIT) в размере 10000.
Задание (повышенный уровень)
5. Составить запрос, предусматривающий группировку данных.
Вопросы. Базовый уровень
1. В состав реляционной БД входит отношение GOODS (STOCK, NAME, UNITPRICE). Какую выборку можно получить после выполнения SQL-запроса: SELECT STOCK, NAME, UNITPRICE FROM GOODS WHERE NAME LIKE “Т%” ?
Повышенный уровень
1. 5. В состав реляционной БД входит отношение
2. ORDSALE ( STOCK, CUSTOMERNO, NAME).
3. Cоставить SQL-запрос с помощью оператора GROUP BY [HAVING] для выборки кодов товаров (STOCK), покупаемых более чем одним покупателем.
Занятие 4. Расширенные SQL-запросы. Использование квантора
существования в запросах. Коррелированные и некоррелированные
подзапросы
Цель занятия: изучение синтаксиса расширенных SQL-запросов, содержащих операторы EXISTS и NOT EXISTS.
Теоретическое обоснование
SELECT NAME FROM tab10
WHERE EXISTS (SELECT * FROM tab11
WHERE tab10.kod= tab11.kod and.STOCK = “Macintosh”)
Фактически любой запрос, который может быть выражен с использованием оператора IN, альтернативным образом может быть сформулирован с помощью EXISTS.
Можно сконструировать отрицание существования, используя NOT EXISTS. С помощью SQL-запроса
SELECT NAME FROM tab10
WHERE NOT EXISTS (SELECT * FROM tab11
WHERE tab10.kod= tab11.kod and.STOCK = “Macintosh”)
можно получить информацию о покупателях, которые не купили «Macintosh».
Заключенный в скобки подзапрос, входящий в конструкцию EXISTS не обязательно использует конструкцию SELECT * ... . В конструкции SELECT можно также указать имя поля, т.е. использовать предложение вида: SELECT имя_поля FROM .... Операторы EXISTS и NOT EXISTS всегда помещаются перед подзапросом.
Задания (повышенный уровень)
2.В состав реляционной БД входят отношения
CUSTOMER (CUSTOMERNO, FIRSTNAME, LASTNAME, CITY, CREDITLIMIT) и ORDSALE (STOCK, CUSTOMERNO, NAME). Составить SQL-запрос с помощью оператора EXISTS для выборки фамилий покупателей, которым не был продан товар с наименованием (NAME), содержащим символы “HDD”.
3.В состав реляционной БД входит отношение
CUSTOMER(CUSTOMERNO, FIRSTNAME, LASTNAME, CITY, CREDITLIMIT). Составить SQL-запрос для выборки проживающих в Москве покупателей, имеющих кредит (CREDITLIMIT) больше среднего с указанием кода покупателя (CUSTOMERNO), фамилии и кредита (выборку упорядочить в порядке убывания кредита).
Вопросы. Базовый уровень:
1. Какой подзапрос называют коррелированным?
2. Какой подзапрос называют некоррелированным?
3. Каким образом без оператора EXISTS получить такой же результат, как при выполнении запроса:
SELECT NAME FROM tab10 WHERE EXISTS (SELECT * FROM tab11 WHERE tab10.kod= tab11.kod and.STOCK = “Macintosh”)?
Повышенный уровень
4. В состав реляционной БД входит отношение
CUSTOMER(CUSTOMERNO, FIRSTNAME, LASTNAME, CITY, CREDITLIMIT). Составить SQL-запрос для выборки проживающих в Москве покупателей, имеющих кредит (CREDITLIMIT) меньше среднего с указанием кода покупателя (CUSTOMERNO), фамилии и кредита (выборку упорядочить в порядке убывания кредита).
Занятие 5. Расширенные SQL-запросы. Модификация, удаление и
добавление данных. Проверка условий целостности данных
Цель занятия: изучение синтаксиса расширенных SQL-запросов, содержащих операторы для модификации, удаления и добавления данных.
Теоретическое обоснование
Модификация данных в таблицах
С помощью конструкций языка SQL можно не только производить поиск информации в базе данных, но и выполнять основные действия над таблицами:
1) добавлять информацию в таблицу;
2) модифицировать данные в таблице;
3) удалять информацию из таблицы.
В языке SQL для модификации данных в таблицах используется конструкция UPDATE, которая имеет следующий синтаксис:
UPDATE таблица
SET поле=выражение [,поле=выражение] …
[WHERE условие]
В результате выполнения этой конструкции все записи в таблице, которые удовлетворяют условию, обновляются в соответствии с оператором присвоения «поле = выражение».
При использовании конструкции UPDATE может использоваться только одна таблица. При использовании подзапросов для модификации данных результат выборки должен возвращать только одно значение, а не несколько.
Модификация единственной записи. Для каждой записи, которая должна быть обновлена, т. е. для каждой записи, которая удовлетворяет условию WHERE, или для всех записей, если фраза WHERE опущена, ссылки во фразе SET на поля этой записи обозначают значения этих полей до их модификации. Например, с помощью SQL-запроса
UPDATE tab12
SET NAME =“Macintosh4”,
UNITPRICE = UNITPRICE+10000
WHERE NAME =“Macintosh”
будет изменено название товара «Macintosh» на «Macintosh4» и увеличена стоимость на 10000.
Модификация множества записей. При изменении значений во множестве записей таблицы условие, определяемой при помощи оператора WHERE,должно удовлетворятьвсему множеству. Используя SQL-запрос
UPDATE tab14
SET CREDITLIMIT= CREDITLIMIT*2
WHERE CITY=“Ставрополь”
можно получить список всех покупателей, проживающих в Ставрополе, с увеличенной в 2 раза суммой кредита.
Модификация с подзапросом. Модификация с подзапросом используется в том случае, если необходимо произвести изменить значения полей в связанных таблицах. В частности, с помощью SQL-запроса
UPDATE tab14
SET UNITPRICE = 0.8*UNITPRICE
WHERE “Мичуринск” = (SELECT CITY FROM tab15
WHERE tab15.CUSTOMERNO= tab14.CUSTOMERNO)
можно вывести на экран список всех покупателей, проживающих в Мичуринске, уменьшив стоимость, приобретенного ими товара на 20%.
Удаление данных
Для удаления данных из базы в языке SQL используется конструкция DELETE, которая имеет следующий синтаксис:
DELETE FROM таблица [WHERE условие]
В результате выполнения конструкции удаляются все записи, которые удовлетворяют условию.
С помощью конструкции DELETEиз базы данных может быть удалена одна запись, множество записей, все записи из одной таблицы; одна или множество записей из нескольких связанных таблиц.
Пример– SQL-запрос, иллюстрирующий удаление одной записи из базы данных
DELETE FROM tab12
WHERE CUSTOMERNO=23
В результате его выполнения будет удален из базы данных покупатель со значением кода, равным «23».
Пример – SQL-запрос, иллюстрирующий удаление из базы множества записей
DELETE FROM tab12 WHERE STOCK=34
После выполнения данного SQL-запроса из таблицы tab12будутудаленывсе записи, в которых поле STOCKравно 34.
Пример – SQL-запрос, иллюстрирующий удаление всех записей из таблицы ORDSALE:
DELETE FROM ORDSALE
В результате выполнения этой операции таблица будет доступна для дальнейшей работы, однако, она будет пустой. Удаление из таблицы всех записей не приводит к уничтожению таблицы.
SQL-запрос с подзапросом используют в том случае, если необходимо произвести удаление записей из нескольких связанных таблиц, принадлежащих одной базе данных.
Пример – Удаление с подзапросом
DELETE FROM tab12
WHERE “Киев”= (SELECT CITY FROM tab13
WHERE tab13.CUSTOMERNO= tab12.CUSTOMERNO)
После выполнения данного запроса из базы данных будет удалена информация о покупках всех клиентов, проживающих в Киеве.
Добавление записей
Для добавления записей в базу данных с помощью языка SQL используется конструкция INSERT, которая имеет два варианта синтаксиса:
INSERT INTO таблица [(поле [,поле] ...)] VALUES (константа [,константа]...)
или
INSERT INTO таблица [(поле [,поле] ...)] подзапрос
В первом варианте в таблицу вставляется запись, имеющая заданные значения для указанных полей, причем i-я константа в списке констант соответствует i-у полю в списке полей. Во втором варианте формируется подзапрос, представляющий собой множество записей, которые добавляются в таблицу. При этом i-е поле результата подзапроса соответствует i-у полю в списке полей добавляемой таблицы. В обоих случаях отсутствие списка полей эквивалентно использованию всех полей таблицы.
С помощью конструкции INSERTв базу данных можно вставить одну запись, множество записей.
Пример – SQL-запрос для вставки одной записи в базу данных
INSERT INTO tab15
(kod, NAME, UNITPRICE, CATEGORY)
VALUES
(1001,”Macintosh”,30000.00,2)
В результате выполнения приведенного выше запроса будет создана новая запись для товара с заданным номером, наименованием, стоимостью и категорией товара. В частности, в таблицу tab15будет добавлен товар «Macintosh»,с кодом равным 1001, стоимостью 30000000 и категорией, равной 2.
Пример – SQL-запрос для вставки одной записи в базу данных
Целостность
Целостность - самое важное требование, предъявляемое к базам данных. Для связи таблиц в реляционных базах данных используются совпадающие поля. Например, в таблицах CUSTOMER и ORDSALE связь осуществляется по полю CUSTOMERNO. Наименования совпадающих полей могут и не совпадать, но они должны иметь одинаковый тип. Нарушение целостности возникает в том случае, когда таблица ORDSALE содержит номера покупателей, которых нет в таблице CUSTOMER. Для проверки целостности данных при добавлении в таблицу ORDSALE информации об отпуске товаров можно проверить, имеется ли указанный покупатель в таблице CUSTOMER. Более правильным является использование первичных и внешних ключей таблиц, которые автоматически отслеживают целостность данных.
Для создания первичных и внешних ключей можно использовать команду CREATE TABLE а также команду ALTER TABLE. Приведем синтаксис команды ALTER TABLE:
ALTER TABLE имя таблицы
ADD PRIMARY KEY(имя поля, имя поля ...)
ADD FOREIGN KEY имя внешнего ключа
(имя поля, имя поля ...)
REFERENCES имя ссылочной таблицы
[ON DELETE
RESTRICT çCASCADE çSET NULL]
Для обеспечения целостности покупателей в базе данных создадим первичный ключ для таблицы CUSTOMER и внешние ключи для всех таблиц, которые содержат код покупателя:
ALTER TABLE CUSTOMER
ADD PRIMARY KEY(CUSTOMERNO)
ALTER TABLE ORDSALE
ADD FOREIGN KEY CUSTNO (CUSTOMERNO)
REFERENCES CUSTOMER
ON DELETE RESTRICT
Если указан параметр RESTRICT, то удалить покупателя в таблице CUSTOMER можно только в том случае, если он не указан ни в какой другой таблице, имеющей ссылку на таблицу CUSTOMER. В этом случае для удаления покупателя из таблицы CUSTOMER предварительно необходимо удалить все записи в таблице все записи в таблице ORDSALE, содержащие ссылки на этот номер покупателя. В некоторых случаях желательно, чтобы удаление главной таблицы приводило к удалению подчиненных. Для этого используется фраза: ON DELETE CASCADE.
Задания:
1. Составить запрос для модификации одной записи.
2. Составить запрос для модификации всех записей таблицы.
Задания (повышенный уровень)
3.Составить запросы с операторами RESTRICT и CASCADE.
Вопросы. Базовый уровень
1.Каким образом составить запрос, чтобы при удалении записи из главной таблицы согласованно удалялись связанные записи из подчиненных таблиц?
2. Каким образом составить запрос, чтобы удаление записи из главной таблицы не приводило к удалению связанных записей из подчиненных таблиц?
Повышенный уровень
13.3. Для чего используются операторы RESTRICT и CASCADE?
Занятие 6. Объединение, пересечение и разность отношений. Операторы UNION, INTERSECT, EXEPT
Цель занятия: изучение синтаксиса теоретико-множественных операций.
Теоретическое обоснование
Объединение множеств
Объединением двух множеств называется множество всех элементов, принадлежащих какому-либо одному или обоим множествам. Поскольку отношение является множеством записей, то можно построить объединение двух отношений. Результатом будет отношение, состоящее из всех строк, входящих в какое-либо одно или в оба сразу отношения. Однако строки этих двух отношений должны быть совместимы по объединению.
В языке SQL две таблицы совместимы по объединению и к ним может быть применен оператор объединения UNION тогда и только тогда, когда:
1) они имеют одинаковое число полей, например m;
2) для всех i ( ) i-е поле первой таблицы и i-е поле второй таблицы имеют в точности одинаковый тип данных.
В SQL-92 реализованы некоторые операции реляционной алгебры в явном виде с помощью операторов: UNION, Intersect, EXCEPT, JOIN.
По отношению к таблицам операторы объединения (UNION), пересечения (Intersect) и разности (EXCEPT) можно применять только в случае объединительной совместимости.
Пример. SQL-запрос
SELECT kod FROM tab12 WHERE UNITPRICE>1000
UNION
SELECT kod FROM tab13 WHERE CUSTOMERNO=23
предназначен для выбора кодов товаров, которые имеют стоимость более 1000, либо приобретаются покупателем с кодом 23 (либо и то, и другое).
Использование оператора UNION исключает из результатов выборки повторяющиеся значения. Если это не устраивает пользователя, то вместо оператора UNION используют UNION ALL.Тогда повторы не будут исключены из выборки.
Оператором UNION можно соединить любое количество конструкций SELECT.
Пример. С помощью SQL-запроса
SELECT kod FROM tab12 WHERE UNITPRICE>1000
UNION
SELECT kod FROM tab13 WHERE CUSTOMERNO=23
UNION
SELECT kod FROM tab12 WHERE UNITPRICE< 500
пользователь может получить информацию о кодах товаров, которые имеют стоимость более 1000, либо приобретены покупателем с кодом 23, либо имеют цену менее 500.
Если к запросу, приведенному в примере 1, добавить строку OR UNITPRICE < 500, то его результирующая таблица будет аналогична результирующей таблице, соответствующей запросу 2.
Оператор ORDER BY в запрос с использованием оператора UNION может входить только в последнее предложение SELECT. При использовании критерия упорядочивания используются номера полей результирующей таблицы. Пример с включением константы в результирующую таблицу:
SELECT kod,”Стоимость товара >1000$” FROM tab12
WHERE UNITPRICE>1000
UNION<