Программа, написанная на 4GL
использует предписания языка SQL
(Структурного Языка Запросов) для
манипуляций с базой данных.
Формат записи операторов SQL
свободный. Можно писать все подряд
на одной строке, один оператор на
нескольких строках, слова
операторов можно разделять
произвольным количеством пробелов
и комментариев. Никакими значками
(типа ;) операторы разделять не
нужно. Окончание операторов
определяется по контексту.
Примечание: если вы записываете
предписания SQL не в программе 4GL а в
среде INFORMIX-SQL, то разделять
операторы точкой с запятой (;)
необходимо.
Весь набор ключевых слов языка SQL
зарезервирован, их нельзя занимать
для других целей (на имена объектов
и переменных SQL и 4GL).
Компилятору языка безразлично,
большими или маленькими буквами
пишутся операторы. Он их не
различает.
Комментарии обозначаются знаками {
комментарий }, или знаком --
(два знака минус) до конца строки.
Идентификатор (имя объекта) - это
слово, состоящее из букв, цифр, и
знаков подчеркивания (_),
начинающееся с буквы или знака (_). В
INFORMIX-4GL не различаются маленькие и
большие буквы. Поэтому i_Un1023Tt и
I_UN1023TT - одно и тоже имя.
Имя базы данных не длиннее 10.
Имена прочих объектов SQL - таблиц,
столбцов, view (псевдотаблиц) ,
синонимов - не длиннее 18.
SQL содержит 4 группы операторов:
CREATE DATABASE zawod
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))
CREATE VIEW poor AS SELECT tabnom, fio, datarovd FROM kadry WHERE zarplata < 120 # создано view - "псевдотаблица" из трех столбцов содержащая # строки из таблицы kadry, в которых zarplata меньше 120 рублей.
CREATE UNIQUE INDEX indkdtb ON kadry (tabnom) # создан индекс для столбца tabnom из таблицы kadry. Индекс # уникальный, значит в столбце не могут появиться одинаковые # значения.
ALTER INDEX indkdtb TO CLUSTER
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
START DATABASE zawod WITH LOG IN "/udd/moshkow/logfile/zawod"
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 # уничтожает базу вместе со всеми данными и системным журналом
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
BEGIN WORK LOCK TABLE kadry . . . UNLOCK TABLE kadry . . . LOCK TABLE kadry EXCLUSIVE
SET LOCK MODE TO WAIT
START DATABASE zawod WITH LOG IN "/ARM/log/zawod"
Восстанавливают разрушенную
(например из-за сбоя оборудования)
базу данных так:
В среде UNIX
DATABASE kadry EXCLUSIVE # чтобы никто не лез ROLLFORWARD DATABASE kadry # прогнать базу вперед # по системному журналу CLOSE DATABASE # теперь всем можно работать
BEGIN WORK # начать транзакцию . . . # операторы IF все нормально THEN COMMIT WORK ELSE ROLLBACK WORK END IF
Если во время транзакции программа
"свалилась" то INFORMIX
автоматически сделает откатку.
DELETE FROM kadry WHERE ceh=4 AND fio MATCHES "*ов"
DELETE FROM moshkow.kadry
Простейшая форма оператора SELECT.
SELECT fio, dolvn, zarplata FROM kadry WHERE tabnom=345 SELECT * FROM ceh SELECT kadry.fio, ceh.nameceh WHERE kadry.nomerceh=ceh.nomerceh
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 # последний оператор вставляет сразу несколько строк
Меняет значения столбцов, в строках, удовлетворяющим WHERE условию.
UPDATE kadry SET fio="Зыкова" WHERE fio="Гирусова" UPDATE ceh SET kod_ceha[1,4]=nameceh[5,8] WHERE nomerceh BETWEEN 3 AND 5 OR nameceh IN ("токарный","литейный")
выражение1 <выражение2, выражение1>= выражение2, и т.п.,
а так же элементарных сравнений
специального вида:
column-name IS [NOT] NULL выраж [NOT] BETWEEN выраж1 AND выраж2 выраж [NOT] IN (выраж1 , ... [, ...] )
симв-выражение MATCHES "шаблон" симв-выражение LIKE "шаблон"
SELECT * FROM tab8 WHERE string1 LIKE "%+%Ы_"
MATCHES использует такие спецсимволы
шаблона: *, ?, [, ], ^, -.
SELECT * FROM customer WHERE company MATCES"?[^G-L]c*"
Выбрать все данные о заказчиках в
названии компании которых
присутствует вопросительный знак.
SELECT * FROM customer WHERE company MATCHES "*Я?*" ESCAPE"Я"
В данном примере использовался
ESC-символ "Я" для отмены
спецсмысла символа "?".
выраж сравн {ALL | [ANY | SOME]} (SELECT-statement)
выраж [NOT] IN (SELECT-statement)
[NOT] EXISTS (SELECT-statement)
то применяйте условия с
подзапросом.
SELECT fio FROM kadry WHERE zarplata= (SELECT MAX(zarplata) FROM kadry )
SELECT fio, shifr, organizaciq FROM zaqwki WHERE denxgi_rek is not NULL and gorod in (SELECT gorod FROM regiony WHERE region="Урал")
Здесь запрос выводит данные об
руководителях, получивших
финансирование и работающих на
Урале.
SELECT order_num,stock_num,manu_code, total_price FROM items x WHERE total_price > (SELECT 2*MIN(total_price) FROM items WHERE order_num=x.order_num)
UNLOAD TO "kadry19.unl" SELECT * FROM kadry
в файле kadry19.unl можно будет
обнаружить следующее:
5|5|туев |завхоз |100.0|31.12.1946| 4|6|петунин|кладовщик|80.0 | | . . .
LOAD FROM "kadry20.unl" INSERT INTO kadry
Предложения INTO, INTO TEMP, FROM.
SELECT UNIQUE * FROM kadry INTO TEMP x
SELECT tab1.a-tab2.b, tab1.a, tab2.b FROM tab1, tab2
SELECT a,b,c,d+e FROM tabl ORDER BY b,c SELECT a,b,c,d+e FROM tabl ORDER BY 2,3
SELECT customer_num, @lname,city INTO cnum,lname,town FROM customer
SELECT COUNT(*) INTO num FROM orders WHERE customer_num=101
SELECT AVG (zarplata) FROM table1,table2 WHERE table1.dolvnost=table2.dolvnost and zarplata>300
SELECT dolvnostx, COUNT(*), AVG(zarplata) FROM kadry GROUP BY dolvnostx
Получить количество работающих и
их среднюю зарплату по каждой
должности из штатного расписания.
SELECT dolvnostx, COUNT(*), AVG(zarplata) FROM kadry GROUP BY 1
Эквивалентная запись.
Предложение HAVING накладывает
дополнительные условия на группу.
SELECT order_num, AVG(total_priece) FROM items GROUP BY order_num HAVING COUNT(*) > 2
SELECT company, order_num FROM customer c, OUTER orders o WHERE c.customer_num=o.customer_num
select unique * from kadry into temp kd delete from kadry where 1=1 insert into kadry select * from kd drop table kd
Следующий пример изменяет
информацию в строках по значению
ключа:
SELECT b.kl,b.pole, nomerceh,dolvnostx,zarplata,datarovd FROM kadry, b WHERE kadry.tabnom=b.kl into temp kd DELETE FROM kadry WHERE tabnom in (SELECT kl FROM b) INSERT INTO kadry SELECT * FROM kd DROP TABLE kd
Ту же самую операцию можно
проделать с помощью одного
оператора UPDATE, использующего
подзапрос:
UPDATE kadry SET dolvnostx=(select pole from b where kadry.tabnom=b.kl) WHERE tabnom IN (select kl from b)
## | ||||||||
Таблица agent | Таблица cia | |||||||
---|---|---|---|---|---|---|---|---|
fio John Piter Bob |
har лентяй агент КГБ хороший |
cen $300 $25 |
fio John ... Piter ... Bob Ronny ... |
... | har трудяга агент CIA плохой плохой |
... | cen $600 $45 $15 |
|
UPDATE cia SET (har,cen)=( (SELECT har,cen FROM agent WHERE cia.fio=agent.fio) ) WHERE fio IN (SELECT fio FROM agent) AND cen <(SELECT cen FROM agent WHERE cia.fio="agent.fio);"
Назад || Оглавление || Вперед