Нашёл отличную статью про SQL, советую всем прочитать!
Операторы языка SQL используются во всех инструментальных
средствах разработки Informix (Informix-SQL, Informix-4GL,
Informix-ESQL/C и др.). Для каждого инструмента характерны
определенные особенности использования SQL, которые описаны в
соответствующей документации. В этом разделе даются сведения об
применении операторов SQL в среде разработки Informix-4GL.
Соглашения о языке SQL и начальные понятия.
Программа, написанная на 4GL использует предписания языка SQL
(Структурного Языка Запросов) для манипуляций с базой данных.
Формат записи операторов SQL свободный. Можно писать все подряд
на одной строке, один оператор на нескольких строках, слова
операторов можно разделять произвольным количеством пробелов и
комментариев. Никакими значками (типа

операторы разделять не
нужно. Окончание операторов определяется по контексту.
Примечание: если вы записываете предписания SQL не в программе
4GL а в среде INFORMIX-SQL, то разделять операторы точкой с
запятой (

необходимо.
Весь набор ключевых слов языка SQL зарезервирован, их нельзя
занимать для других целей (на имена объектов и переменных SQL и
4GL).
Компилятору языка безразлично, большими или маленькими буквами
пишутся операторы. Он их не различает.
Комментарии обозначаются знаками { комментарий },
или знаком -- (два знака минус) до конца строки.
Идентификаторы INFORMIX.
Идентификатор (имя объекта) - это слово, состоящее из букв,
цифр, и знаков подчеркивания (_), начинающееся с буквы или зна-
ка (_). В INFORMIX-4GL не различаются маленькие и большие бук-
вы. Поэтому i_Un1023Tt и I_UN1023TT - одно и тоже имя.
Имя базы данных не длиннее 10.
Имена прочих объектов SQL - таблиц, столбцов,
view(псевдотаблиц) , синонимов - не длиннее 18.
* Группы операторы языка SQL * .
SQL содержит 4 группы операторов:
- Операторы описания данных:
CREATE, DROP, ALTER и др.
- Операторы манипуляции данными:
INSERT, DELETE, SELECT, UPDATE и др.
- Операторы задания прав доступа в базе данных:
GRANT / REVOKE , LOCK / UNLOCK , SET LOCK MODE
- Операторы защиты, восстановления данных и прочие операторы.
Их обзором мы сейчас и займемся, по порядку.
1. ОПЕРАТОРЫ ОПИСАНИЯ ДАННЫХ * .
Операторы описания данных предназначены для описания (созда-
ния), изменения описания и уничтожения объектов базы данных.
В SQL различаются следующие виды объектов:
база данных (database);
таблица (table);
столбец (column);
индекс (index);
снимок (view);
синоним (synonym).
Каждый объект имеет собственное имя - идентификатор. Каждый
объект имеет владелеца - т.е. того пользователя, который его
создал. Имя объекта можно уточнять с помощью имени его владель-
ца (owner-name) в такой форме: moshkow.table1
Ниже приводятся примеры использования всех операторов описания
данных. Полный же их синтаксис можно найти в "Кратком
справочнике по 4GL" (см. Приложения), либо в "Справочном
руководстве по Informix-4GL".
Создание базы данных.
CREATE DATABASE zawod
В любой момент времени вы можете иметь доступ к объектами толь-
ко одной - ТЕКУЩЕЙ (CURRENT) - базы данных. Оператор DATABASE
делает новую базу текущей, закрывая при этом доступ к объектам
предыдущей текущей базы. Оператор CLOSE DATABASE просто закры-
вает текущую базу данных.
DATABASE zawod
. . . # текущей является база zawod
DATABASE stanciq
. . . # текущей является база stanciq
CLOSE DATABASE
# текущей базы нет
Создаются таблицы kadry и ceh, содержащие столбцы разных типов.
CREATE TABLE kadry (
nomerceh INT,
tabnom SERIAL ,
fio CHAR(20) UNIQUE,
zarplata MONEY(16,2),
datarovd DATE,
pribytie DATETIME year TO minute )
CREATE TABLE ceh ( nomerceh int, nameceh char(20) )
В уже существующей таблице мы можем поменять тип столбца, доба-
вить новый, уничтожить старый.
ALTER TABLE kadry ADD (dolvnostx CHAR(20) BEFORE zarplata),
DROP(pribytie), ADD CONSTRAINT UNIQUE(tabnom, fio) CONSTRAINT
tabnomfio
ALTER TABLE items MODIFY (manu_code char(4))
Изменение структуры таблицы приводит к физическому преобразова-
нию данных в ней. Если изменен тип столбца, то данные в нем
преобразуются к новому типу, и если это невозможно осуществить,
то оператор ALTER "валится" с кодом ошибки, а таблица остается
в неизмененном состоянии.
View - "псевдо" таблица, базируется на существующих таблицах.
CREATE VIEW poor AS SELECT tabnom, fio, datarovd FROM kadry
WHERE zarplata < 120
# создано view - "псевдотаблица" из трех столбцов содержащая
# строки из таблицы kadry, в которых zarplata меньше 120 рублей.
Ведет себя точно так же, как настоящая таблица, только место на
диске под нее не отводятся, поскольку данные, лежащие в ней на
самом деле хранятся в таблице, на которой это view базируется.
Индекс - дополнительная структура к столбцам таблицы, нужен для
ускорения поиска значений в столбце.
CREATE UNIQUE INDEX indkdtb ON kadry (tabnom)
# создан индекс для столбца tabnom из таблицы kadry. Индекс
# уникальный, значит в столбце не могут появиться одинаковые
# значения.
Мы можем физически упорядочить таблицу в соответствии с индек-
сом. В кластеризованной таблице SELECT работает быстрее.
ALTER INDEX indkdtb TO CLUSTER
Имена столбцов в разных таблицах могут совпадать. Если в каком
либо операторе SQL упоминаются два столбца с одинаковыми назва-
ниями, то их нужно уточнять именами таблиц, их содержащих. Пе-
ред именем любого объекта можно (а иногда и необходимо) указать
имя его владельца (owner-name) - входное имя пользователя, ко-
торый создал (CREATE) этот объект.
kadry.nomerceh # столбец nomerceh из таблицы kadry
ceh.nomerceh # столбец nomerceh из таблицы ceh
iwanow.table1.c1 # столбец c1 из таблицы table1, владель-
# цем которой является iwanow
moshkow.table1.c1 # столбец c1 из другой (!) таблицы -
# таблицы table1, владельцем которой яв-
# ляется moshkow
Синоним для имени таблицы используется для сокращения записи.
CREATE SYNONYM t1 FOR petrow.sostoqnie_postow
Теперь повсюду можно (хотя и не обязательно) вместо имени
petrow.sostoqnie_postow использовать имя t1.
База данных может иметь системный журнал транзакций (logfile).
START DATABASE zawod WITH LOG IN "/udd/moshkow/logfile/zawod"
Если нет журнала транзакций для всей базы данных, то для от-
дельных таблиц в базе с той же целью можно создать audit trail.
CREATE AUDIT FOR kadry IN "/udd/moshkow/kadry.audit"
Естественно, что любой созданный в базе данных объект можно
уничтожить. Надо только помнить, что операторы описания данных
не откатываются назад, а потому если вы уничтожили таблицу, или
базу данных то знайте, что это навсегда.
DROP VIEW poor # Уничтожается только view. С данными в табли-
# цах, на которых оно базировалось ничего не
# происходит.
DROP TABLE kadry # уничтожает таблицу вместе с данными.
DROP INDEX indkdtb
DROP SYNONYM t1
DROP DATABASE zawod # уничтожает базу вместе со всеми данными и
# системным журналом
2. Операторы задания прав доступа в базе данных.
Выдавать и забирать права доступа к таблице может владелец таб-
лицы, Администратор Базы Данных (имеющий DBA права), а так же
пользователь, которому было выдано право выдавать права (Опера-
тором GRANT WITH GRANT OPTIONS)
REVOKE ALL ON customer FROM PUBLIC
GRANT ALL ON customer TO iwanow, petrow WITH GRANT OPTION
GRANT UPDATE(fname,lname,company, sity),SELECT
ON customer TO PUBLIC
REVOKE CONNECT FROM sidorowa, root
REVOKE DBA FROM ivanov
Отобрать у вас права DBA (если вы, конечно, им являетесь) может
только другой DBA.
На время транзакции все измененные строки автоматически блоки-
руются системой от изменения (но не от просмотра). Вы можете
явно локировать всю таблицу целиком, тогда система не будет
блокировать строки по отдельности. Вы можете блокировать табли-
цу целиком не только от изменения но и от просмотра.
BEGIN WORK
LOCK TABLE kadry
. . .
UNLOCK TABLE kadry
. . .
LOCK TABLE kadry EXCLUSIVE
Если ваш оператор пытается записать в блокированную другим
пользователем строку, то оператор "сваливается". Вы можете ус-
тановить для своей программы режим "Ждать разблокирования
строк".
SET LOCK MODE TO WAIT
3. Операторы транзакций и восстановления данных.
В базе данных, не имеющей системного журнала невозможно выпол-
нение транзакций и восстановления до текущей контрольной точки.
Поскольку за все хорошее приходится платить, наличие системного
журнала у базы данных вызывает заметный рост накладных расходов
и замедление работы запросов. К тому же при активной работе
с базой системный журнал быстро "распухает". За ним нужно сле-
дить и периодически чистить.
Указать базе новый системный журнал.
START DATABASE zawod WITH LOG IN "/ARM/log/zawod"
Восстанавливают разрушенную (например из-за сбоя оборудования)
базу данных так:
В среде UNIX
1. Уничтожают остатки базы.
2. Заливают вместо них копию базы с ленты (например, недельной
давности) используя команду cpio или утилиту INFORMIX dbimport.
3. Входят в среду INFORMIX и выполняют операторы:
DATABASE kadry EXCLUSIVE # чтобы никто не лез
ROLLFORWARD DATABASE kadry # прогнать базу вперед
# по системному журналу
CLOSE DATABASE # теперь всем можно работать
Транзакция
BEGIN WORK # начать транзакцию
. . . # операторы
IF все нормально THEN COMMIT WORK
ELSE ROLLBACK WORK
END IF
Если во время транзакции программа "свалилась" то INFORMIX ав-
томатически сделает откатку.
* 4. ОПЕРАТОРЫ МАНИПУЛЯЦИИ ДАННЫМИ * .
Следующая группа операторов предназначена для манипулирования
данными в таблицах. В нее входят операторы выбора (SELECT)
строк из таблицы (или таблиц), уничтожения (DELETE) строк в
таблице, вставки (INSERT) строк, и изменения (UPDATE) значений
в существующих в таблице строках.
Оператор DELETE.
Уничтожить в таблице kadry все строки, в которых номер цеха ра-
вен 4, а фамилия кончается на буквы "ов"
DELETE FROM kadry WHERE ceh=4 AND fio MATCHES "*ов"
В результате из списков будут вычеркнуты работники 4-го цеха
"Петров", "Иванов", "Сидоров" и т.п
Как видим, INFORMIX предоставляет националистически озабоченным
руководителям мощные средства для воплощения в жизнь своих идей.
А этот оператор уничтожит ВСЕ строки в таблице kadry, владель-
цем которой является moshkow, но не саму таблицу
DELETE FROM moshkow.kadry
Простейшая форма оператора SELECT.
Первый пример находит в таблице kadry строку, в которой столбец
tabnum=345 . Из этой строки берутся только три указаных столбца.
Второй пример выбирает ВСЕ строки из таблицы ceh, и все столбцы.
SELECT fio, dolvn, zarplata FROM kadry WHERE tabnom=345
SELECT * FROM ceh
SELECT kadry.fio, ceh.nameceh WHERE kadry.nomerceh=ceh.nomerceh
Третий пример выбирает фамилии работников из таблицы кадры, а
названия цехов, в которых они работают, из таблицы ceh.
Оператор INSERT.
может вставить в таблицу одну строку, если используется в форме
INSERT INTO ... VALUES, а может вставить в таблицу целый набор
строк, выбранных подзапросом SELECT из другой таблицы.
INSERT INTO kadry VALUES (4,0,"Грицько",num,"10/25/1939",NULL)
INSERT INTO customer VALUES (ps_customer.*)
# ps_customer - переменная типа RECORD - аналог структуры в
# языке Си. Этот оператор вставляет значения элементов записи
# ps_customer в соответствующие поля таблицы customer
INSERT INTO kadry (tabnom, fio, nomerceh, dolvnostx)
SELECT 0 , fio, 4, dolvnostx FROM kadryold
WHERE nomerceh=3 AND fio IS NOT NULL
# последний оператор вставляет сразу несколько строк
Если мы хотим, чтобы при вставлении строки в столбец типа SERI-
AL автоматически заносилось очередное значение счетчика, нужно
вставлять в этот столбец константу 0.
Если не во все столбцы вставляемой строки вносится значение
(как это сделано в третьем операторе), то незаполненные столбцы
заполняются значением NULL.
В операторах DELETE, UPDATE, SELECT может присутствовать WHERE
предложение, в котором можно задать условия на строки, которые
требуется обработать (соответственно уничтожить, изменить или
выбрать). Рассмотрим примеры использования WHERE предложения.