Операторы Манипуляции Данными.
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 # последний оператор вставляет сразу несколько строк
Если мы хотим, чтобы при вставлении строки в столбец типа SERIAL автоматически заносилось очередное значение счетчика, нужно вставлять в этот столбец константу 0. Если не во все столбцы вставляемой строки вносится значение (как это сделано в третьем операторе), то незаполненные столбцы заполняются значением NULL.
В операторах DELETE, UPDATE, SELECT может присутствовать WHERE предложение, в котором можно задать условия на строки, которые требуется обработать (соответственно уничтожить, изменить или выбрать). Рассмотрим примеры использования WHERE предложения.
Оператор UPDATE.
Меняет значения столбцов, в строках, удовлетворяющим 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 из той же строки.
Предложение WHERE.
Предложение WHERE может присутствовать в любом из операторов DELETE, UPDATE, SELECT, когда нужно задать условия на строки, которые требуется обработать (соответственно, уничтожить, изменить или выбрать). Рассмотрим структуру и примеры использования предложений WHERE.
В предложении WHERE пишется логическое условие, которое получается соединением с помощью логических операторов AND, OR и NOT элементарных сравнений типа: выражение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 использует такие спецсимволы шаблона: *, ?, [, ], ^, -.
* | заменяет любое количество символов |
? | заменяет один любой символ |
[...] | заменяет один символ из перечисленных в скобках |
возможно указание от и до (-), и не (^) | |
[abH] | любой из символов a, b, H |
[^d-z] | любой символ, исключая d,e,f,g, ... ,y,z |
\ | отменяет спецсмысл спецсимволов *,?,[,] |
Если вы хотите воспользоваться спецсимволами как обычными, примените escape-char. Если escape-char="\", то \? обозначает просто символ ?, \* обозначает просто символ *, \\ обозначает просто символ \ . Зато знак кавычки (") внутри шаблона нужно обозначать двумя кавычками ("").
Выбрать все данные о заказчиках в названии компании которых вторая буква не лежит в интервале от G до L, а третья буква c. (Кстати, коды русских букв на БЕСТЕ идут подряд, но в отличие от латинских букв, русские не упорядочены по алфавиту.) SELECT * FROM customer WHERE company MATCES"?[^G-L]c*"
Выбрать все данные о заказчиках в названии компании которых присутствует вопросительный знак. SELECT * FROM customer WHERE company MATCHES "*Я?*" ESCAPE"Я"
В данном примере использовался ESC-символ "Я" для отмены спецсмысла символа "?".
Если вы хотите:
- Сравнить выражение с результатом другого SELECT оператора выраж сравн {ALL | [ANY | SOME]} (SELECT-statement)
- Определить, принадлежит ли выражение результатам другого SELECT оператора. выраж [NOT] IN (SELECT-statement)
- Выяснить, выбрал ли хоть что-нибудь другой SELECT оператор. [NOT] EXISTS (SELECT-statement)
то применяйте условия с подзапросом.
Условия с Подзапросом. SELECT fio FROM kadry WHERE zarplata= (SELECT MAX(zarplata) FROM kadry )
Здесь подзапрос возвращает единственное значение - максимальное значение зарплаты. А внешний SELECT оператор находит фамилии обладателей оной. 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)
Этот запрос (используя связанный подзапрос) выводит список всех изделий, чья общая цена не менее чем в два раза превосходит минимальную цену изделий перечисленных в этом же ордере.
Вы можете соединять любое количество вышеперечисленных условий вместе, используя логические операторы NOT, AND, OR.
Оператор UNLOAD.
Оператор UNLOAD сбрасывает данные из таблицы в файл в печатном представлении. Каждая строка преобразуется в отдельную запись, значения из столбцов разделяются символом "|".
После выполнения оператора UNLOAD TO "kadry19.unl" SELECT * FROM kadry
в файле kadry19.unl можно будет обнаружить следующее: 5|5|туев |завхоз |100.0|31.12.1946| 4|6|петунин|кладовщик|80.0 | | . . .
Оператор LOAD.
Оператор LOAD выполняет обратную операцию - считывает строки из файла и вставляет их в таблицу. Естественно, что типы и количество значений в строках файла должны соответствовать столбцам таблицы. LOAD FROM "kadry20.unl" INSERT INTO kadry