Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
СБД / Lec_2015 / конспект.doc
Скачиваний:
49
Добавлен:
11.04.2015
Размер:
852.48 Кб
Скачать

3. Типы команд языка sql

Создание реляционных баз данных Oracle, хранение информации в БД и обработка этой информации предполагает наличие специального языка для выполнения всех этих действий. Таким языком является язык SQL. Средства языка SQL включают набор команд, которые можно разделить следующие категории:

  • язык обработки данных DML (Data Manipulation Language)

  • управление транзакциями (Transaction control)

  • язык определения данных DDL (Data Definition Language)

  • язык управления данными DCL (Data Control Language)

3.1. Команды обработки данных

Команды языка DML осуществляют извлечение, вставку, изменение и удаление строк в таблицах БД Oracle. Такими командами являются SELECT, INSERT, UPDATE и DELETE.

Примеры использования команд, приведенные в данном разделе, используют учебную базу данных, описанную в п.1.6.

3.1.1. Извлечение данных с помощью запросов

Командой SQL, с помощью которой извлекаются данные из БД, является команда SELECT. Весь набор функциональных возможностей этой команды в данном курсе не рассматривается. Ниже представлен упрощенный, но тем не менее достаточно мощный, синтаксис SELECT.

SELECT [ DISTINCT ] список выбора

FROM список таблиц

WHERE условие

GROUP BY поле [,] [ HAVING условие ]

ORDER BY поле | позиция [ ASC | DESC ]

Здесь список выбора - список полей или выражений, которые должны отображаться в выводимом наборе данных. Список таблиц – одна или несколько таблиц БД, из которых должны извлекаться данные. Условие – логическое выражение, определяющее набор строк (или групп строк) таблицы, которые должны участвовать в выборке. Поле | позиция – имя поля из списка выбора или его порядковый номер в этом списке, по которому сортируются выходные данные.

Для выбора данных из всех строк, включая все поля, используется наиболее простой вариант команды SELECT:

SELECT * FROM sal

В этой команде звездочка (*) используется для указания, что выбираются все поля таблицы. В команде отсутствует фраза WHERE, что означает выбор всех строк таблицы SAL.

Фраза DISTINCT используется для того, чтобы исключить повторяющиеся (полностью совпадающие) строки из результирующего набора строк.

Выборка данных только из определенных строк таблицы задается логическим выражением во фразе WHERE. Так в следующем примере выбираются номера и имена всех продавцов, работающих в Лондоне.

SELECT snum, sname FROM sal WHERE city='London'

В этом примере список выбора включает два поля - snum и sname, - а условие «city='London'» означает, что при выполнении запроса просматриваются только те строки, в которых поле city имеет значение «London».

Построение выражений

Для построения выражений, используемы во фразах WHERE и HAVING, можно применять реляционные, булевские и специальные операторы, а также их комбинации. К реляционным операторам относятся следующие:

= - равно

> - больше, чем

< - меньше, чем

>= - больше или равно

<= - меньше или равно

<>, !=, ^= - не равно.

Стандартными булевыми операторами, распознаваемыми SQL, являются:

AND - логическое И

OR - логическое ИЛИ

NOT - логическое ОТРИЦАНИЕ

Следующий пример показывает, как выбрать имена и рейтинги тех покупателей, которые живут в Лондоне или в Риме.

SELECT сname, rating FROM cust WHERE city='London' OR city='Rome'

К специальным операторам относятся такие, как IN, BETWEEN и LIKE. Оператор IN задает множество, принадлежность к которому может задаваться в условии выборки, и является альтернативой применению оператора OR. Так, последний пример можно записать и другим способом для достижения того же результата.

SELECT сname, rating FROM cust WHERE city IN ('London', 'Rome')

Оператор BETWEEN похож на оператор IN, но BETWEEN задает диапазон значений. После ключевого слова BETWEEN вводится начальное значение диапазона, затем ключевое слово AND и конечное значение. Следующая команда будет извлекать всех продавцов с комиссионными от 0.10 до 0.12 (т.е. граничные значения попадают в выборку):

SELECT * FROM sal WHERE comm BETWEEN 0.10 AND 0.12

Оператор LIKE используется, чтобы находить подстроки в указанном поле таблицы. Этот оператор применим только к полям типа CHAR или VARCHAR. В искомой строке могут использоваться групповые символы (wildkards):

