Оператор 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
* 5. СНОВА ОПЕРАТОР SELECT * .
Предложения INTO, INTO TEMP, FROM.
Выбрать все строки (нет предложения WHERE) из таблицы kadry,
взять в них все столбцы (вместо перечисления столбцов стоит *),
оставить только различные строки (ключевое слово UNIQUE) и по-
местить результат во временную таблицу (INTO TEMP) x, которая
будет при этом создана с такими же столбцами, что и у kadry.
SELECT UNIQUE * FROM kadry INTO TEMP x
Выбирать можно из нескольких таблиц. При этом берутся все воз-
можные комбинации строк из первой таблицы со второй. Предполо-
жим, что таблице tab1 6 строк а в tab2 - 7 строк. Результат ни-
жеприведенного примера - таблица, содержащая три столбца и
7*6=42 строки.
SELECT tab1.a-tab2.b, tab1.a, tab2.b FROM tab1, tab2
Мы сейчас не будем уточнять, куда именно результирующая таблица
помещается. Но использовать ее можно по разному: ее можно пе-
регнать (INTO TEMP) во временную таблицу, ее можно отдать на
обработку другому оператору (если выборку осуществлял подзап-
рос), для нее можно создать курсор ("буфер" с указателем на те-
кущую строку), а можно положить ее (INTO) в простую программную
переменную (если выбрано не более одной строки).
Выбранные строки можно упорядочить по возрастанию (убыванию)
значения в столбце (столбцах)
SELECT a,b,c,d+e FROM tabl ORDER BY b,c
SELECT a,b,c,d+e FROM tabl ORDER BY 2,3
В ORDER BY предложении вместо имени столбца можно указывать его
порядковый номер в списке выборки (select-list). Вышеприведен-
ные операторы эквивалентны.
Поместить значения из столбцов в переменные: (Поскольку lname
используется и как имя переменной, и как имя столбца, то имя
столбца предваряется знаком (@)
SELECT customer_num, @lname,city INTO cnum,lname,town
FROM customer
Агрегатные функции.
К выбранным строкам можно применять агрегатные функции COUNT(*)
- количество, MAX(column) и MIN(column) - максимальное и мини-
мальное значение в столбце, SUM(column) - сумма всех значений в
столбце, AVG(column) - среднее значение в столбце.
Поместить в переменную num количество строк в таблице orders, в
которых столбец customer_num равен 101:
SELECT COUNT(*) INTO num
FROM orders WHERE customer_num=101
Пример с использованием соединения таблиц. Находится среднее
значение зарплаты превосходящей 300 (столбец zarplata принадле-
жит одной из таблиц), при условии совпадения столбцов dolvnost
в двух таблицах.
SELECT AVG (zarplata) FROM table1,table2
WHERE table1.dolvnost=table2.dolvnost and zarplata>300
Группировка GROUP BY.
Группировка используется для для "сплющивания" группы (строк) в
одну.
Результат запроса содержит одну строку для каждого множества
строк, удовлетворяющих WHERE предложению и содержащих одно и то
же значение в указанном столбце.
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
Этот запрос возвращает номера ордеров и среднее значение
total_price в заявках для всех ордеров, имеющих не менее двух
заявок.
Внешнее соединение таблиц.
Строки из таблицы, присоединенной внешним образом (на внешнее
соединение указывает ключевое слово OUTER) будут выбираться не
смотря на то, удовлетворяют они условиям WHERE предложения или
нет. В некоторых случаях это полезно, когда у вас есть главная
таблица и есть вспомогательная, и данные из главной таблицы вам
нужно получить в любом случае. Пример внешнего соединения:
SELECT company, order_num
FROM customer c, OUTER orders o
WHERE c.customer_num=o.customer_num
Запрос находит названия компаний и номера ордеров, которые они
послали. Если же компания ордеров не присылала, то ее название
все равно будет выбрано, а номер ордера в этой строке будет ра-
вен NULL. (А если бы мы запустили запрос без параметра OUTER,
то названия этих компаний вообще бы не попали в выборку.)
6. СЛОЖНЫЕ ПРИМЕРЫ МАНИПУЛЯЦИИ ДАННЫМИ * .
Операторы манипуляции данными - самая мощная составляющая SQL.
Следующий пример ликвидирует одинаковые строки в таблице kadry.
select unique * from kadry into temp kd
delete from kadry where 1=1
insert into kadry select * from kd
drop table kd
Следующий пример изменяет информацию в строках по значению
ключа
Tаблица b содержит (kl int, pole char(20));
причем все kl различны
В таблице kadry заменить kadry.dolvnostx на b.pole
в строках где kadry.tabnom=b.kl
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 | har | cen| |fio | . . . har | . . . cen|
|John |лентяй |$300| |John | трудяга | $600|
|Piter|агент КГБ| | . . .
|Bob |хороший |$25 | |Piter| агент CIA| $45 |
+-----+---------+----+ . . .
|Bob | плохой | $15 |
|Ronny| плохой | |
. . .
+-----+ ---------+ ----+
В таблице 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);
Взято:
http://www.codenet.ru/