SELECT <список атрибутов и/или функций от атрибутов>
FROM <список отношений>
WHERE <условие>
GROUPBY <список колонок>
HAVING <условие>
ORDER BY <списоксортировки>
TO FILE | TO PRINTER | TO SCREEN | INTO
Принципиальная схема выполнения запроса:
1) образуется декартово произведение таблиц, перечисленных в FROM;
2) для каждой строки декартового произведения вычисляется значение логического выражения, заданного в WHERE, строки с ложным значением – удаляются;
3) если заданно GROUPBY, то оставшиеся строки делятся на группы соответственно значениям указанных в ней колонок;
4) для каждой группы или строки вычисляется выражение, заданное во фразе SELECT;
5) для каждой группы производится проверка условий заданного фразой HAVING, варианты с false удаляются;
6) результат сортируется по колонкам из ORDERBY, в соответствии с заданным порядком сортировки.
В строке SELECT указываются через запятую имена столбцов в выходной таблице. Символ "*" означает, что выбираются все столбцы, указанные в предложении FROM. Если в нескольких таблицах имеются колонки с одинаковым именем, то перед этими именами указываются имена таблицы, разделённые ".". Чтобы вывести все столбцы таблицы, можно указать <имя таблицы>.*. Для того, чтобы вывести только уникальные столбцы таблицы, используют слово DISTINCT <столбцы>. Предложением SELECT можно задавать вывод символьного выражения и так же исчисляемую колонку (виртуальную).
Пример:
SELECT Tab_No, Fam, Oklad + Prem AS "оклад + премия".
В команде SELECT можно использовать специальные агрегатные функции:
COUNT () – количество отображаемых строк.
SUM () – суммирует значения числовых столбцов
MIN () – находит минимум числового столбца
MAX () – находит максимум числового столбца
AVG() – находит среднее значение числовой колонки, в скобках имя столбца.
Пример:
SELECT SUM(Oklad);
SELECT Name, SUM(Cena * Kol-vo) AS "Сумма";
SELECT COUNT(*);
SELECT MAX(Oklad), MIN(Oklad), AVG(Oklad).
Для отбора строк по заданному критерию используют предложение WHERE:
Пример:
SELECT имя покупателя
FROM заказ
WHERE Изд# = 139
Предикат IN в неявном виде заменяет квантор существования.
Пример:
WHEREXINP(X) (эквивалентно $xP(x))
WHERE X NOT IN P(X) (эквивалентно "xØP(x))
Множество, задающееся в предложении IN(), можно определить не только перечислением его элементов, но и косвенно, используя вложенный подзапрос:
Пример:
WHERE X IN (SELECT ... FROM ...)
Предикат LIKE осуществляет выбор на включаемые надстройки, задаваемой переменной или константой. Подстрока определяется заданными символами, замещёнными "-" (замещает один символ) и "%" (любое число символов):
Пример:
WHERE ФИО LIKE"ПЕТ%"
В предложении WHERE предикаты BETWEEN, IN, LIKE могут объединятся связями AND, OR, NOT.
Два дополнительных предложения GROUPBY и HAVING позволяют располагать строки по группам. Затем можно выполнять операции с этими группами. Например, использовать операцию агрегирования.
Предложение GROUPBY позволяет строки результирующей таблицы, определяемой предложением SELECT, сгруппировать в группы с одинаковым значением заданных колонок. После агрегирования каждая такая колонка сводится к одной строке результирующей таблицы. В качестве имени колонки используется имя агрегирующей функции с номером этой функции.
Предложение HAVING позволяет отображать составные группы строк, удовлетворяющих заданным условиям. Действие HAVING аналогичное WHERE, но определяет условие, которому должна удовлетворять каждая группа для вывода результирующей таблицы. Например, для вывода упорядоченного по алфавиту перечня деталей стоимостью более 300р., имеющихся на складе в количестве более 10 шт., можно использовать команду SELECT.
SELECT <номер>, SUM(<количество>), <стоимость>, <название>
FROM <склад>
WHERE <стоимость> > 300
GROUPBY <название>, <номер>, <стоимость>
HAVINGSUM(<количество>) > 10
ORDERBY <название>
Если HAVING используется без GROUPBY, то его действие распространяется на всю таблицу и эквивалентно WHERE.
ORDERBY ‘<колонка | целое число [ASC, DESC]>’
Вместо имени колонки допустимо использование целого числа, определяющего её позицию в таблице SELECT.
1) фактический – стандарт обращения к современным БД;
2) ориентирован на операции с данными, представленными в виде совокупности таблиц (DBASE работает с записями);
3) ориентирован на конечный результат обработки. Система сама определяет оптимальный путь организации запроса в отличие от процедурных языков, требующих задания последовательности выполнения операций обработки. Поэтому говорят, что SQL более декларативен, чем язык РА, который ближе к процедурным языкам.
Объекты современных реляционных БД
Данные реляционных БД хранятся в виде таблиц. Для поддержки уникальности данных в колонках таблиц, а также для ускорения доступа используются индексы. Кроме таблиц, многие СУБД поддерживают представление и рассматривают их как отдельные объекты БД.
Представление — виртуальная таблица, то есть таблица, которая сама по себе не существует, но для пользователя выглядит так, словно она существует. Тогда как базовая таблица — реальная таблица, для любой строки которой существует двойник в физической памяти. То есть представления не поддерживаются их собственными физически хранимыми данными. Вместо этого в каталоге хранятся их определения в терминах других таблиц. Представление может быть создано с помощью команды SQL
CREATEVIEW <имя представления>
[(<имяполя>[,<имяполя>…])]
AS SELECT
FROM
WHERE
Когда исполняется это предложение, подзапрос, следующий за AS, не исполняется. Вместо этого, он просто сохраняется в каталоге. Но для пользователя это выглядит так, будто в БД действительно существует такая таблица. Эта таблица представляет собой фактически окно в реальную таблицу. Это окно является динамическим. Изменение в реальной таблице будут автоматически видны через это окно. Изменения в виртуальной таблице также будут автоматически внесены в реальную таблицу. Пользователь может производить операции над представлением, как если бы это была реальная таблица.
Синонимы представляют собой альтернативные имена таблиц, либо базовых, либо виртуальных. Чаще всего, синоним создается для таблицы. Которая была создана каким-нибудь другим пользователем и для которой вы должны были бы в противном случае использовать полностью уточненное имя. Например, пользователь Ivan создает таблицу
CREATETABLEPrimer,
тогда Петр может использовать таблицу Ivan.Primer. чтобы избежать длинных обращений, Петр может создать синоним
CREATE SYNONYM P1 FOR Ivan.Primer
и обращаться к таблице через P1.
Имя Р1 является частным для пользователя Петра. Другой пользователь может создать собственный синоним. Описание всех таблиц, представлений, синонимов хранится в специальном каталоге.
Системная БД, содержащая дескриптор (информацию) относительно разных объектов, а именно: таблиц, представлений, синонимов, индексов, БД, прав доступа и т.д. Сам каталог состоит из множества таблиц, точно таких же, как обычные пользовательские таблицы.
SYSTABLES — таблицы и представления. Обычно содержат поля:
Name – имя таблицы;
Creator – имя пользователя;
ColCount – количество столбцов.
SYSCOLUMNS — колонки БД. В каждой строке этой таблицы содержится информация о столбце какой-либо таблицы. Для этого служат поля
Name – имя столбца;
TBName – имя таблицы;
ColType – тип данных для столбца.
SYSINDEX — любому индексу в системе отводится одна строка в этой таблице. Для каждого индекса в ней указано его имя, имя индексной таблицы TBName, имя пользователя и т.д.
Так как каталог состоит из таблиц точно таких же, как обычные пользовательские таблицы, из него можно запрашивать данные с помощью предложения SELECT.
Пример:
SELECT FROM SYSIBM.SYS COLUMNS WHERE Creator=’’
Хранимые программы и процедуры
Обычно в среде клиент-сервер конечные приложения располагаются на клиентской машине и там же выполняются. Любой доступ к БД из приложения использует контакт с сервером по сети. Когда же приложение рассматривается внутри БД, оно называется хранимой командой или хранимой процедурой. Она выполняется непосредственно на компьютере сервера БД.
Хранимая команда — SQL-запрос, который хранится на сервере в скомпилированном виде. Выполнение хранимой программы производится гораздо быстрее, чем обычные SQL-запросы, однако хранение команды имеет ограниченную функциональность в рамках синтаксиса SQL.
Хранимая процедура — предложения, объединяющие SQL-запросы и процедурную логику. Хранимые процедуры позволяют хранить на сервере сложные приложения, выполняющие большой объем работы без передачи данных по сети и взаимодействия с клиентом. Хранимые процедуры обычно пишутся на автономном языке разработки конечных приложений.
Использование хранимых команд и процедур преследует следующие цели:
1) Повышение производительности;
2) Простота использования. Обычно технология, которая подразумевает большое число клиентов, подключаемых к серверу. Тогда использование хранимых команд и процедур позволяет хранить приложения на одном компьютере, а не на каждом компьютере в отдельности.
3) Усиление защищенности данных — набор операций, которые могут быть осуществлены пользователем, легко контролируются с помощью управления доступом к небольшому количеству хранимых процедур. Нормальное завершение процедуры возвращает нулевое значение в вызвавшее ее приложение. Возвращенное значение может быть найдено в специальном файле, чтобы выдать пользователю сообщение об ошибке.
Триггеры — определяемое пользователем действие, которое выполняется, когда над таблицей, к которой подключен триггер, выполняется операция INSERT, UPDATE или DELETE.
Триггеры используются для решения трех основных задач:
1) Усиление ссылочной целостности. Например, триггер можно использовать для реализации ограничений ссылочной целостности, выходящих за пределы стандартных ограничений СУБД. Пользователь может захотеть реализовать правило каскадного изменения данных. для этого необходимо создать триггер, который будет обновлять дочерние таблицы при каждом изменении колонки родительской таблицы.