Студопедия
Случайная страница | ТОМ-1 | ТОМ-2 | ТОМ-3
АрхитектураБиологияГеографияДругоеИностранные языки
ИнформатикаИсторияКультураЛитератураМатематика
МедицинаМеханикаОбразованиеОхрана трудаПедагогика
ПолитикаПравоПрограммированиеПсихологияРелигия
СоциологияСпортСтроительствоФизикаФилософия
ФинансыХимияЭкологияЭкономикаЭлектроника

Операции выборки строк

Читайте также:
  1. A.1.2. Технология командной строки.
  2. А также расшифровывающих их строк
  3. Активные операции
  4. Активные операции банков
  5. Активы, пассивы предприятия и хозяйственные операции
  6. Алгебра логики. Элементарные логические операции. Таблицы истинности.
  7. Арбитражные операции- дефиниция

Для выполнения операций выборки строк предназначен оператор SELECT. Оператор SELECT используется для выборки строк из одной или нескольких таблиц в соответствии с указанным критерием отбора. В запросе можно использовать встроенные функции Oracle и функции, написанные на языке PL/SQL.

Синтаксис конструкции с использованием оператора SELECT может быть представлен следующим образом:

SELECT перечень_выводимых_колонок

FROM перечень_таблиц_и_представлений

[ WHERE условие_отбора_строк]

[ GROUP BY критерии_группировки_строк [ HAVING условие_отбора_групп]]

[ ORDER BY критерии_сортировки_строк]

 

Любая конструкция для выборки строк начинается с ключевого слова SELECT. После ключевого слова SELECT следует список, определяющий перечень выводимых колонок. Хотя выводить все колонки таблиц обычно требуется редко, стандарт SQL поддерживает простой способ запроса на вывод всех колонок. Для этого используется специальный символ “ * ” (звездочка), который может быть указан в перечне выводимых колонок. Затем следует ключевое слово FROM, которое определяет таблицы и/или представления, из которых будут отбираться данные. Ключевое слово WHERE определяет логическое условие отбора данных. Если ключевое слово WHERE опущено, то осуществляется выбор из декартова произведения таблиц и/или представлений, указанных в перечне после ключевого слова FROM.

Декартово произведение двух таблиц представляет собой таблицу, в которой строки созданы путем дополнения каждой строки первой таблицы каждой строкой второй таблицы. Таким образом, если в первой таблице K строк и L колонок, а во второй – M строк и N колонок, то в таблице, представляющей собой декартово произведение, будет (K · M) строк и (L + N) колонок.

После необязательной ключевой конструкции GROUP BY следуют критерии группировки строк по совпадающим значениям колонок. С конструкцией GROUP BY может быть использована конструкция с использованием ключевого слова HAVING, после которого указывается условие отбора групп строк. В заключительной части указываются критерии сортировки строк с использованием конструкции ORDER BY.

Порядок обработки конструкции SELECT показан на рисунке 18.


 

 

 


Рис. 18. Порядок обработки конструкции SELECT

 

Понять принцип выполнения запросов проще всего на конкретных примерах. Рассмотрим уже знакомые нам таблицы project и department, между которыми установлена связь с использованием полей dept_no в каждой таблице.

Пример 1. Выбрать информацию о номере и названии проектов, у которых бюджет больше 100.

Конструкция для такого запроса будет иметь вид:

SELECT proj_no, proj_name FROM project WHERE budget > 100

 

В этой конструкции после ключевого слова WHERE вычисляется логическое выражение с использованием оператора сравнения “>”. Все строки таблицы project, для которых это условие выполняется, попадают в результат запроса. Существующие операторы сравнения представлены в таблице 4.

 

Таблица 4. Операторы сравнения

 

Оператор сравнения Значение
= Равно
< Меньше
> Больше
<= Меньше или равно
>= Больше или равно
<>,!=, ^= Не равно

 

Несколько условий сравнения могут быть связаны между собой с помощью связок AND (логическое И) и OR (логическое ИЛИ). Также возможно применить инвертирование (отрицание) результата логического выражения с помощью связки NOT, после которой в скобках должно быть указано логическое выражение.

