INTERSECT CORRESPONDING BY (WORKER_ID)

(SELECT * FROM ASSIGNMENT

WHERE START_DATE = '09.10')

Итог:

WORKER ID

Мы выделили часть SQL-выражения, важную для нашего обсуждения. Две фразы SELECT определяют две таблицы, которые очевидно не являются объ­единительно-совместимыми. Но мы можем взять их скрещение, огово­рив, что рассматриваются только те столбцы, которые есть в обеих таблицах. Мы указываем, какие столбцы INTERSECT CORRESPONDING BY (WORKER_ID) рассматривать, в команде CORRESPONDING BY. В нашем случае рассматривается только столбец WORKER_ID. Система оставит из результатов выполнения команд SELECT только значения в столбце WORKER_ID, Потом она возьмет скрещение этих 2-ух множеств, и это будет итог запроса. Таким макаром, в итоге получится перечень ИД тех INTERSECT CORRESPONDING BY (WORKER_ID) работников, которые имеют специальность «штукатур» и получили работу, которая должна начинаться 9 октября - в точности это и требовалось.

Таковой же подход употребляется для операторов UNION и EXCEPT. Фраза CORRESPONDING BY следует за оператором и перечисляет столбцы, общие для обеих рассматриваемых таблиц. Разглядим еще несколько примеров:

Запрос: Какие строения являются зданиями кабинетов INTERSECT CORRESPONDING BY (WORKER_ID) либо же на их назна­чен рабочий 14127

(SELECT * FROM BUILDING

WHERE TYPE = 'Кабинет')

UNION CORRESPONDING BY (BLDG_ID)

(SELECT * FROM ASSIGNMENT

WHERE WORKER_ID = 1412)

Итог:

BLDG_ID

Запрос: На какие строения кабинетов не назначен рабочий 1235?

(SELECT * FROM BUILDING

WHERE TYPE = 'Кабинет')

EXCEPT CORRESPONDING BY (BLDG_ID)

(SELECT * FROM ASSIGNMENT

WHERE WORKER_ID = 1235)

Итог:

BLDG ID

Вы, возможно, увидели, что INTERSECT CORRESPONDING BY (WORKER_ID) эти запросы относительно просто сформули­ровать. Мы просто определяем подходящие подмножества строк из 2-ух таб­лиц, а потом применяем соответственный оператор UNION, INTERSECT либо EXCEPT. Это значительно расширяет практические способности языка, так как многие люди считают, что подобные запросы проще формулировать, пользуясь конкретно таким подходом. К примеру, применим к последнему INTERSECT CORRESPONDING BY (WORKER_ID) за­просу «старый» подход SQL:

SELECT BLDG_ID

FROM BUILDING

WHERE TYPE = 'Кабинет' AND

NOT EXISTS (SELECT *

FROM ASSIGNMENT

WHERE BUILDING.BLDG_ID = ASSIGNMENT.BLDG_ID

AND WORKER_ID = 1235)

В этом решении применен коррелированный подзапрос и оператор NOT EXISTS. Естественно представить, что большинству людей значи­тельно труднее сконструировать такое решение, чем решение с оператором EXCEPT INTERSECT CORRESPONDING BY (WORKER_ID). Все же, направьте внимание, что запрос можно было бы реа­лизовать при помощи старенького синтаксиса SQL. Это не так просто.

Оператор JOIN (соединение).SQL2 содержит несколько операторов со­единения в очевидной форме: естественное соединение, внутреннее соединение, несколько наружных соединений, объединительное соединение и кросс-соеди­нение. Мы разглядим только естественное INTERSECT CORRESPONDING BY (WORKER_ID) и внутреннее соединения.

Естественное соединение. Соответственно наименованию, естественное соеди­нение имеет то же значение в SQL, что и в реляционной алгебре. Предполо­жим, что мы желаем соединить таблицы WORKER и ASSIGNMENT. Мы мо­жем использовать таковой синтаксис:

WORKERNATURAL JOIN ASSIGNMENT

Результатом выполнения этой команды будет такая же таблица INTERSECT CORRESPONDING BY (WORKER_ID), которая вышла бы в итоге выполнения выражения

SELECT P.WORKER_ID, WORKER_NAME, HRLY_RATE, SKILL_TYPE,