- символ подчеркивания «_» замещает любой одиночный символ,

- знак процента «%» – группу из любого числа символов.

В следующем примере запрашиваются сведения о всех заказчиках, в имени которых второй буквой является буква i:

SELECT * FROM cust WHERE cname LIKE '_i%'

Агрегатные функции и группировка

Агрегатные (обобщающие, многострочные, групповые) функции обрабатывают множества значений столбца таблицы или группы столбцов и возвращают обобщенное значение для группы. Наиболее употребимы следующие функции:

COUNT- количество строк, выбранных в запросе

SUM - арифметическая сумма всех значений столбца

AVG - среднее значение всех значений столбца

MAX - наибольшее значение из всех значений столбца

MIN - наименьшее значение из всех значений столбца

Например, для нахождения общей суммы всех заказов в таблице ORD можно ввести следующий запрос:

SELECT SUM (amt) FROM ord

Агрегатные функции могут применяться к группам строк (а не ко всем строка таблицы) при использовании опции GROUP BY. При этом автоматически выполняется разбивка на группы значений в тех столбцах, которые указаны как аргументы в опции GROUP BY. Например, требуется найти наиболее крупный заказ для каждого продавца. Можно сделать раздельный запрос для каждого из них, выбрав MAX(amt) из таблицы Заказов для каждого значения поля snum. Однако, GROUP BY позволяет это сделать одной командой:

SELECT snum, MAX(amt) FROM ord

GROUP BY snum

Если требуется получить групповые данные не по всем группам, а только по некоторым, то для указания критерия отбора опция GROUP BY дополняется опцией HAVING. Предположим, что в предыдущем примере потребовалось вывести информацию только для групп, чьи максимальные закаы превышают 3000. Это можно сделать следующим образом:

SELECT snum, MAX(amt) FROM ord

GROUP BY snum

HAVING MAX(amt) > 3000

Сортировка результирующих данных

При выборке данных очень часто требуется, чтобы результат содержал данные, отсортированные по значениям какого-либо поля или группы полей. Для этих целей используется фраза ORDER BY. В двух следующих примерах мы выводим одни и те же данные. Но в первом случае они отсортированы в алфавитном порядке имен покупателей, а во втором – названий городов, причем в убывающем порядке.

SELECT * FROM cust ORDER BY cname;

SELECT * FROM cust ORDER BY city DESC;

Порядок сортировки можно задать, используя не названия полей, а их порядковые номера в списке вывода. Следующие команды дадут одинаковые результаты выборки – данные будут отсортированы по именам заказчиков:

SELECT cnum, cname, city, rating, snum FROM cust ORDER BY cname;

SELECT cnum, cname, city, rating, snum FROM cust ORDER BY 2;

Использование значений Null

В реляционных базах данных разрешается использовать пустые поля, т.е. поля, не содержащие никаких данных. Это означает, что необходимые данные неизвестны или их просто нет. Например, при вводе нового покупателя в таблицу CUST его рейтинг сначала может быть еще не сформирован, поэтому поле RATING для него будет какое-то время пустым. Пустые значения полей называются null-значениями, и для работы с ними требуются специальные действия.

Чтобы значения Null в результатах выборки или в выражениях обрабатывалось требуемым образом, необходимо использовать специальную скалярную функцию NVL. Эта функция имеет два аргумента: 1) поле (или переменная), которое может содержать null-значение, и 2) заменяющее значение (см. описание числовых и символьных функций в п.1.4). Функция возвращает значение, заданное пользователем, когда значение поля есть null. В качестве примера использования функции NVL рассмотрим команду SELECT, выбирающую данные о покупателях. При это для получения нулевого рейтинга вместо null-значения применяется функция NVL в списке вывода.

SELECT cnum, cname, city, nvl(rating,0) as rating

FROM cust

ORDER BY cname;

Наш запрос выведет рейтинг, равный 0, для всех тех покупателей, у которых он равен null. Но рейтинги тех покупателей, у кого они имеют конкретные числовые значения (не null), будут выведены такими, какими они хранятся в таблице, т.е. функция NVL не окажет на них никакого воздействия. Следует отметить, что если применять функцию NVL к полю, содержащему символьные данные, то в качестве второго аргумента нужно задать строковое значение. Обратите внимание на фразу «as rating» – так задан алиас (псевдоним) для столбца, содержащего рейтинги. Если бы мы этого не сделали, столбец бы имел название «nvl(rating,0)» в результирующем наборе строк.

