Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
PMO_PMS_shpory_final.docx
Скачиваний:
7
Добавлен:
17.09.2019
Размер:
457.71 Кб
Скачать
  1. Использование фразы 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

  1. Выборка данных оператором 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 Первая.Блюдо < Вторая.Блюдо;

Получим результат видаПервая.Блюдо Вторая.Блюдо Основа

Морковь с рисом Помидоры с луком Овощи

Морковь с рисом Салат летний Овощи

Морковь с рисом Салат витаминный Овощи

Помидоры с луком Салат витаминный Овощи

Помидоры с луком Салат летний Овощи

Салат витаминный Салат летний Овощи

Бастурма Бефстроганов Мясо

Бастурма Мясо с гарниром Мясо

Бефстроганов Мясо с гарниром Мясо

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]