SUPV_ID, WORKER_ID, BLDG_ID, START_DATE, NUM_DAYS

FROM WORKER, ASSIGNMENT

WHERE P.WORKER_ID = ASSIGNMENT.WORKER_ID,

кроме того, что 1-ый столбец будет называться WORKER_ID, а не P.WORKER_ID. В общем случае INTERSECT CORRESPONDING BY (WORKER_ID) естественное соединение, связывает две таблицы по всем их общим столбцам, но эти столбцы вклю­чаются в результирующую таблицу только один раз. В результирующей таб­лице поначалу размещаются общие столбцы, потом столбцы первой таблицы, потом оставшиеся столбцы 2-ой таблицы.

NATURAL JOIN. Оператор, соединяющий таблицы в этом случае, если общие столбцы INTERSECT CORRESPONDING BY (WORKER_ID) имеют равные значения.

JOIN USING. Представим, у нас есть две таблицы А и В, и у их есть общие столбцы К, L, М и N. Представим, что мы желаем соединить таб­лицы не по всем общим столбцам, а только по столбцам L и N. Тогда мы можем пользоваться последующим выражением INTERSECT CORRESPONDING BY (WORKER_ID):

A JOIN В USING (L, N)

Это выражение даст тот же итог, что и SELECT-выражение, в кото­ром в команде SELECT будут поначалу перечислены столбцы L и N, за кото­рыми следуют оставшиеся столбцы А и оставшиеся столбцы В. Фраза WHERE в таком выражении обязана иметь INTERSECT CORRESPONDING BY (WORKER_ID) вид

WHERE A.L = B.L AND A.N = B.N

JOIN USING.Операция, связывающая таблицы только по обозначенным общим столбцам, имеющим равные значения.

JOIN ON.Если мы желаем задать более общее условие соединения 2-ух таблиц, то можем воспользоваться этой формой. К примеру, представим, что мы желаем присоединить таблицу WORKER к ней самой, связав INTERSECT CORRESPONDING BY (WORKER_ID) WORKER ID с SUPV_ID, чтоб получить информацию о менеджере каждого работника. Воспользуемся последующим выражением:

WORKER W JOIN WORKER SUPV

ON W.SUPV_ID = SUPV.WORKER_ID

В этом примере мы сделали две копии таблицы WORKER и дали им псевдонимы W и SUPV, соответственно. Фраза ON содержит условие INTERSECT CORRESPONDING BY (WORKER_ID) равен­ства SUPV_ID копии W и WORKER_ID копии SUPV таблицы WORKER.

JOIN ON. Операция, связывающая таблицы при выполнении условия.

Сейчас разглядим некие вариацвв предшествующего примера. Заместо того чтоб использовать существующую таблицу либо представление данных в условии соединения, мы можем использовать таблицы, приобретенные в ре­зультате выполнения других операций INTERSECT CORRESPONDING BY (WORKER_ID). Проиллюстрируем этот подход не­сколькими примерами запросов.

Запрос: Выдать данные о предназначении и работнике для каждого штука­тура, начинающего работу 9 октября.

(SELECT * FROM WORKER WHERE SKILL_TYPE = 'Штукатур')

NATURAL JOIN

(SELECT * FROM ASSIGNMENT WHERE START_DATE = '09.10')

Может быть, вы увидели, что этот запрос практически схож тому, который употреблялся ранее для иллюстрации работы INTERSECT CORRESPONDING BY (WORKER_ID) оператора INTERSECT. Раз­ница заключается в том, что заместо того, чтоб просто получить перечень WORKER_ID, мы получим всю связанную с работником информацию, по­скольку кортежи таблицы WORKER будут связаны с кортежами таблицы ASSIGNMENT.

Запрос: Выдать данные о предназначении, работнике и здании для каждого штукатура, начинающего работу 9 октября и работающего на INTERSECT CORRESPONDING BY (WORKER_ID) доме.

(SELECT * FROM WORKER WHERE SKILL_TYPE = 'Штукатур')

NATURAL JOIN

(SELECT * FROM ASSIGNMENT WHERE START_DATE = '09.10')

NATURAL JOIN

(SELECT * FROM BUILDING WHERE TYPE - 'Дом')

