Студопедия
Случайная страница | ТОМ-1 | ТОМ-2 | ТОМ-3
АрхитектураБиологияГеографияДругоеИностранные языки
ИнформатикаИсторияКультураЛитератураМатематика
МедицинаМеханикаОбразованиеОхрана трудаПедагогика
ПолитикаПравоПрограммированиеПсихологияРелигия
СоциологияСпортСтроительствоФизикаФилософия
ФинансыХимияЭкологияЭкономикаЭлектроника

Манипулирование данными с помощью связанных подзапросов

FROM account | Gt; FROM account | Gt; FROM account | Типы подзапросов | Несвязанные подзапросы | Gt; FROM employee | Оператор all | Оператор any | Подзапросы, возвращающие несколько столбцов | Gt; FROM customer c |


Читайте также:
  1. Quot;Я могу обратиться за помощью".
  2. VII. Описание основных факторов риска, связанных с деятельностью акционерного Общества.
  3. А) Определение прямоугольных координат с помощью циркуля (линейки)
  4. Алгоритм оказания неотложной помощи при стенозах гортани, связанных со злокачественными опухолями.
  5. Б) Обнаружение с помощью химических средств
  6. Бастилию с помощью письма под чужим именем, в котором
  7. Бестраншейная замена трубопроводов с помощью тросовых установок

 

До сих пор в этой главе в качестве примеров приводились только выра_ жения select, но это не значит, что в других SQL_выражениях подза_ просы не используются. Они также широко задействуются в выраже_ ниях update, delete и insert, а связанные подзапросы часто применяют_ ся в выражениях update и delete. Вот пример связанного подзапроса, с помощью которого изменяется столбец last_activity_date таблицы account:

 

UPDATE account a

 

SET a.last_activity_date = (SELECT MAX(t.txn_date) FROM transaction t

 

WHERE t.account_id = a.account_id);

 

Это выражение корректирует все строки таблицы account (поскольку блока where нет), выбирая дату последней операции для каждого счета. Хотя кажется разумным ожидать, что для каждого счета будет суще_ ствовать, по крайней мере, одна связанная с ним операция, но лучше проверить наличие такой операции, прежде чем пытаться обновить столбец last_activity_date. В противном случае в столбце появится


 

Использование подзапросов  
   

 

значение null, поскольку по подзапросу не будет возвращено ни одной строки. Вот другой вариант выражения update, на этот раз использую_ щий блок where со вторым связанным подзапросом:

 

UPDATE account a

 

SET a.last_activity_date = (SELECT MAX(t.txn_date) FROM transaction t

 

WHERE t.account_id = a.account_id) WHERE EXISTS (SELECT 1

 

FROM transaction t

 

WHERE t.account_id = a.account_id);

 

Эти два связанных подзапроса идентичны, за исключением блоков se_ lect. Однако подзапрос блока set выполняется, только если условие блока where выражения update истинно (true) (т. е. для счета была най_ дена, по крайней мере, одна операция). Таким образом данные столбца last_activity_date защищены от перезаписи значением null.

 

Связанные подзапросы обычны и в выражениях delete. Например, в конце каждого месяца запускается сценарий, уничтожающий не_ нужные данные. Этот сценарий может включать следующее выраже_ ние, которое удаляет из таблицы department данные, не имеющие до_ черних строк в таблице employee:

 

DELETE FROM department

 

WHERE NOT EXISTS (SELECT 1

 

FROM employee

 

WHERE employee.dept_id = department.dept_id);

 

При использовании связанных подзапросов в выражениях delete в MySQL необходимо помнить, что псевдонимы таблиц не допускаются ни в коем случае. Вот почему в этом подзапросе приходилось использо_ вать полное имя таблицы. Для большинства других серверов БД мож_ но было бы снабдить таблицы department и employee псевдонимами:

 

DELETE FROM department d

 

WHERE NOT EXISTS (SELECT 1

 

FROM employee e

 

WHERE e.dept_id = d.dept_id);

 


Дата добавления: 2015-08-17; просмотров: 52 | Нарушение авторских прав


<== предыдущая страница | следующая страница ==>
Оператор exists| Использование подзапросов

mybiblioteka.su - 2015-2024 год. (0.007 сек.)