- •Структурированный язык запросов sql. Оператор delete. Структура оператора и примеры использования. Примеры использования delete с вложенными подзапросами.
- •Структурированный язык запросов sql. Оператор insert. Структура оператора и примеры использования. Использование insert с вложенными подзапросами.
- •Структурированный язык запросов sql. Оператор update. Структура оператора и примеры использования. Использование update с вложенными подзапросами.
- •Выборка данных оператором select. Структура оператора и примеры использования. Способы задания отображаемых полей. Использование distinct. Выборка значений с упорядочиванием.
- •Использование фразы where в операторах sql. Способы задания логических выражений в sql. Операторы in, like, between. Использование значения null в логических выражениях.
- •7 Вложенные подзапросы. Типы вложенных подзапросов. Способы включения вложенных подзапросов. Примеры использования вложенных подзапросов с разными способами включения.
- •Создание таблиц
- •Пример создания таблиц
- •Модификация таблиц
- •Удаление таблиц
- •Создание представлений. Правила создания модифицируемых представлений. Достоинства и недостатки представлений. Особенности определения полей представлений. Примеры использования.
- •Хранимые процедуры InterBase. Виды хранимых процедур. Расширения языка sql для использования в хранимых процедурах. Примеры создания хранимых процедур и их вызова.
- •Расширения языка sql для использования в хранимых процедурах и триггерах. Циклы и ветвления. Обработка исключений и ошибок.
- •Генераторы InterBase. Создание генераторов. Установка значений генераторов. Получение значений генераторов из
- •Триггеры InterBase. Типы триггеров. Контекстные переменные. Примеры создания триггеров для автоинкрементных полей и протоколирования изменений.
- •17. Транзакции в InterBase. Механизм транзакций. Параметры транзакций. Уровни изоляции и способы их задания в InterBase. Управление транзакциями. Примеры использования.
- •18. Библиотека доступа InterBase eXpress. Основные компоненты. Подключение к базе данных InterBase и организация просмотра и модификации данных.
- •20.Особенности системы защиты данных в InterBase. Пользователи и роли: создание и удаление. Вида прав. Раздача
Использование фразы where в операторах sql. Способы задания логических выражений в sql. Операторы in, like, between. Использование значения null в логических выражениях.
В языке SQL есть условный оператор WHERE, который служит ограничителем выдаваемых строк в запросе.
Так например запрос соответствующей задаче вытащить данные только менеджеров из таблицы EMP будет выглядит следующем образом:
SELECT * FROM emp
WHERE job = 'MANAGER'
Вторая строка началась с ключевого слово WHERE, которое указывает, что необходимо вытащить данные соответствующие критериям. В качестве критерия мы видим имя столбца “job”, который нам говорит, что значения столбца “job” должны быть равным (именно знак равенства = и идет после название столбца) слову MANAGER (*).
Также стоит отметить, что все слова написанные внутри одинарных кавычек являются регистра чувствительными. Таким образом слово 'MANAGER', 'manager' и 'Manager' отличаются друг от друга. А написание название столбца как “job” или “jOB” одинаковы, так как в написание самих SQL конструкций, название таблиц, столбцов таблицы, функций - язык SQL не регистра чувствительный.
При запуске следующего запроса, получаем ровно ноль строк, так как не будет строк соответствующих нашим критериям.
(*) Для указаний выражений строкового типа используется одинарные кавычки в начале и в конце выражения.
SELECT * FROM emp
WHERE job = 'manager'
Рассмотрим схему выражений сравнений.
Оператор |
Значение |
|
|
= |
равно |
> |
больше |
< |
меньше |
>= |
больше или равно |
<= |
меньше или равно |
<> |
не равно |
!= |
не равно |
Таким образом в нашем запросе общая схема условного оператора примет следующий вид:
...WHERE expression operator value
Запрос возвращающий всех сотрудников у кого зарплата выше 2500, будет выглядеть следующем образом:
SELECT * FROM emp
WHERE sal > 2500
Запрос возвращающий всех сотрудников у кого зарплата не равно 0, будет выглядеть следующем образом:
SELECT * FROM emp
WHERE sal <> 0
Оператор сравнения BETWEEN
Оператор сравнения BETWEEN может быть полезен в случаи, когда необходимо будет выбирать данные в определенном диапазоне, в котором будут точно указано минимальное значение и максимальное значение диапазона. Например, зарплаты сотрудников у кого она находиться в диапазоне 2500 — 3500. При использовании BETWEEN указанные значения также входят в условия поиска значений. Т.е. 2500 и 3500 входят в поиск, а вот и сам запрос:
SELECT *
FROM emp
WHERE sal between 2500 and 3500
Механизм довольно прост. Сперва указывается столбец, по которому идет поиск, затем оператор BETWEEN после минимальное значение с какого следует начинать поиск. Логичский оператор and и значение указывающее конец диапазона.
Хотя, конечно же надо отметить верхний SQL c BETWEEN можно заменить, на следующий SQL:
SELECT *
FROM emp
WHERE sal >= 2500 and sal <= 3500
Оператор сравнения IN
У нас имеется список значений, который мы хотим сверить со значениями одного из наших столбцов. В данном случаи может быть использован оператор IN.
К примеру, перед нами стоит задача получить полный список сотрудников которые работают на должности менеджера и аналиста:
SELECT * FROM emp
WHERE job IN ('MANAGER', 'ANALYST')
Как видно из примера, указывается оператор IN, а после в круглых скобках через запятую значения, которым мы хотим, чтобы соответствовала поле поиска. Таким образом, через запятую можно указывать довольно большое количество значений.
Отобразить всех у кого зарплата равна 500, 600, 700.
SELECT * FROM emp
WHERE sal IN (500, 600, 700)
Оператор сравнения LIKE
Прежде чем начинать описания оператора LIKE, сперва разберем регулярные выражения.
Регулярное выражение это конструкции позволяющие вести поиск в тексте по различным условиям. Регулярные выражения на сегодняшний день очень широко используется как для поиска (в случае SQL), так и для ограничений ввода, к примеру, при вводе номера телефона, телефон должен соответствовать маске XXX-XX-XX, где X- это число. Также один из наглядных примеров применение регулярных выражений, это проверка mail (cторока@строка.строка) при регистрации в интернет ресурсах.
Значит, мы уяснил для себя проверка данных, поиск дубликатов, обнаружение лишних пробелов или разбор строки - это все относятся к примерам использования регулярных выражений. И еще раз повторимся, их можно применять для проверки формата телефонного номера, zip-кода, email-адресов, номеров социального обеспечения, IP-адресов, имен файлов и директорий и так далее. Кроме того, можно искать комбинации, например, HTML-тегов, чисел, дат, и другое, которые соответствуют какому-либо шаблону в тексте и заменять их другим набором символов.
Регулярное выражение содержит один и более символов и/или метасимволов. В самом простом виде регулярное выражение может состоять только из символов, например, регулярное выражение cat. Оно читается, как буква c, за которой следует буква a и t, и этому шаблону соответствуют такие строки, как cat, location и catalog.
Метасимволы обеспечивают алгоритмы обработки в Oracle символов, из которых состоит регулярное выражение. Когда значение различных метасимволов будет понятным, вы увидите, как удобны регулярные выражения для выделения и замены каких-либо текстовых данных.
Для работы с регулярными выражениями в SQL имеется оператор сравнения LIKE. Это очень полезный оператор. Например для поиска всех сотрудников, чьи имена начинается с буквы S будет иметь следующий вид:
SELECT * FROM emp
WHERE ename like 'S%'
Как видно из примера мы использовали ключевое слово LIKE после, которого обязательно идет одинарная кавычка и собственно сам шаблон поиска. В данном случаи мы использовали шаблон S% буква S означает, что слово начинается с буквы S большое, а знак процента означает, что за буквой может следовать любое количество любых символов - даже нулевой, таким образом, если у нас был сотрудник с именем S, то он тоже попал бы в результат вывода запроса.
Есть два ключевых символов, которые используется во время поиска:
% означает любые символы и любое количество символов (от 0 до ..) (даже пустой символ – null)
_ символ заменяющий любой один символ
Таким образом для поиска человека у кого в имени вторая буква L воспользуемся скриптом:
SELECT * FROM emp
WHERE ename like '_L%'
Возможны случае, когда необходимо ввести поиска по символом ‘%’ и ‘_’ в слове. В этом случаи необходимо воспользоваться ключевым словом ESCAPE.
SELECT * FROM emp
WHERE ename like 'S/_' ESCAPE '/'
Этот SQL означает воспринимать ПЕРВЫЙ символ идущий за символом / символ _ не как часть синтаксиса LIKE, а как обычный символ, как он есть.
Отобразить все имена длина, которых равна пяти и данные имена начинаются с символа ‘_’.
SELECT * FROM emp
WHERE ename like '/_____' ESCAPE '/'
Отобразить все имена различной длины, в составе которых содержиться символ ‘%’.
SELECT * FROM emp
WHERE ename like '%/%%' ESCAPE '/'
Нулевое значение - Null является специальным маркером, используемых в SQL, чтобы указать, что данного значение не существует в базе. Понятие нуль было впервые введено Ф. Кодд в качестве метода представления отсутствующих данных в базе данных. Примером пустого значения служит поле comm в некоторых строках таблице emp. Как вы заметили они просто отсутствуют, они просто пусты — это и означает, что это поле содержит значение null.
Если нужно вытащить все строки, в которых поле comm пустое (null), то нижний запрос нам не сработает:
SELECT * FROM emp
WHERE comm = ''
Для поиска пустых значений, необходимо использовать оператор IS NULL.
SELECT * FROM emp
WHERE comm IS NULL
Выборка данных оператором SELECT из нескольких таблиц. Псевдонимы таблиц и способы их использования. Декартово произведение таблиц и естественное соединение. Соединение таблицы с собственной копией. Примеры запросов.
Выборка данных оператором SELECT из нескольких таблиц.
Если в операторе присутствуют ключевые слова UNION, EXCEPT и INTERSECT, то запрос разбивается на несколько независимых запросов, каждый из которых выполняется отдельно:
Для примеров используем следующие таблицы:
используемые таблицы
1. JOIN.
SELECT t1.*, t2.* FROM t1, t2 WHERE t1.i1 = t2.i2
#Аналоги:
SELECT t1.*, t2.* FROM t1 JOIN t2 ON t1.i1 = t2.i2
SELECT t1.*, t2.* FROM t1 INNER JOIN t2 ON t1.i1 = t2.i2
В результате получим:
При этом если не указать для оператора «,» (запятая) условие выборки WHERE, то получим полное декартово произведение (пересечение каждой строки из первой таблицы с каждой строкой из второй):
(аналогичный результат получается при использовании CROSS JOIN)
При использовании оператора LEFT JOIN выбираются все значения из левой таблицы, после чего к ним подбираются соответствующие значения из правой, если таких нет, то все значения для правой таблицы в этой строке равны NULL.
RIGHT JOIN противоположен LEFT JOIN: всё абсолютно так же, но выбираются все значения для правой таблицы из выражения.
SELECT t1.*, t2.* FROM t1 LEFT JOIN t2 ON t1.i1 = t2.i2
В результате получим:
результаты LEFT JOIN
JOIN‘ы можно комбинировать:
SELECT t1.*, t2.*
FROM t1, t2
LEFT JOIN t3
ON t1.i = t3.i1 AND t2.i = t3.i2
WHERE t3.i2 IS NOT NULL
Self-join
Self-join объединяет таблицу саму с собой. Проще показать на примере.
Допустим есть таблица
И допустим, что нужно получить пары сотрудников, которые работают в одной стране. Результата можно добиться и уже описанными join’ами, но эффективнее будет следующий запрос:
SELECT F.EmployeeID, F.LastName, S.EmployeeID, S.LastName, F.Country
FROM Employee F, Employee S
WHERE F.Country = S.Country
AND F.EmployeeID < S.EmployeeID
ORDER BY F.EmployeeID, S.EmployeeID;
В результате получим:
В данном случае:
F и S - алиасы таблицы Employee
условие F.Country = S.Country исключает из результата пары, для которых страны не совпадают
условие F.EmployeeID < S.EmployeeID исключает пары с одинаковыми EmployeeID, а также дублирование ранее выведенных пар (т.е. сотрудник с EmployeeID=145 не выведется слева).
INNER JOIN в некоторых случаях значительно быстрее, чем OUTER JOIN (LEFT JOIN или RIGHT JOIN), поэтому лучше по возможности использовать INNER JOIN. Пример сравнения производительности с объяснением.
Виды JOIN'ов
Декартово произведение
Декартово произведение RxS двух отношений (двух таблиц) определяет новое отношение - результат конкатенации (т.е. сцепления) каждого кортежа (каждой записи) из отношения R с каждым кортежем (каждой записью) из отношения S.
RxS={(a, 1, 1, h), (a, 2, 1, h),
(b, 1, 1, h), ... }
SELECT R.a1, R.a2, S.b1, S.b2
FROM R, S
Пример 5.1. Декартово произведение отношений в SQL.
Результат декартова произведения двух отношений показан в таблице.
Таблица 5.1. R x S
R.a1 R.a2 S.b1 S.b2
a 1 1 h
a 1 2 g
a 1 3 h
a 2 1 h
a 2 2 g
a 2 3 h
b 1 1 h
b 1 2 g
b 1 3 h
b 3 1 h
b 3 2 g
b 3 3 h
b 4 1 h
b 4 2 g
b 4 3 h
Если одно отношение имеет N записей и K полей, а другое M записей и L полей, то отношение с их декартовым произведением будет содержать NxM записей и K+L полей. Исходные отношения могут содержать поля с одинаковыми именами, тогда имена полей будут содержать названия таблиц в виде префиксов для обеспечения уникальности имен полей в отношении, полученном как результат выполнения декартова произведения.
Однако в таком виде (пример 5.1.) отношение содержит больше информации, чем обычно необходимо пользователю. Как правило, пользователей интересует лишь некоторая часть всех комбинаций записей в декартовом произведении, удовлетворяющая некоторому условию. Поэтому вместо декартова произведения обычно используется одна из самых важных операций реляционной алгебры - операция соединения, которая является производной от операции декартова произведения. С точки зрения эффективности реализации в реляционных СУБД эта операция - одна из самых трудных и часто входит в число основных причин, вызывающих свойственные всем реляционным системам проблемы с производительностью.
Естественное соединение
Естественным соединением называется соединение по эквивалентности двух отношений R и S, выполненное по всем общим атрибутам, из результатов которого исключается по одному экземпляру каждого общего атрибута.
Таблица 5.3. RS, F=(R.a2=S.b1)
R.a1 R.a2 или S.b1 S.b2
a 1 h
a 2 g
b 3 h
b 1 h
SELECT R.a1, R.a2, S.b2
FROM R, S
WHERE R.a2=S.b1
или
SELECT R.a1, S.b1, S.b2
FROM R INNER JOIN S ON R.a2=S.b1
Пример 5.3. Естественное соединение отношений в SQL.
Соединение таблицы со своей копией
В ряде приложений возникает необходимость одновременной обработки данных какой-либо таблицы и одной или нескольких ее копий, создаваемых на время выполнения запроса.
Например, при создании списков студентов (таблица Студенты) возможен повторный ввод данных о каком-либо студенте с присвоением ему второго номера зачетной книжки. Для выявления таких ошибок можно соединить таблицу Студенты с ее временной копией, установив в WHERE фразе равенство значений всех одноименных столбцов этих таблиц кроме столбцов с номером зачетной книжки (для последних надо установить условие неравенства значений).
Временную копию таблицы можно сформировать, указав имя псевдонима за именем таблицы во фразе FROM. Так, с помощью фразы
FROM Блюда X, Блюда Y, Блюда Z
будут сформированы три копии таблицы Блюда с именами X, Y и Z.
В качестве примера соединения таблицы с ней самой сформируем запрос на вывод таких пар блюд таблицы Блюда, в которых совпадает основа, а название первого блюда пары меньше (по алфавиту), чем номер второго блюда пары. Для этого можно создать запрос с одной копией таблицы Блюда (Копия):
SELECT Блюдо, Копия.Блюдо, Основа
FROM Блюда, Блюда Копия
WHERE Основа = Копия.Основа
AND Блюдо < Копия.Блюдо;
или двумя ее копиями (Первая и Вторая):
SELECT Первая.Блюдо, Вторая.Блюдо, Основа
FROM Блюда Первая, Блюда Вторая
WHERE Первая.Основа = Вторая.Основа
AND Первая.Блюдо < Вторая.Блюдо;
Получим результат видаПервая.Блюдо Вторая.Блюдо Основа
Морковь с рисом Помидоры с луком Овощи
Морковь с рисом Салат летний Овощи
Морковь с рисом Салат витаминный Овощи
Помидоры с луком Салат витаминный Овощи
Помидоры с луком Салат летний Овощи
Салат витаминный Салат летний Овощи
Бастурма Бефстроганов Мясо
Бастурма Мясо с гарниром Мясо
Бефстроганов Мясо с гарниром Мясо