Партнерка на США и Канаду по недвижимости, выплаты в крипто
- 30% recurring commission
- Выплаты в USDT
- Вывод каждую неделю
- Комиссия до 5 лет за каждого referral
Фактически, оператор выполняется следующим образом: последовательно просматриваются все строки таблицы T, и те строки, для которых результатом вычисления условия выборки является true, удаляются из таблицы T. При отсутствии раздела WHERE удаляются все строки таблицы T (обычно при выполнении поискового оператора DELETE без раздела WHERE в интерактивном режиме до удаления всех строк запрашивается подтверждение правильности такого действия).
Оператор поисковой модификации
Оператор обладает следующим синтаксисом:
<update statement: searched> ::=
UPDATE <table name>
SET <set clause: searched>
[{, <set clause: searched>}. . . ]
[WHERE <search conditions>]
<set clause: searched> ::=
<object column: searched> =
{ <value expression> | NULL }
<object column: searched> ::= <column name>
Таблица T, указанная в операторе UPDATE, должна быть изменяемой. На поиск накладывается то условие, что на столбцы таблицы T не должны содержаться ссылки ни в как ом вложенном подзапросе предикатов раздела WHERE.
Оператор фактически выполняется следующим образом: таблица T последовательно просматривается, и каждая строка, для которой результатом вычисления условия поиска является true, изменяется в соответствии с разделом SET. Если арифметическое выражение в разделе SET содержит ссылки на столбцы таблицы T, то при вычислении арифметического выражения используются значения столбцов текущей строки до их модификации.
Операторы окончания транзакции
Текущая транзакция может быть завершена успешно (с фиксацией в базе данных произведенных изменений) путем выполнения оператора COMMIT WORK или аварийно (с удалением из базы данных изменений, произведенных текущей транзакцией) путем выполнения оператора ROLLBACK WORK. При выполнении любого из этих операторов производится принудительное закрытие всех курсоров, открытых к моменту выполнения оператора завершения транзакции.
Глава 4. Динамический SQL в Oracle
Описанный в стандарте SQL набор операторов SQL предназначен для встраивания в программу на обычном языке программирования. Поэтому в этом наборе перемешаны операторы "истинного " реляционного языка запросов (например оператор удаления из таблицы части строк, удовлетворяющих заданному условию) и операторы работы с курсорами, позволяющими обеспечить построчный доступ к таблице-результату запроса.
Понятно, что в диалоговом режиме набор операторов SQL и их синтаксис должен быть несколько другим. Весь вопрос состоит в том, как реализовывать такую диалоговую программу. Правила встраивания стандартного SQL в программу на обычном языке программирования предусматривают, что вся информация, касающаяся операторов SQL, известна в статике (за исключением значений переменных, используемых в качестве констант в операторах SQL). Не предусмотрены стандартные средства компиляции с последующим выполнением операторов, которые становятся известными только во время выполнения (например вводятся с терминала). Поэтому, опираясь только на стандарт, невозможно реализовать диалоговый монитор взаимодействия с БД на языке SQL или другую прикладную программу, в которой текст операторов SQL возникает во время выполнения, т. е. фактически так или иначе стандарт необходимо расширять.
Один из возможных путей расширения состоит в использовании специальной группы операторов, обеспечивающих динамическую компиляцию (во время выполнения прикладной программы) базового подмножества операторов SQL и поддерживающих их корректное выполнение.
4.1 Динамический SQL в стандарте SQL/92
Набор операторов динамического SQL в стандарте SQL/92 существенно шире того, который был реализован в Oracle V. 6. В основном это связано с тем, что введены операторы для работы с дескрипторами, а также появились подготавливаемые операторы позиционного удаления и позиционной модификации.
Оператор выделения памяти под дескриптор
Оператор имеет следующий синтаксис:
<allocate descriptor statement> ::=
ALLOCATE DESCRIPTOR <descriptor name>
[WITH MAX <occurrences>]
<occurences> ::= <simple value specification>
<descriptor name> ::=
[<scope option>] <simple value specification>
<scope option> ::= GLOBAL | LOCAL
<simple value specification> ::=
<parameter name>
| <embedded variable name>
| <literal>
Дескриптор - это динамически выделяемая часть памяти прикладной программы, служащая для принятия информации о результате или параметрах динамически подготовленного оператора SQL или задания параметров такого оператора. Смысл того, что для выделения памяти используется оператор SQL, а не просто стандартная функция alloc или какая-нибудь другая функция динамического запроса памяти, состоит в том, что прикладная программа может теперь не знать структуру дескриптора и даже его адрес. Это позволяет не привязывать SQL к особенностям какой-либо системы программирования или ОС. Все обмены информацией между собственно прикладной программой и дескрипторами производятся также с помощью специальных операторов SQL (GET и SET, см. ниже).
Далее возникает вопрос: зачем вообще выделять память под дескрипторы динамически? Это нужно потому, что в общем случае прикладная программа, использующая динамический SQL, не знает в статике число одновременно действующих динамических операторов SQL, описание которых может потребоваться. С этим же связано то, что имя дескриптора может задаваться как литеральной строкой символов, так и через строковую переменную включающего языка, т. е. его можно генерировать во время выполнения программы. В операторе ALLOCATE DESCRIPTOR, помимо прочего, может указываться число описательных элементов, на которое он рассчитан. Если, например, при выделении памяти под дескриптор в разделе WITH MAX указано целое положительное число N, а потом дескриптор используется для описания M (M>N) элементов (например M столбцов результата запроса), то это приводит к возникновению исключительной ситуации.
Типы данных
Появилась возможность использования типа данных символьных строк переменной длины (т. е. при спецификации столбца указывается предельно допустимый размер хранимой строки в символах, а реально в базе данных хранится ровно столько символов, сколько их ввел пользователь). Введены типы данных битовых строк постоянной и переменной длины ( как они реально хранятся в базе данных, в стандарте не определяется). Наконец, стандартизованы темпоральные типы данных DATE (дата), TIME (время) и INTERVAL (временной интервал).
Интернационализация и национализация
При определении схемы базы данных или впоследствии можно определить особенности национального набора символов, включая правила упорядочения. Могут определяться наборы символов, используемые как в хранимых текстовых строках, так и в идентификаторах.
4.2 ОПРЕДЕЛЕНИЕ СХЕМЫ БД И МАНИПУЛИРОВАНИЕ СХЕМОЙ БД
Наконец-то появилась возможность создавать хранимые и представляемые таблицы и задавать или удалять привилегии доступа (операторы CREATE TABLE, CREATE VIEW, GRANT, REVOKE) в любой момент времени в любой транзакции вне оператора определения схемы. Появились операторы уничтожения таблиц (DROPTABLE и DROP VIEW), которые также можно выполнять внутри любой транзакции(при наличии соответствующих привилегий). Вообще, следует заметить, что в стандарте SQL/92 для любого оператора класса CREATE существует парный оператор класса DROP. Специфицирован также оператор ALTER TABLE, позволяющий динамически изменять характеристики ранее созданной таблицы (в частности добавлять к ней новые столбцы). Все упомянутые здесь операторы могут включаться в модуль SQL.
Ограничения целостности
В добавление к возможностям SQL определения ограничений целостности на уровне столбца и/или таблицы в SQL/92 допустимо отдельное определение ограничений, распространяющееся в общем случае на несколько таблиц.
Появилась возможность определения отложенных (проверяемых при завершении транзакции) ограничений целостности.
Расширены возможности определения ограничений внешнего ключа (ограничений ссылочной целостности).
Введены средства определения (CREATE DOMAIN), изменения (ALTER DOMAIN)и отмены определения (DROP DOMAIN) домена. (Домены имеют непосредственную связь с ограничениями целостности, поскольку домен определяет потенциально возможное множество значений некоторого типа данных, а при определении столбца таблицы можно указать, к какому домену будут относиться значения этого столбца. Тем самым другие значения допускаться не должны. )
Представления
В стандарте SQL/92 осмысленно ослаблены требования к изменяемым представлениям(в условии выборки допускаются подзапросы, не корелирующие со столбцами таблицы разделы FROM основного запроса). Заметим, что множество изменяемых запросов SQL/92 по-прежнему не включает все представления, которые теоретически являются изменяемыми.
Уточнен смысл конструкции WITH CHECK OPTION: введены ключевые слова LOCAL и CASCADE. При указании LOCAL контролируется, что измененная строка останется видимой в том представлении, для которого выполнялся оператор UPDATE. Если же указывается CASCADE, то изменение должно остаться видимым в данном представлении и во всех представлениях, которые определены над исходным представлением.
Табличные выражения
Появились возможности именования столбцов результирующей таблицы и самой таблицы. Именованные табличные выражения можно использовать, в частности, в разделе FROM запросов.
Появился новый класс табличных выражений, называемых "табличными выражениями с соединениями " (join-table-expression), которые можно использовать только в разделе FROM. Такие табличные выражения строятся на основе базовых и/или представляемых таблиц на основе использования разных видов операции соединения: CROSS JOIN (Декартово произведение), INNER (обычное соединение), LEFT и LEFT OUTER (левое и левое внешнее соединение), RIGHT и RIGHT OUTER (правое и правое внешнее соединение), FULL и FULL JOIN (полное и полное внешнее соединение) и UNION (объединение).
Выражения запросов
При построении выражений запросов (формально, согласно синтаксису SQL/92, соответствующие конструкции не называются выражениями запросов; тем не менее мы предпочитаем сохранить этот термин для сближения с семантикой SQL), кроме операции теоретико-множественного объединения UNION, которая присутствовала в SQL, стало возможным использовать операции EXCEPT (теоретико-множественное вычитание) и INTERSECT (теоретико-множественное пересечение). Заметим для точности, что возможность получения в качестве результата запроса мультимножества строк (т. е. с дубликатами) не позволяет однозначно интерпретировать сразу все эти операции. Поэтому результат одного и того же выражения запросов в разных реализациях может быть разным.
Курсоры
При определении курсора можно указывать ключевые слова SCROLL и INSENSITIVE. Указание SCROLL означает, что курсор можно явно позиционировать: на первую строку результирующего множества запроса, на последнюю строку, на строку с позицией с положительным или отрицательным смещением от текущей строки, на строку с явно указанным абсолютным номером позиции. Наличие ключевого слова INSENSITIVE означает, что какие бы изменения в базовых таблицах не производились в той же транзакции, в которой определен курсор, они не должны влиять на результирующее множество строк курсора после его открытия. Заметим, что, хотя внешне эти возможности выглядят очень привлекательно, их реализация стоит недешево. И в том и в другом случае требуется явное и почти всегда полное построение результирующего множества запроса, связанного с курсором.
Управление транзакциями и уровни изоляции
Известно, что в большинстве SQL-ориентированных реляционных СУБД поддерживаются несколько режимов изолированности транзакций. В стандарте SQL/92 специфицирован оператор SET TRANSACTION, который, в частности, позволяет явно установить один из следующих режимов, влияющих на уровень изолированности транзакции: READ UNCOMMITTED, READ COMMITTED, REPEATABLE READ, SERIALIZABLE. В соответствии со стандартом режим READ UNCOMMITTED допускает наличие чтения "грязных данных " (если транзакция T1 работает в этом режиме, то она может прочитать данные, обновленные транзакцией T2, которая заканчивается откатом; эти данные "грязные ", поскольку никогда не будут существовать в БД). При установке режима READ COMMITTED транзакция не сможет прочитать "грязные данные ", но в ней может возникнуть ситуация "неповторяющегося чтения " (пусть транзакция T1 работает в этом режиме и в ней выполняется выборка некоторой строки некоторой таблицы; после этого в транзакции T2срабатывает оператор, обновляющий эту строку; теперь в транзакции T1 снова выполняется оператор, выбирающий ту же строку, и прикладная программа или интерактивный пользователь с удивлением обнаруживают, что значения полей строки изменились). Если устанавливается режим REPEATABLE READ, "неповторяющиеся чтения "должны гарантированно отсутствовать, но возможно возникновение "строк-фантомов ". При установке режима SERIALIZABLE должно гарантироваться отсутствие всех перечисленных выше эффектов. В этом случае транзакция должна выполняться так, как если бы она выполнялась в отсутствии всех конкурирующих транзак-ций. В соответствии со стандартом режим SERIALIZABLE должен являться режимом, устанавливаемым для транзакции по умолчанию (если в ней не встречается какой-либо оператор SET TRANSACTION). Кроме указания режима изоляции в операторе SET TRANSACTION можно указать, является ли транзакция только читающей базу данных (READ ONLY) или обновляющей(READ WRITE). По умолчанию любая транзакция считается обновляющей, если только не задан режим изоляции READ UNCOMMITTED. В последнем случае транзакция полагается только читающей. Другими словами, комбинация READ WRITE и READUNCOMMITTED является недопустимой.
ВСТРОЕННЫЙ В ORACLE SQL
Cтандарт SQL формально не включал раздел, посвященный встраиванию конструкций SQL в программу на традиционном языке программирования. Этот раздел являлся приложением и, кроме того, не включал правил встраивания для языков Си и Ада. В SQL/92 полностью специфицированы правила встраивания для наиболее распространенных языков программирования(Ада, Си, Кобол, Фортран, MUMPS, Паскаль, ПЛ/1).
Глава 5, SQL-3 в Оракл
5.1 Сводка новых возможностей SQL-3
В стандарте SQL/92 по сравнению со стандартом SQL/89 язык был расширен главным образом количественно, хотя даже этих количественных расширений оказалось достаточно для того, чтобы стандарт SQL/92 не удалось полностью реализовать до сих пор в большинстве коммерческих СУБД. Поскольку SQL/92 не удовлетворял значительной части претензий, исторически предъявляемых к языку SQL, был сформирован новый комитет, который должен выработать стандарт языка с качественными расширениями. Язык SQL-3 пока не сформирован полностью, многие аспекты продолжают обсуждаться. Поэтому к приводимой здесь сводке возможностей нужно относиться как к сугубо предварительной.
5.2 Типы данных
Набор встроенных типов данных предполагается расширить типами BOOLEAN и ENUMERATED. Хотя по причине поддержки неопределенных значений языку SQL свойственно применение трехзначной логики, тип BOOLEAN содержит только два возможных значения true и false. Для представления значения unknown рекомендуется использовать NULL, что, конечно, не вполне естественно. Перечисляемый тип ENUMERATED обладает свойствами, подобными свойствам перечисляемых типов в языках программирования. Расширены возможности работы с неопределенными значениями. Появился новый оператор CREATE NULL CLASS, позволяющий ввести именованный набор именованных неопределенных значений. При определении домена можно явно указать имя класса неопределенных значений, появление которых допустимо в столбцах, связанных с этим доменом. Смысл каждого неопределенного значения интерпретируется на уровне пользователей. Предполагается включение в язык возможности использования определенных пользователями типов данных. Видимо, будут иметься возможности определения абстрактных типов данных с произвольно сложной внутренней структурой на основе таких традиционных возможностей агрегирования и структуризации как LIST, ARRAY, SET, MULTISET и TUPLE, а также возможности определения объектных типов с соответствующими методами в стиле объектно-ориентированного подхода. Появляется возможность использования принципов наследования свойств существующей таблицы (супертаблицы) при определении новой таблицы (подтаблицы). Подтаблица наследует от супертаблицы все определения столбцов и первичного ключа. Другая возможность - создать таблицу, "подобную" существующей в том смысле, что в новой таблице наследуются определения некоторых столбцов существующей таблицы. Одной из проблем реализации языка SQL всегда являлась проблема распознавания "изменяемости" соединений. Как известно, если представление включает соединение общего вида, то теоретически невозможно определить, можно ли однозначно интерпретировать операции обновления такого представления. Однако существует несколько важных классов соединений, которые заведомо являются изменяемыми. В SQL-3 предполагается выделить эти классы с помощью специальных синтаксических конструкций. Наконец-то появляется возможность определения триггеров как комбинации спецификаций события и действия. Действие определяется как SQL-процедура, в которой могут использоваться как операторы SQL, так и ряд управляющих конструкций. На самом деле, этот механизм очень близок к тому, который реализован в Oracle V.7. Что касается управления транзакциями, то происходит возврат к старой идее System R о возможности установки внутри транзакции точек сохранения (savepoints). В операторе ROLLBACK можно указать идентификатор ранее установленной точки сохранения, и тогда будет произведен откат транзакции не к ее началу, а к этой точке сохранения. Как видно, можно ожидать наличия в SQL-3 многих интересных и полезных возможностей. Однако даже промежуточные проекты стандарта включают почти в два раза больше страниц, чем стандарт SQL/92. Поэтому трудно ожидать быстрой реализации этого стандарта после его принятия (а многие вообще сомневаются, что этот стандарт будет когда-либо реализован).
5.3 Примеры реализации
Оператор SELECT как основа SQL
Оператор SELECT - выражение для получения результирующего набора из таблиц БД. Формируется запрос при помощи оператора SELECT, а он, в свою очередь, выполнив свою работу, возвращает результирующий набор данных. Возвращаются эти данные в виде таблицы, которая в свою очередь, может быть обработана следующим оператором SELECT и т. д.
Рассмотрим сам оператор и его синтаксис. Согласно стандарту SQL92:
SELECT -- ALL ------- схема, столбец ----
-- DISTINCT*
FROM -- схема, таблица.. ---
WHERE -- условие поиска -------
GROUP BY -- схема, столбец ----
HAVING -- условие поиска -------
ORDER BY -- спецификатор сортировки
Первое правило, само выражение SELECT обязательно включает, выражение FROM. Остальные выражения используются по мере необходимости. Выражение SELECT включает в себя список столбцов возвращаемых запросом. Выражение FROM включает в себя список таблиц для выполнения запроса. Выражение WHERE устанавливает условие поиска, если необходимо вернуть не все строки, а только ту часть, которая описана условием, поиска. Выражение GROUP BY позволяет создать итоговой запрос, разбитый на группы. Выражение HAVING определяет условие возврата групп и используется только совместно с GROUP BY. Выражение ORDER BY определяет порядок сортировки результирующего набора данных. Вот вкратце, как устроен оператор SELECT. Пока еще не все понятно, но в процессе разберемся!
Для начала давайте, выполним простой запрос, который возвращает, все записи (это обуславливает оператор * ) из таблицы OFFICES. Наш запрос будет выглядеть так:
Выбрать все записи из таблицы OFFICES.
SELECT *(все!) FROM OFFICES
---
SQL> SELECT * FROM OFFICES
OFFICE CITY REGION MGR TARGET
11 Красный Мотоцикл Восток ,637
12 Чугуевск Восток ,044
13 Бубурино Восток ,911
21 Котрогайка Запад ,915
Результат несколько не нагляден вследствие того, что столбец CITY не попадает в формат вывода SQL Plus, это легко исправить, введя предикат COL CITY FORMAT A16. Таким образом, в начале каждого запроса можно отфарматировать каждый столбец.
Итак снова выполним:
SELECT *(все!) FROM OFFICES
SQL> COL CITY FORMAT A16
SQL> SELECT * FROM OFFICES
OFFICE CITY REGION MGR TARGET SALES
----
22 Спб. Запад ,042
11 Красный Мотоцикл Восток ,637
12 Чугуевск Восток ,044
13 Бубурино Восток ,911
21 Котрогайка Запад ,915
Запрос вернул шесть столбцов и пять строк.
SELECT TABLE_NAME(выбираем одно поле!) FROM USER_TABLES(из таблицы USER_TABLES!)
-------
SQL> SELECT TABLE_NAME FROM USER_TABLES
TABLE_NAME
BOYS
CUSTOMERS
GIRLS
OFFICES
ORDERS
PRODUCTS
SALESREPS
7 строк выбрано.
Теперь выбраем еще несколько запросов.
------
SQL> SELECT CITY, TARGET, SALES FROM OFFICES
CITY TARGET SALES
-
Спб. ,042
Красный Мотоцикл ,637
Чугуевск ,044
Бубурино ,911
Котрогайка ,915
Вернули список офисов с их плановыми и фактическими, объемами продаж.
------
SQL> SELECT CITY, TARGET, SALES
2 FROM OFFICES
3 WHERE REGION = 'Запад'
CITY TARGET SALES
-
СПб. ,042
Котрогайка ,915
Вернули список офисов расположенных в западном регионе с их плановыми и фактическими, объемами продаж.
------
SQL> SELECT CITY, TARGET, SALES
2 FROM OFFICES
3 WHERE REGION = 'Запад'
4 AND SALES > TARGET
5 ORDER BY CITY
CITY TARGET SALES
-
Котрогайка ,915
Вернули список офисов расположенных в западном регионе где фактические объемы продаж, превысили плановые и отсортировать их в алфавитном порядке, по названию городов
------
SQL> SELECT AVG(TARGET), AVG(SALES)
2 FROM OFFICES
3 WHERE REGION = 'Запад'
4 /
AVG(TARGET) AVG(SALES)
512,5 510,9785
Оператор INSERT
Оператор INSERT, служит для заполнения таблиц БД данными и является достаточно простым в использовании. Давайте посмотрим, на синтаксис оператора INSERT:
INSERT INTO --- таблица -------
(имя столбца таблицы) ----
VALUES --- (выражение);
оператор выбора
Cоздадим таблицу PEOPLE с новыми параметрами:
CREATE TABLE PEOPLE
(
ID NUMBER PRIMARY KEY,
NM VARCHAR2(50),
FM VARCHAR2(50),
OT VARCHAR2(50)
)
Получаем:
SQL> CREATE TABLE PEOPLE
2 (
3 ID NUMBER PRIMARY KEY,
4 NM VARCHAR2(50),
5 FM VARCHAR2(50),
6 OT VARCHAR2(50)
7 )
Обратите внимание на поле ID таблицы PEOPLE! Оно имеет атрибут PRIMARY KEY, то есть является первичным ключом таблицы. В него можно записывать только отличные друг от друга значения. И это поле не принимает значения типа NULL! Теперь, применив оператор INSERT, согласно его синтаксического разбора введем в таблицу шесть значений:
INSERT INTO PEOPLE(ID, NM, FM, OT)
VALUES(1, 'John', 'Godwin', 'Petrovich')
INSERT INTO PEOPLE(ID, NM, FM, OT)
VALUES(2, 'Bob', 'Doris', 'Martovich')
/
INSERT INTO PEOPLE(ID, NM, FM, OT)
VALUES(3, 'Frank', 'Black', 'Milleniumich')
INSERT INTO PEOPLE(ID, NM, FM, OT)
VALUES(4, 'Pupkin', 'Misha', 'Semenovich')
INSERT INTO PEOPLE(ID, NM, FM, OT)
VALUES(5, 'Pistoletov', 'Makar', 'Patronovich')
INSERT INTO PEOPLE(ID, NM, FM, OT)
VALUES(6, 'Avtomatov', 'Kolya', 'Pricelovich')
COMMIT
Получаем:
SQL> INSERT INTO PEOPLE(ID, NM, FM, OT)
2 VALUES(1, 'John', 'Godwin', 'Petrovich')
3 /
SQL> INSERT INTO PEOPLE(ID, NM, FM, OT)
2 VALUES(2, 'Bob', 'Doris', 'Martovich')
SQL> INSERT INTO PEOPLE(ID, NM, FM, OT)
2 VALUES(3, 'Frank', 'Black', 'Milleniumich')
SQL> INSERT INTO PEOPLE(ID, NM, FM, OT)
2 VALUES(4, 'Pupkin', 'Misha', 'Semenovich')
SQL> INSERT INTO PEOPLE(ID, NM, FM, OT)
2 VALUES(5, 'Pistoletov', 'Makar', 'Patronovich')
SQL> INSERT INTO PEOPLE(ID, NM, FM, OT)
2 VALUES(6, 'Avtomatov', 'Kolya', 'Pricelovich')
В части INTO PEOPLE(ID, NM, FM, OT) оператора INSERT указаны поля в порядке ввода данных, если есть необходимость порядок следования полей можно изменить или вообще исключить некоторые из них. В части VALUES(6, 'Avtomatov', 'Kolya', 'Pricelovich') оператора INSERT указаны собственно данные для ввода. Вот так работает оператор INSERT.
В результате таблица PEOPLE получила шесть записей. А что, если у вас есть данные, которые быстро нужно загрузить не путая с тем, что уже было в таблице. Для этого можно применить оператор INSERT с выражением SELECT. Создадим промежуточную таблицу и перебросим содержимое основной в нее:
CREATE TABLE OLD_PEOPLE
(
ID NUMBER PRIMARY KEY,
NM VARCHAR2(50),
FM VARCHAR2(50),
OT VARCHAR2(50)
)
Получаем: SQL> CREATE TABLE OLD_PEOPLE 2 ( 3 ID NUMBER PRIMARY KEY, 4 NM VARCHAR2(50), 5 FM VARCHAR2(50), 6 OT VARCHAR2(/ Таблица создана. SQL> COMMIT 2 / Фиксация обновлений завершена.
Теперь применяя INSERT с выражением, перегрузим данные в новую таблицу:
INSERT INTO OLD_PEOPLE
SELECT * FROM PEOPLE
Получаем:
SQL> INSERT INTO OLD_PEOPLE
2 SELECT * FROM PEOPLE
Таким образом, мы рассмотрели первый из трех основных операторов, INSERT.
Оператор UPDATE.
Данные в таблицах БД изменяются с помощью оператора UPDATE. Синтаксис этого оператора таков:
UPDATE таблица SET ----
имя столбца -- = -- выражение ----
WHERE ------ условие -----
Синтаксически все довольно просто, как видим, в операторе UPDATE так же присутствует предложение WHERE, а следовательно, применимы все правила получения результирующего набора. Давайте посмотрим на практике, что можно сделать с таблицей с помощью оператора UPDATE.
Например, введите примерно следующее:
UPDATE PEOPLE
SET NM = 'IVAN'
Получаем:
SQL> UPDATE PEOPLE
2 SET NM = 'IVAN'
Состояние таблицы PEOPLE:
SELECT * FROM PEOPLE
Вывод:
SQL> SELECT * FROM PEOPLE
ID NM FM OT
-------
2 IVAN NULL Martovich
3 IVAN Black NULL
Изменились все записи, хоть их всего то и две. Именно так и должно быть - мы не указали UPDATE в условии какие записи менять, а какие нет. Вот и получите результат, он прошелся по всей таблице от первой до последней записи и изменил их значение на IVAN! Теперь давайте исправим ситуацию.
UPDATE PEOPLE
SET FM = 'Jason'
WHERE FM IS NULL
SELECT * FROM PEOPLE
Получаем следующее:
SQL> UPDATE PEOPLE
2 SET FM = 'Jason'
3 WHERE FM IS NULL
SQL> SELECT * FROM PEOPLE
2 /
ID NM FM OT
-------
2 IVAN Jason Martovich
3 IVAN Black NULL
Изменилась только одна запись, а теперь давайте вернем Jason-у его старое имя:
UPDATE PEOPLE
SET NM = 'Bob'
WHERE FM = 'Jason'
SELECT * FROM PEOPLE
Получилось:
SQL> UPDATE PEOPLE
2 SET NM = 'Bob'
3 WHERE FM = 'Jason'
SQL> SELECT * FROM PEOPLE
ID NM FM OT
-------
2 Bob Jason Martovich
3 IVAN Black NULL
Добавим запись с NULL значениями, то есть пустую:
INSERT INTO PEOPLE(ID, NM, FM, OT)
VALUES(5, NULL, NULL, NULL);
SELECT * FROM PEOPLE
Вывод:
SQL> INSERT INTO PEOPLE(ID, NM, FM, OT)
2 VALUES(5, NULL, NULL, NULL)
SQL> SELECT * FROM PEOPLE
ID NM FM OT
------
5 NULL NULL NULL
2 Bob Jason Martovich
3 IVAN Black NULL
Есть пустая запись. Изменим ее по всем правилам с применением значения ключевого (уникального) поля ID таблицы PEOPLE:
UPDATE PEOPLE
SET NM = 'Irvin',
FM = 'Show',
OT = 'Brefovich'
WHERE ID = 5
SELECT * FROM PEOPLE
Получаем результат работы:
SQL> UPDATE PEOPLE
2 SET NM = 'Irvin',
3 FM = 'Show',
4 OT = 'Brefovich'
5 WHERE ID = 5
SQL> SELECT * FROM PEOPLE
ID NM FM OT
------
5 Irvin Show Brefovich
2 Bob Jason Martovich
3 IVAN Black NULL
Изменим значение самого ключа поля применив математическое выражение в части SET оператора UPDATE:
UPDATE PEOPLE
SET ID = 5+2
WHERE ID = 5
SELECT * FROM PEOPLE
Получаем:
SQL> UPDATE PEOPLE
2 SET ID = 5+2
3 WHERE ID = 5
SQL> SELECT * FROM PEOPLE
ID NM FM OT
------
7 Irvin Show Brefovich
2 Bob Jason Martovich
3 IVAN Black NULL
Значение ключевого поля изменилось с 5 на 7. Остальное не изменялось. Главное, чтобы это значение не совпало ни с одним из уже существующих в таблице PEOPLE! Вот собственно так работает оператор UPDATE.
Оператор DELETE
Синтаксис опеартора
DELETE FROM --- таблица --- * псевдоним *
(имя столбца таблицы)
WHERE условие
Как мы видим в операторе DELETE так же есть часть определения условия WHERE. То есть все, что мы использовали ранее для описания работы WHERE в операторе SELECT, применимо и здесь. Допустим нам нужно удалить запись с номером три. Записываем:
DELETE FROM PEOPLE
WHERE ID = 3
Получаем:
SQL> DELETE FROM PEOPLE
2 WHERE ID = 3
Оператор DML - DELETE выполнил свою работу. Теперь удалим все из таблицы PEOPLE. Записываем:
DELETE FROM PEOPLE
Получаем:
SQL> DELETE FROM PEOPLE
Теперь из таблицы PEOPLE удалены все записи, которые мы вводили ранее.
Еще раз вернемся к NULL. Введем уже знакомым нам с вам способом, три записи в таблицу PEOPLE со значениями NULL:
INSERT INTO PEOPLE(ID, NM, FM, OT)
VALUES(1, NULL, 'Godwin', 'Petrovich')
INSERT INTO PEOPLE(ID, NM, FM, OT)
VALUES(2, 'Bob', NULL, 'Martovich')
INSERT INTO PEOPLE(ID, NM, FM, OT)
VALUES(3, 'Frank', 'Black', NULL)
Получаем:
SQL> INSERT INTO PEOPLE(ID, NM, FM, OT)
2 VALUES(1, NULL, 'Godwin', 'Petrovich')
SQL> INSERT INTO PEOPLE(ID, NM, FM, OT)
2 VALUES(2, 'Bob', NULL, 'Martovich')
SQL> INSERT INTO PEOPLE(ID, NM, FM, OT)
2 VALUES(3, 'Frank', 'Black', NULL)
Теперь в таблице PEOLPLE в трех разных записях присутствует значение NULL. Допустим вы хотите удалить записи со значением NULL в поле NM таблицы PEOPLE. Тогда записываем:
DELETE FROM PEOPLE
WHERE NM IS NULL
Получаем:
SQL> DELETE FROM PEOPLE
2 WHERE NM IS NULL
Запись такого типа одна и она удалена оператором DELETE.
Далее Очистим таблицу OLD_PEOPLE и заполним ее остатками записей в таблице PEOPLE. Записываем:
DELETE FROM OLD_PEOPLE
Получаем:
SQL> DELETE FROM OLD_PEOPLE
Таблица OLD_PEOPLE очищена и пуста. Вводим далее такое выражение:
INSERT INTO OLD_PEOPLE
SELECT * FROM PEOPLE
Получаем:
SQL> INSERT INTO OLD_PEOPLE
2 SELECT * FROM PEOPLE
Вот таким образом в обоих наших тренировочных таблицах на текущий момент по две одинаковых записи.
Заключение
Разработка приложений под Oracle позволяет решить практически все задачи поставленные перед СУБД. Кроме этого сама платформа Oracle оптимизирована для работы с Unix подобными операционными системами, что позволят применять открытые операционные системы для развертывания СУБД. Linux и сервер базы данных Oracle хорошо согласованы по мощности и конфигурируемости.
Также Oracle обладает очень хорошей масштабируемостью
что позволяет разворачивать и совершенствовать систему
практически любой сложности.
Литература
1. Р. Майкл Oracle 7.3. Энциклопедия пользователя: Пер с англ. - К.: Издательство "Диасофт". 19с.
2. С. Урман Oracle 8. Программирование на языке PL/SQL - М.: Изд-во ЛОРИ, 19с.
3. К. Луни Oracle 8. Настольная книга администратора. - М.: Изд-во ЛОРИ, 19с.
4. С. Бобровски Oracle 8. Архитектура. - М.: Изд-во ЛОРИ, 19с.
5. Г. Хансен, Д. Хансен Базы данных: разработка и управление: Пер. с англ. - М.: ЗАО "Издательство БИНОМ", 19с.: ил.
6. С. Дунаев Доступ к базам данных и техника работы в сети. Практические приемы современного программирования. - М.: ДИАЛОГ-МИФИ, 1с.
7. Р. Петерсен Linux: руководство по операционной системе: в 2 т: Пер с англ. - 2-е изд., перераб. и доп. - К. Издательская группа BHV, 1998.
8. Материалы периодической печати: Компьютерпресс, "Мир ПК", 9."Интернет", "Мир интернет", Byte Россия, PC magazine (RE).
10. http://www. *****
11. http://info. *****
12. http://www.
|
Из за большого объема этот материал размещен на нескольких страницах:
1 2 3 |


