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 # уничтожает базу вместе со всеми данными и системным журналом |
DATABASE kadry EXCLUSIVE # чтобы никто не лез ROLLFORWARD DATABASE kadry # прогнать базу вперед # по системному журналу CLOSE DATABASE # теперь всем можно работать Транзакция BEGIN WORK # начать транзакцию . . . # операторы IF все нормально THEN COMMIT WORK ELSE ROLLBACK WORK END IF |
SELECT fio, dolvn, zarplata FROM kadry WHERE tabnom=345 SELECT * FROM ceh SELECT kadry.fio, ceh.nameceh WHERE kadry.nomerceh=ceh.nomerceh |
Третий пример выбирает фамилии работников из таблицы кадры, а названия цехов, в которых они работают, из таблицы ceh. 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 # последний оператор вставляет сразу несколько строк |
Если мы хотим, чтобы при вставлении строки в столбец типа SERIAL автоматически заносилось очередное значение счетчика, нужно вставлять в этот столбец константу 0. Если не во все столбцы вставляемой строки вносится значение (как это сделано в третьем операторе), то незаполненные столбцы заполняются значением NULL. В операторах DELETE, UPDATE, SELECT может присутствовать WHERE предложение, в котором можно задать условия на строки, которые требуется обработать (соответственно уничтожить, изменить или выбрать). Рассмотрим примеры использования WHERE предложения. Меняет значения столбцов, в строках, удовлетворяющим 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 ("токарный","литейный") В таблице ceh в цехах номер 3,4,5 а так же в токарном и литейном первые четыре символа в коде цеха будут заменены на подстроку поля nameceh из той же строки. выражение1 < выражение2, выражение1 >= выражение2, и т.п., а так же элементарных сравнений специального вида: column-name IS [NOT] NULL выраж [NOT] BETWEEN выраж1 AND выраж2 выраж [NOT] IN (выраж1 , ... [, ...] ) Можно выяснить, подходит ли символьная строка под определенный шаблон, или нет. Для этого используются две операции сравнения по шаблону - LIKE и MATCHES. симв-выражение MATCHES "шаблон" симв-выражение LIKE "шаблон" LIKE имеет более простой шаблон. В нем используются только два спецсимвола: (%) замещает произвольное количество символов, (_) замещает ровно один символ. Все остальные символы в шаблоне обозначают сами себя. Если мы хотим включить в шаблон % или _ отменив их специальный смысл, то перед ними надо поставить ESCсимвол (по умолчанию это (\)). Допустим нам нужно выбрать из таблицы tab8 все строки, в которых символьный столбец string1 содержит символ "+" а предпоследняя буква в нем - "Ы". Оператор выборки будет выглядеть так: SELECT * FROM tab8 WHERE string1 LIKE "%+%Ы_" MATCHES использует такие спецсимволы шаблона: *, ?, [, ], ^, -.
Если вы хотите воспользоваться спецсимволами как обычными, примените escape-char. Если escape-char="\", то \? обозначает просто символ ?, \* обозначает просто символ *, \\ обозначает просто символ \ . Зато знак кавычки (") внутри шаблона нужно обозначать двумя кавычками (""). Выбрать все данные о заказчиках в названии компании которых вторая буква не лежит в интервале от G до L, а третья буква c. (Кстати, коды русских букв на БЕСТЕ идут подряд, но в отличие от латинских букв, русские не упорядочены по алфавиту.) SELECT * FROM customer WHERE company MATCES"?[^G-L]c*" Выбрать все данные о заказчиках в названии компании которых присутствует вопросительный знак. SELECT * FROM customer WHERE company MATCHES "*Я?*" ESCAPE"Я" В данном примере использовался ESC-символ "Я" для отмены спецсмысла символа "?". Если вы хотите:
|
выраж сравн {ALL | [ANY | SOME]} (SELECT-statement) |
SELECT dolvnostx, COUNT(*), AVG(zarplata) FROM kadry GROUP BY dolvnostx |
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) Пример изменяет информацию в строках по значению ключа при выполнении условий , наложенных на меняемые строки:
В таблице cia хранятся сведения о сотрудниках. На основе последних исследований была составлена таблица agent, с поправками к содержанию cia. Строчка будет подменяться, если за новую информацию о сотруднике в таблице agent заплачено больше, чем за хранящуюся в cia. 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);
|
|