Объединение данных в связанных таблицах

В рассмотренных ране примерах использовались запросы, которые извлекают данные только из одной таблицы. SQL позволяет определять связи между таблицам и, используя эти связи, выводить данные из нескольких таблиц одной командой. Так как в разных таблицах могут быть столбцы с одинаковыми именами, имена полей в команде SELECT требуется указывать вместе с именем таблицы, используя точечную нотацию. Например, следующий запрос выдаст имена заказчиков и продавцов, размещенных в одних и тех же городах:

SELECT cname, sname, sal.city FROM sal, cust

WHERE sal.city = cust.city

Команда SELECT в приведенном примере выводит объединенные данные из связанных таблиц. Для выполнения объединения нам потребовалось 1) во фразе FROM перечислить таблицы (sal и cust), данные из которым нужно выбрать, и 2) во фразе WHERE указать имена полей, по которым производится связывание, приравняв их друг другу. Выполненное таким образом объединение называется внутренним. При внутреннем объединении в результирующий набор данных не будут включены строки какой-либо из таблиц, которые не имеют соответствия в другой таблице.

Если при объединении таблиц фразу WHERE опустить (или не указать в ней условие «sal.city = cust.city»), то мы получим так называемое декартово произведение. В этом случае в результирующий набор данных попадут данные из всех комбинаций строк обеих таблиц – каждая строка одной таблицы связывается с каждой строкой другой таблицы.

Язык SQL позволяет создавать объединения, которые включают и различные таблицы, и псевдонимы одной и той же таблицы. Следующий запрос, объединяет таблицу Заказчиков с собой, чтобы найти все пары заказчиков, обслуживаемых одним продавцом. Кроме того, этот запрос объединяет таблицу Заказчиков с таблицей Продавцов по номеру продавца для выбора имени продавца:

SELECT sname, sal.snum, a.cname, b.cname

FROM cust a, cust b, sal

WHERE a.snum = b.snum

AND sal.snum = a.snum

ORDER BY sname, a.cname

Подзапросы

Подзапрос – это оператор SELECT, вложенный внутрь другого оператора SELECT.

Есть два основных вида подзапросов:

  • однострочные подзапросы. Возвращают ноль строк или одну строку

  • многострочные подзапросы. Возвращают от одной до нескольких строк

Кроме того, есть три подтипа подзапросов, которые могут возвращать одну или несколько строк:

  • многостолбцовые подзапросы. Возвращают более одного столбца

  • коррелированные подзапросы. Ссылаются на один или несколько столбцов во внешнем операторе SQL.

  • Вложенные подзапросы. Подзапросы, помещенные внутрь другого подзапроса. Глубина вложений может составлять до 255.

Пример однострочного подзапроса во фразе WHERE

SELECT sname, city, comm FROM sal

WHERE snum =

(SELECT snum FROM sal WHERE sname= 'Peel');

В этом примере из строки таблицы sal для продавца Peel выбираются имя продавца (sname), город, в котором он работает (city) и его комиссионные (comm). В подзапросе в качестве условия выбора мы указываем имя продавца, и по этому имени извлекается номер продавца snum. Найденный в подзапросе номер snum используется теперь в условии выбора основного запроса.

Пример подзапроса во фразе FROM (встроенное представление)

SELECT snum, sname, comm

FROM

(SELECT snum, sname, comm

FROM sal WHERE city = 'London');

Здесь подзапрос помещен во фразу FROM вместо имени таблицы, поэтому он называется встроенным представлением (о представлениях см. п. 3.3.3). Подзапрос формирует данные только о продавцах, работающих в Лондоне.

Пример использования оператора IN с многострочным подзапросом

SELECT snum, sname, comm FROM sal

WHERE snum IN

(SELECT snum FROM sal WHERE city = 'London');

Здесь основной запрос выводит данные только о продавцах, работающих в Лондоне, как и в предыдущем примере. Но теперь в условии WHERE основного запроса выбираются номера snum только такие, которые возвращаются подзапросом. А подзапрос возвращает номера snum только продавцов, работающих в Лондоне.

Соседние файлы в папке Lec_2015