В СУБД Oracle принята трехзначная логика, поскольку в таблицах могут присутствовать неопределенные (NULL) значения. Результаты выполнения операций логического И и логического ИЛИ для разных значений операндов имеют вид:

 

AND TRUE FALSE NULL   OR TRUE FALSE NULL
TRUE TRUE FALSE NULL   TRUE TRUE TRUE TRUE
FALSE FALSE FALSE FALSE   FALSE TRUE FALSE NULL
NULL NULL FALSE NULL   NULL TRUE NULL NULL

 

Пример 2. Выбрать информацию о номере и названии проектов, у которых не указан бюджет.

Конструкция для такого запроса будет иметь вид:

 

SELECT proj_no, proj_name FROM project WHERE budget IS NULL

 

В данном запросе используется конструкция IS NULL, которая позволяет провести анализ колонки budget на отсутствие значения. Для проверки того, что значение колонки не является неопределенным, служит конструкция IS NOT NULL.

 

Пример 3. Выбрать информацию о номере и названии проектов, у которых название начинается с символа ‘Z’.

Конструкция для такого запроса будет иметь вид:

 

SELECT proj_no, proj_name FROM project WHERE proj_name LIKE ‘Z%’

 

В данной конструкции используется оператор LIKE, после которого следует шаблон (‘Z%’), которому должно соответствовать значение колонки proj_name. В шаблоне допустимо использование символов “%” (для обозначения произвольного количества символов) и “_” (для обозначения одного символа). Например, следующие шаблоны имеют значение:

‘%Z’ – строка заканчивается символом ‘Z’;

‘%Z%’ – строка содержит символ ‘Z’;

‘_Z%’ – вторым символом в строке является символ ‘Z’;

‘%Z_’ – предпоследним символом в строке является символ ‘Z’;

‘ZZZ%’ – строка начинается с последовательности из трех символов ‘Z’.

 

Пример 4. Выбрать информацию о номере, названии и бюджете проектов с номерами 10, 20 или 30.

Один из вариантов конструкции такого запроса может иметь вид:

SELECT proj_no, proj_name, budget FROM project

WHERE proj_no = 10 OR proj_no = 20 OR proj_no = 30

 

Другой вариант запроса может быть построен с использованием синтаксической конструкции IN, после которой в скобках указывается перечень требуемых значений:

 

SELECT proj_no, proj_name, budget FROM project

WHERE proj_no IN ( 10, 20, 30 )

При построении запросов допустимо также использование конструкции NOT IN:

SELECT proj_no, proj_name, budget FROM project

WHERE proj_no NOT IN ( 10, 20, 30 )

Этот запрос позволяет выбрать информацию о номерах, названиях и бюджетах всех проектов за исключением тех проектов, номера которых 10, 20 или 30.

 

Пример 5. Выбрать информацию о номере и названии проектов, которые относятся к отделам, имеющим в наименовании последовательность символов “техн” (например, “Отдел техн ического обеспечения”, “Бюро техн ологии сварочных работ” и т.д.).

В этом примере подразумевается использование двух взаимосвязанных таблиц project и department, которые имеют в своем составе колонки dept_no.

Для построения такого запроса можно использовать синтаксическую конструкцию IN с подзапросом. Она будет иметь следующий вид:

 

SELECT proj_no, proj_name FROM project

WHERE dept_no IN

( select dept_no FROM department WHERE dept_name LIKE ‘%техн%’ )

 

В этом запросе имеется подзапрос (select dept_no FROM department WHERE dept_name LIKE ‘%техн%’), который возвращает список номеров отделов, которые имеют в наименовании последовательность символов “техн”, то есть перечень конкретных значений заменяется результатом подзапроса. Для этих номеров отделов производится выборка соответствующих проектов из таблицы project.

 

Пример 6. Выбрать информацию о номере и названии проектов, которые выполняются подразделением “Отдел маркетинга”.