В данном случае WORKER_ID и BLDG_ID - столбцы, по которым выпол­няется соединение - будут стоять в таблице результатов первыми, за ними будут следовать оставшиеся столбцы INTERSECT CORRESPONDING BY (WORKER_ID) таблиц WORKER, ASSIGNMENT, BUILDING (конкретно в таком порядке). Если в итоге мы получаем избы­точную информацию, то можем поместить все это выражение вовнутрь выра­жения SELECT FROM, указывающего нужные столбцы:

SELECT WORKER_ID, START_DATE, BLDG_ID, ADDRESS

FROM (SELECT * FROM WORKER WHERE SKILL_TYPE = 'Штукатур')

NATURAL JOIN

(SELECT * FROM INTERSECT CORRESPONDING BY (WORKER_ID) ASSIGNMENT WHERE START_DATE = '09.10')

NATURAL JOIN

(SELECT * FROM BUILDING WHERE TYPE = 'Дом')

9. Операции конфигурации данных

В SQL есть операции конфигурации данных INSERT, UPDATE и DELETE, дозволяющие, соответственно, добавлять строчки, изменять значения в стро­ках и удалять строчки определенной таблицы в базе данных. Каждую из опе­раций мы обсудим раздельно.

INSERT. Операция INSERT (воткнуть) позволяет вводить INTERSECT CORRESPONDING BY (WORKER_ID) в таблицу как отдельные строчки методом указания значений каждого столбца, так и множе­ства строк методом формулировки запроса, определяющего вводимые строчки.

INSERT INTO ASSIGNMENT (WORKER_ID, BLDG_ID, START DATE)

VALUES (1284, 485, 13.05)

Это выражение вводит в таблицу ASSIGNMENT одну строчку. Имена столбцов, для которых задаются надлежащие значения INTERSECT CORRESPONDING BY (WORKER_ID), перечислены в скобках после имени обновляемой таблицы. Так как мы опустили NUM_DAYS, в этот столбец будет помещено пустое значение.

Представим, что мы сделали новейшую таблицу с именованием BUILDING_2, состоящую из столбцов BLDG_ID, TYPE и QLTY_LEVEL (УРОВ_КАЧЕСТВА), и желаем заполнить эту таблицу строчками из таблицы BUILDING, имеющими STATUS INTERSECT CORRESPONDING BY (WORKER_ID) 2. Тогда мы воспользуемся 2-ой формой команды INSERT:

INSERT INTO BUILDING_2

SELECT BLDG_ID, TYPE, QLTY_LEVEL

FROM BUILDING

WHERE STATUS = 2

INSERT. Операция, добавляющая строчки к таблице.

UPDATE. Операция UPDATE (поменять) всегда применяется ко всем строчкам, удовлетворяющим условию выражения WHERE. Если мы желаем повысить на 5 процентов ставку каждого подчиненного начальника 1520, то нам будет нужно INTERSECT CORRESPONDING BY (WORKER_ID) последующее выражение:

UPDATE WORKER

SET HRLY_RATE = 1.05 * HRLY_RATE

WHERE SUPV_ID = 1520 -

Если фраза WHERE отсутствует, то операция применяется к каждой строке таблицы. К примеру, если б мы желали повысить на 5 процентов ставку каждого работника, то мы должны могли быть просто опустить команду WHERE в выражении UPDATE.

UPDATE. Операция, изменяющая значения INTERSECT CORRESPONDING BY (WORKER_ID) столбцов в строке.

DELETE. Операция DELETE (удалить) также применяется ко всем стро­кам, удовлетворяющим условию WHERE. Если фраза WHERE отсутствует. то удаляются все строчки таблицы. Допустим, что все рабочие, чей начальник имеет индекс 1520, были уволены, и мы желаем удалить надлежащие строчки из базы данных. Это сделает последующее выражение:

DELETE FROM WORKER

WHERE INTERSECT CORRESPONDING BY (WORKER_ID) SUPV ID = 1520

DELETE.Операция, удаляющая строчки из таблицы.


introvertnij-chuvstvuyushij-tip-podchinennaya-funkciya-ekstravertnoe-mishlenie.html
intruzivnie-i-effuzivnie-gornie-porodi-poleznie-iskopaemie.html
intuiciya-kak-chast-mehanizma-mishleniya.html