
- •Новосибирская государственная академия экономики и управления
- •«Базы данных»
- •Новосибирск 2000
- •Введение
- •1. Простые запросы
- •2. Многотабличные запросы
- •3. Подзапросы
- •4. Операторы exists и not exists
- •5. Встроенные функции
- •6. Фразы group by и having
- •7. Встроенные функции и подзапросы
- •8. Операции реляционной алгебры
- •9. Операции изменения данных
- •10. Совместное использование sql с языками обработки данных
- •11. Определение представлений данных
- •12. Ограничения на запросы и обновление представлений данных
ГОСУДАРСТВЕННЫЙ КОМИТЕТ РОССИЙСКОЙ ФЕДЕРАЦИИ
ПО ВЫСШЕМУ ОБРАЗОВАНИЮ
Новосибирская государственная академия экономики и управления
ЛАБОРАТОРНЫЙ ПРАКТИКУМ ПО ДИСЦИПЛИНЕ
«Базы данных»
Лабораторная работа N 7
«Язык баз данных SQL: команды манипуляции данными»
Новосибирск 2000
SQL – это сокращенное название языка структурированных запросов (Structured Query Language). Из названия языка понятно, что его основное назначение заключается в формировании запросов на получение информации из базы данных. Команды на выборку данных составляют основу языка манипулирования данными DML - составной части языка SQL. Однако DML состоит не только из команд выборки данных из базы. Существуют также команды модификации данными, управления данными и другие.
В лабораторной работе рассматриваются базовые средства языка DML. В процессе выполнения лабораторной работы мы будем придерживаться стандарта SQL2.
В связи с тем, что SQL является объемным языком, будем рассматривать только основные команды. Различные специфические средства SQL рассматриваются в последующих лабораторных работах.
Для выполнения лабораторной работы требуется знание основ реляционной модели данных, основ реляционной алгебры и реляционного исчисления, принципов работы с СУБД MS SQL Server.
В результате выполнения лабораторной работы Вы освоите способы манипулирования данными с помощью команд языка SQL, рассмотрите диалект языка, реализованный в СУБД MS SQL Server.
Введение
SQL содержит широкий спектр возможностей манипуляции данными, как для создания запросов, так и для обновления базы данных. Эти возможности опираются только на логическую структуру базы данных, а не на ее физическую структуру, что согласуется с требованиями реляционной модели.
Первоначально структура синтаксиса SQL была основана (или, по крайней мере, казалась основанной) на реляционном исчислении Кодда. Единственной поддерживаемой операцией реляционной алгебры было объединение.
В SQL2 в дополнение к аналогичному реляционному исчислению синтаксису, разработанному в предыдущем стандарте, напрямую реализованы операции объединение, пересечение, разность и соединение. Операции выбора, проектирования и произведения поддерживались (и продолжают поддерживаться) практически напрямую, в то время как операции деления и присвоения поддерживаются в более громоздкой форме.
Сначала мы опишем язык запросов SQL, а затем его операции ввода и изменения данных. Операции изменения данных будут описаны в последнюю очередь, поскольку их структура в определенной степени опирается на структуру языка запросов.
1. Простые запросы
Для нас простым запросом будет запрос, который обращается только к одной таблице базы данных. Простые запросы помогут нам проиллюстрировать основную структуру SQL.
Простой запрос. Запрос, который обращается только к одной таблице базы данных.
Запрос: Кто работает штукатурами?
SELECT NAME
FROM WORKER
WHERE SKILL_TYPE = 'Штукатур'
Результат:
NAME
К.Немо
Г.Риковер
Этот запрос иллюстрирует три наиболее часто встречающиеся фразы SQL: SELECT, FROM и WHERE. Хотя в нашем примере мы поместили их на разные строки, они все могут стоять в одной строке. Они также могут помещаться с разными отступами, а слова внутри фраз могут разделяться произвольным числом пробелов. Рассмотрим характеристики каждой фразы.
Select. Фраза SELECT перечисляет столбцы, которые должны войти в результирующую таблицу. Это всегда столбцы некоторой реляционной таблицы. В нашем примере результирующая таблица состоит из одного столбца (NAME), но в общем случае она может содержать несколько столбцов; она также может содержать вычисленные значения или константы. Мы приведем примеры каждого из этих вариантов. Если результирующая таблица должна содержать более одного столбца, то все нужные столбцы перечисляются после команды SELECT через запятую. Например, фраза SELECT WORKER_ID, NAME выдаст в результате таблицу, состоящую из столбцов WORKER_ID и NAME.
Фраза SELECT. Задает столбцы результирующей таблицы.
From. Фраза FROM задает одну или более таблиц, к которым обращается запрос. Все столбцы, перечисленные во фразах SELECT и WHERE, должны существовать в одной из таблиц, перечисленных в команде FROM. В SQL2 эти таблицы могут быть напрямую определены в схеме как базовые таблицы или представления данных, или же они сами могут быть не имеющими имен таблицами, полученными в результате запросов SQL. В последнем случае запрос явно приводится в команде FROM.
Фраза FROM. Задает существующие таблицы, к которым обращается запрос.
Where. Фраза WHERE содержит условие. на основании которого выбираются строки таблицы (таблиц). В нашем примере условие состоит в том, что столбец SKILL_TYPE должен содержать константу 'Штукатур', заключенную в апострофы, как это всегда делается с текстовыми константами в SQL. Фраза WHERE — наиболее изменчивая команда SQL; она может содержать множество разнообразных условий. Большая часть нашего изложения будет посвящена иллюстрации различных конструкций, разрешенных в команде WHERE.
Фраза WHERE. Задает условие, на основании которого выбираются строки из заданных таблиц.
Приведенный выше запрос SQL обрабатывается системой в следующем порядке: FROM, WHERE, SELECT. To есть строки таблицы, указанной в команде FROM, помещаются в рабочую область для обработки. Затем к каждой строке последовательно применяется фраза WHERE. Все строки, не удовлетворяющие условию WHERE, исключаются из рассмотрения. Затем те строки, которые удовлетворяют условию WHERE, обрабатываются командой SELECT. В нашем примере из каждой такой строки выбирается NAME, и все выбранные значения выводятся в качестве результатов запроса.
Запрос: Привести все данные о зданиях офисов.
SELECT *
FROM BUILDING
WHERE TYPE = 'Офис'
Результат:
BUILDING
BLDG ID АДРЕС TYPE QLTY LEVEL STATUS
312 Ул.Вязов, 123 Офис 2 2
210 Березовая ул. 1011 Офис З 1
111 Осиновая ул. 1213 Офис 4 1
Звездочка (*) в команде SELECT означает «строка целиком». Это удобное сокращение, которым мы будем часто пользоваться.
Запрос: Какова недельная зарплата каждого электрика?
SELECT NAME, 'Недельная зарплата = ', 40 * HRLY_RATE
FROM WORKER
WHERE SKILL_TYPE = 'Электрик'
ORDER BY NAME
Результат:
NAME
М.Фарадей Недельная зарплата = 500.00
Х.Колумб Недельная зарплата = 620.00
Этот запрос иллюстрирует употребление и символьных констант (в нашем примере 'Недельная зарплата = '), и вычислений в команде SELECT, Внутри команды SELECT можно производить вычисления, в которых используются числовые столбцы и числовые константы, а также стандартные арифметические операторы (+, -, *, /), сгруппированные по мере необходимости с помощью скобок. Мы также включили новую команду ORDER BY, которая сортирует результат запроса в возрастающем алфавитно-числовом порядке по указанному столбцу. Если вы хотите упорядочивать результаты по убыванию, то к команде нужно добавить DESC. Фраза ORDER BY может сортировать результаты по нескольким столбцам, по одним - в порядке возрастания, по другим - в порядке убывания. Первым указывается столбец первичного ключа сортировки.
Символьная константа. Константа, состоящая из букв, цифр и «специальных» символов.
Запрос: У кого почасовая ставка от 10 до 12 долларов?
SELECT *
FROM WORKER
WHERE HRLY_RATE > = 10 AND HRLY_RATE < - 12
Результат:
WORKER ID NAME HRLY_RATE SKILL_TYPE SUPV_ID
2920 Р.Гаррет 10.00 Кровельщик 2920
1520 Г.Риковер 11.75 Штукатур 1520
Этот запрос иллюстрирует некоторые дополнительные возможности команды WHERE: операторы сравнения и булеву операцию AND (И). Для сравнения столбцов с другими столбцами или с константами могут использоваться шесть операторов сравнения (=, <> (не равно), <, >, <=, >=). Для создания составных условий или для отрицания условия могут использоваться булевы операции AND (И), OR (ИЛИ) и NOT (HE). Для группировки условий, как обычно в языках программирования, могут использоваться скобки.
Операторы сравнения =, <>, <, >, <=, >=.
Булевы операции AND (И), OR (ИЛИ) и NOT (HE).
Для формулировки этого запроса также можно было использовать оператор BETWEEN (между):
SELECT *
FROM WORKER
WHERE HRLY_RATE BETWEEN 10 AND 12
BETWEEN может использоваться для сравнения некоторой величины с двумя другими величинами, первая из которых меньше второй, если сравниваемая величина может быть равна каждой из данных величин или любому значению между ними.
Запрос: Перечислить штукатуров, кровельщиков и электриков.
SELECT *
FROM WORKER
WHERE SKILL_TYPE IN ('Штукатур', 'Кровельщик', 'Электрик')
Результат:
WORKER_ID NAME HRLY_RATE SKILL_TYPE SUPV_ID
1235 М.Фарадей 12.50 Электрик 1311
1412 К.Немо 13.75 Штукатур 1520
2920 Р.Гаррет 10.00 Кровельщик 2920
1520 Г.Риковер 11.75 Штукатур 1520
1311 Х.Колумб 15.50 Электрик 1311
Этот запрос поясняет использование оператора сравнения IN (В). Условие WHERE считается истинным, если тип специальности строки расположен внутри множества, указанного в скобках, то есть если тип специальности - штукатур, кровельщик или электрик. Мы еще встретимся с оператором IN в подзапросах.
Предположим, что мы не можем точно вспомнить написание специальности: «электрик» или «электронщик» или еще как-то. Символы шаблона, которые замещают неопределенные строки символов, облегчают поиск неточного написания в запросе.
Символы шаблона. Символы, замещающие неопределенные строки символов.
Запрос: Перечислить работников, чей тип специальности начинается с «Элек».
SELECT *
FROM WORKER
WHERE SKILL_TYPE LIKE ('Элек%')
Результат:
WORKER ID NAME HRLY_RATE SKILL_TYPE SUPV_ID
1235 М.Фарадей 12.50 Электрик 1311
1311 Х.Колумб 15.50 Электрик 1311
В SQL есть два символа шаблона: % (процент) и _ (подчеркивание). Подчеркивание замещает ровно один неопределенный символ. Процент замещает произвольное число символов, начиная с нуля. Когда используются символы шаблона, для сравнения символьных переменных с константами требуется оператор LIKE (как). Другие примеры:
NAME LIKE '__Колумб'
NAME LIKE '__K%'
Условие в первом примере истинно, если NAME состоит из двух символов, за которыми следует 'Колумб'. В таблице WORKER все имена начинаются с первого инициала и точки. Таким образом, при помощи этого условия мы. найдем всех работников по фамилии «Колумб». Условие второго примера позволяет найти всех работников, чьи фамилии начинаются на букву «К».
Запрос: Найти все работы, которые начинаются в течение ближайших двух недель.
SELECT *
FROM ASSIGNMENT
WHERE START _DATE BETWEEN CURRENT_DATE AND
CURRENT_DATE + INTERVAL '14' DAY
Результат: (Предположим, что текущая дата CURRENT DATE = 10.10)
WORKER_ID BLDG_ID START_DATE NUM_DAYS
1235 312 10.10 5
1235 515 17.10 22
3231 111 10.10 8
1412 435 15.10 15
3231 312 24.10 20
1311 460 23.10 24
Этот запрос иллюстрирует употребление оператора BETWEEN (между) со значениями типа date (дата) и interval (промежуток). CURRENT_DATE — это функция, всегда возвращающая значение сегодняшней даты. Выражение
CURRENT_DATE + INTERVAL '14' DAY
прибавляет двухнедельный промежуток к текущей дате. Таким образом, ASSIGNMENT выбирается (в предположении, что сегодня 10.10) в том случае, если в ней значение столбца START_DATE лежит между 10.10 и 24.10. Из этого видно, что мы можем прибавлять к полям дат величины типа interval. Более того, мы можем умножать значения промежутков на целые величины. Например, предположим, что мы хотим выяснить, какое число будет через определенное количество недель (обозначенное переменной NUM_WEEKS (ЧИСЛО НЕДЕЛЬ)). Мы можем это сделать так:
CURRENT_DATE + INTERVAL '7' DAY * NUM_WEEKS