В данном случае можно применить оператор сравнения “=”, но в качестве выражения, с которым будет производиться сравнение, использовать не конкретное значение, соответствующее номеру подразделения “Отдел маркетинга” из таблицы department, а результат подзапроса, который возвратит номер подразделения по известному наименованию. Таким образом, запрос может быть представлен в виде:

 

SELECT proj_no, proj_name FROM project

WHERE dept_no =

( select dept_no FROM department WHERE dept_name = ‘Отдел маркетинга’ )

 

В запросах, имеющих такие конструкции, допустимо использовать и другие операторы сравнения (>, <,!= и т.д.).

 

Пример 7. Выбрать информацию о номере и названии проектов, бюджет которых находится в пределах от 1000 до 2000 рублей включительно.

Для реализации такого запроса можно использовать конструкцию вида:

 

SELECT proj_no, proj_name FROM project

WHERE budget >= 1000 AND budget <= 2000

 

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

 

SELECT proj_no, proj_name FROM project

WHERE budget BETWEEN 1000 AND 2000

 

Такой вариант написания делает запрос более читаемым. Допустимо также использование конструкции NOT BETWEEN:

 

SELECT proj_no, proj_name FROM project

WHERE budget NOT BETWEEN 1000 AND 2000

 

Данный запрос позволяет выбрать информацию о номерах и названиях проектов, бюджет которых меньше 1000 или больше 2000 рублей.

 

Пример 8. Выбрать информацию о номере и названии подразделений, которые занимаются какими-либо проектами.

Для реализации такого запроса можно использовать оператор EXISTS, после которого в круглых скобках следует подзапрос. Если в результате выполнения подзапроса будет выбрана хотя бы одна строка, то условие с оператором EXISTS будет истинно и строка из таблицы departmentвойдет в результат выборки, в противном случае результат подзапроса будет пустым и информация о номере и названии подразделения не войдет в результат основного запроса. В данном примере запрос может быть представлен следующим образом:

 

SELECT dept_no, dept_name FROM department

WHERE EXISTS

( SELECT * FROM project WHERE project.dept_no =

department.dept_no )

 

В подзапросе (SELECT * FROM project WHERE project.dept_no = department.dept_no) приходится указывать названия колонки вместе с названием таблицы, т.к. в таблицах project и department присутствуют одинаковые колонки с наименованием dept_no, т.е. эти колонки указаны в подзапросе как project.dept_no и department.dept_no.

В подобных случаях достаточно неудобно указывать перед названием колонки полное название таблицы. Для удобства можно использовать в запросе так называемые псевдонимы. Псевдонимы – это синонимы таблиц или представлений, время существования которых ограничено временем выполнения запроса. Псевдоним указывается после названия таблицы (представления) в синтаксической конструкции FROM. Например, для таблицы project можно использовать псевдоним “p”, а для таблицы department – псевдоним “d”. Тогда запрос можно переписать в следующем виде:

 

SELECT dept_no, dept_name FROM department d

WHERE EXISTS

( SELECT * FROM project p WHERE p. dept_no = d. dept_no )

 

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

 

SELECT dept_no, dept_name FROM department d

WHERE NOT EXISTS

( SELECT * FROM project p WHERE p. dept_no = d. dept_no )

 

Особое место следует уделить выполнению запросов, связанных с объединением информации из нескольких таблиц. Рассмотрим несколько вариантов объединения на примере таблиц project и department.

 

Пример 9. Для проектов, которым назначено подразделение-исполнитель, необходимо выбрать следующую информацию: номер проекта, название проекта, номер подразделения и название подразделения.

Рассмотрим построение текста запроса и процесс выполнения запроса для решения поставленной задачи.

Пусть таблицы project и department содержат строки, как показано на рисунке 19.

 

project department

Рис. 19. Содержимое таблиц project и department

 

Если в запросе опустить конструкцию WHERE, то запрос из двух таблиц вернет их декартово произведение, то есть в результате выполнения запроса вида

 


Дата добавления: 2015-08-17; просмотров: 38 | Нарушение авторских прав


<== предыдущая страница | следующая страница ==>
Операции вставки строк| SELECT p.*, d.* FROM project p, department d

mybiblioteka.su - 2015-2024 год. (0.017 сек.)