Операция объединения позволяет объединять результаты отдельных запросов по нескольким таблицам в единую результирующую таблицу. Таким образом, предложение UNION объединяет вывод двух или более SQL-запросов в единый набор строк и столбцов.
Для справки, приведем общую форму команды SELECT, учитывающую возможность соединения нескольких таблиц и объединения результатов:
SELECT | [DISTINCT] список_выбираемых_элементов (полей) |
FROM | список_таблиц (или представлений) |
[WHERE | предикат] |
[GROUP BY | поле (или поля) [HAVING предикат]] |
[UNION | другое_выражение_Select] |
[ORDER BY | поле (или поля) или номер (номера)]; |
Рис. 2: Общий формат команды SELECT
Отметим, что под предикатом понимается некоторое специфицированное условие (отбора), значение которого имеет булевский тип. Квадратные скобки означают необязательность использования дополнительных конструкций команды. Точка с запятой является стандартным терминатором команды. Отметим, что в WISQL и в компоненте TQuery ставить конечный терминатор не обязательно. При этом там, где допустим один пробел между элементами, разрешено ставить любое количество пробелов и пустых строк - выполняя желаемое форматирование для большей наглядности.
Команда SELECT
Простейшие конструкции команды SELECT
Итак, начнем с рассмотрения простейших конструкций языка SQL. После такого рассмотрения мы научимся:
назначать поля, которые должны быть выбраны
назначать к выборке "все поля"
управлять "вертикальным" и "горизонтальным" порядком выбираемых полей
подставлять собственные заголовки полей в результирующей таблице
производить вычисления в списке выбираемых элементов
использовать литералы в списке выбираемых элементов
ограничивать число возвращаемых строк
формировать сложные условия поиска, используя реляционные и логические операторы
устранять одинаковые строки из результата.
Список выбираемых элементов может содержать следующее:
имена полей
*
вычисления
литералы
функции
агрегирующие конструкции
Список полей
SELECT first_name, last_name, phone_no
FROM phone_list
получить список имен, фамилий и служебных телефонов всех работников предприятия
Все поля
SELECT *
FROM phone_list
получить список служебных телефонов всех работников предприятия со всей необходимой информацией
Все поля в произвольном порядке
SELECT first_name, last_name, phone_no,
location, phone_ext, emp_no
FROM phone_list
получить список служебных телефонов всех работников предприятия со всей необходимой информацией, расположив их в требуемом порядке
Вычисления
SELECT emp_no, salary, salary * 1.15
FROM employee
получить список номеров служащих и их зарплату, в том числе увеличенную на 15%
Порядок вычисления выражений подчиняется общепринятым правилам: сначала выполняется умножение и деление, а затем - сложение и вычитание. Операции одного уровня выполняются слева направо. Разрешено применять скобки для изменения порядка вычислений.
Литералы
Литералы - это строковые константы, которые применяются наряду с наименованиями столбцов и, таким образом, выступают в роли "псевдостолбцов". Строка символов, представляющая собой литерал, должна быть заключена в одинарные или двойные скобки.
SELECT first_name, "получает", salary,
"долларов в год"
FROM employee
получить список сотрудников и их зарплату
Конкатенация
Имеется возможность соединять два или более столбца, имеющие строковый тип, друг с другом, а также соединять их с литералами. Для этого используется операция конкатенации (||).
SELECT "сотрудник " || first_name || " " ||
last_name
FROM employee
получить список всех сотрудников
Использование квалификатора AS
Для придания наглядности получаемым результатам наряду с литералами в списке выбираемых элементов можно использовать квалификатор AS. Данный квалификатор заменяет в результирующей таблице существующее название столбца на заданное. Это наиболее эффективный и простой способ создания заголовков (к сожалению, InterBase, как уже отмечалось, не поддерживает использование русских букв в наименовании столбцов).
SELECT count(*) AS number
FROM employee
подсчитать количество служащих
Работа с датами
Внутренне дата в InterBase содержит значения даты и времени. Внешне дата может быть представлена строками различных форматов, например: "October 27, 1995" Кроме абсолютных дат, в SQL-выражениях можно также пользоваться относительным заданием дат: "yesterday" – вчера,"today" – сегодня, "now" - сейчас (включая время), "tomorrow" - завтра
Дата может неявно конвертироваться в строку (из строки), если:
строка, представляющая дату, имеет один из вышеперечисленных форматов;
выражение не содержит неоднозначностей в толковании типов столбцов.
Агрегатные функции
К агрегирующим функциям относятся функции вычисления суммы (SUM), максимального (SUM) и минимального (MIN) значений столбцов, арифметического среднего (AVG), а также количества строк, удовлетворяющих заданному условию (COUNT).
SELECT count(*), sum (budget), avg (budget),
min (budget), max (budget)
FROM department
WHERE head_dept = 100
вычислить: количество отделов, являющихся подразделениями отдела 100 (Маркетинг и продажи), их суммарный, средний, мини- мальный и максимальный бюджеты
Предложение FROM команды SELECT
В предложении FROM перечисляются все объекты (один или несколько), из которых производится выборка данных (рис.2). Каждая таблица или представление, о которых упоминается в запросе, должны быть перечислены в предложении FROM.
Ограничения на число выводимых строк
Число возвращаемых в результате запроса строк может быть ограничено путем использования предложения WHERE, содержащего условия отбора (предикат, рис.2). Условие отбора для отдельных строк может принимать значения true, false или unnown. При этом запрос возвращает в качестве результата только те строки (записи), для которых предикат имеет значение true.
Типы предикатов, используемых в предложении WHERE:
сравнение с использованием реляционных операторов
= равно
<> не равно
!= не равно
> больше
< меньше
>= больше или равно
<= меньше или равно
BETWEEN
IN
LIKE
CONTAINING
IS NULL
EXIST
ANY
ALL
Операции сравнения
Рассмотрим операции сравнения. Реляционные операторы могут использоваться с различными элементами. При этом важно соблюдать следующее правило: элементы должны иметь сравнимые типы. Если в базе данных определены домены, то сравниваемые элементы должны относиться к одному домену.
Элементом сравнения может выступать:
значение поля
литерал
арифметическое выражение
агрегирующая функция
другая встроенная функция
значение (значения), возвращаемые подзапросом.
BETWEEN задает диапазон значений, для которого выражение принимает значение true. Разрешено также использовать конструкцию NOT BETWEEN.
Предикат BETWEEN с отрицанием NOT (NOT BETWEEN) позволяет получить выборку записей, указанные поля которых имеют значения меньше нижней границы и больше верхней границы.
Предикат IN проверяет, входит ли заданное значение, предшествующее ключевому слову "IN" (например, значение столбца или функция от него) в указанный в скобках список. Если заданное проверяемое значение равно какому-либо элементу в списке, то предикат принимает значение true. Разрешено также использовать конструкцию NOT IN.
LIKE используется только с символьными данными. Он проверяет, соответствует ли данное символьное значение строке с указанной маской. В качестве маски используются все разрешенные символы (с учетом верхнего и нижнего регистров), а также специальные символы:
% - замещает любое количество символов (в том числе и 0),
_ - замещает только один символ.
CONTAINING аналогичен предикату LIKE, за исключением того, что он не чувствителен к регистру букв. Разрешено также использовать конструкцию NOT CONTAINING.
IS NULL значение столбца неизвестно. Поисковые условия, в которых значение столбца сравнивается с NULL, всегда принимают значение unknown (и, соответственно, приводят к ошибке), в противоположность true или false, т.е. Предикат IS NULL принимает значение true только тогда, когда выражение слева от ключевых слов "IS NULL" имеет значение null (пусто, не определено). Разрешено также использовать конструкцию IS NOT NULL, которая означает "не пусто", "имеет какое-либо значение".
Логические операторы
К логическим операторам относятся известные операторы AND, OR, NOT, позволяющие выполнять различные логические действия: логическое умножение (AND, "пересечение условий"), логическое сложение (OR, "объединение условий"), логическое отрицание (NOT, "отрицание условий"). В наших примерах мы уже применяли оператор AND. Использование этих операторов позволяет гибко "настроить" условия отбора записей.
Оператор AND означает, что общий предикат будет истинным только тогда, когда условия, связанные по "AND", будут истинны.
Оператор OR означает, что общий предикат будет истинным, когда хотя бы одно из условий, связанных по "OR", будет истинным.
Оператор NOT означает, что общий предикат будет истинным, когда условие, перед которым стоит этот оператор, будет ложным.
Преобразование типов (CAST)
В SQL имеется возможность преобразовать значение столбца или функции к другому типу для более гибкого использования операций сравнения. Для этого используется функция CAST.
Изменение порядка выводимых строк (ORDER BY)
Порядок выводимых строк может быть изменен с помощью опционального (дополнительного) предложения ORDER BY в конце SQL-запроса. Это предложение имеет вид: