Оригинал: Exercise 42: Deleting with SQL
Переводчик: Феликс Ли
Лицензия: CC BY-NC-SA 4.0
Гордо использует Google Translate
Это самое простое упражнение, но я хочу, чтобы вы подумали несколько секунд перед тем как ввести код. Если вы напишете SELECT
как "SELECT * FROM"
, а INSERT
как "INSERT INTO"
, то как будет выглядеть формат DELETE
? Вы можете посмотреть ниже, но попробуйте догадаться, что это может быть, а затем проверьте.
-- убедитесь, что есть мертвые питомцы
SELECT имя, возраст FROM питомец WHERE мертв = 1;
-- бедный робот!
DELETE FROM питомец WHERE мертв = 1;
-- убедитесь, что робот пропал
SELECT * FROM питомец;
-- давайте воскрешаем робота
INSERT INTO питомец VALUES (1, 'Гигант', 'Робот', OnClickListener, 0);
-- робот ЖИВЕТ!
SELECT * FROM питомец;
Я просто очень просто реализовал сложное обновление, удалив его, а затем вернув запись с мёртв = 0
. В последующих упражнениях я покажу вам, как использовать UPDATE
для этого, так что не думайте, что это настоящий способ обновления.
Вы уже знакомы со всеми строками этого скрипта, кроме пятой строки. Здесь у вас есть DELETE
, который имеет почти такой же формат, как и остальные команды. Вы предоставляете DELETE FROM таблица WHERE условия
, и видите его как удаление строк через SELECT
. Любое условие, которое работает в WHERE
, также работает здесь.## Удаление с использованием других таблиц
Помните, когда я сказал: «DELETE
похож на SELECT
, но он удаляет строки из таблицы». Ограничением является то, что можно удалять строки только из одной таблицы за один раз. Это значит, что для удаления всех питомцев вам потребуется выполнить несколько дополнительных запросов, а затем удалить их на основе этих запросов.
Один метод — использование подзапроса, выбирающего нужные ID на основе запроса, который вы уже написали. Есть и другие способы сделать это, но сейчас вы можете сделать это на основе того, что вы знаете:
DELETE FROM питомец WHERE id IN (
SELECT питомец.id
FROM питомец, человек_питомец, человек
WHERE
человек.id = человек_питомец.человек_id AND
питомец.id = человек_питомец.питомец_id AND
человек.имя = 'Зэд'
);
SELECT * FROM питомец;
SELECT * FROM человек_питомец;
DELETE FROM человек_питомец
WHERE питомец_id NOT IN (
SELECT id FROM питомец
);
Первые 1–8 строки представляют собой обычный DELETE
запрос, но используют WHERE
с условием IN
, чтобы соотнести значения столбца id
таблицы питомец
с возвращаемыми значениями подзапроса.
Подзапрос (или подвыборка) представляет собой обычный SELECT
, который должен выглядеть аналогично тому, что вы делали ранее, когда пытаетесь найти питомцев, которыми владеют люди.С 13 по 16 строки показывают использование подзапроса для удаления любых питомцев, которых нет в таблице person_pet
. В этом случае используется NOT IN
вместо IN
.
Обработка SQL происходит следующим образом:
SELECT
.pet.id
.pet
, и удаляются все строки, где значение id
присутствует во временной таблице (IN
).ex2.sql
до ex7.sql
в один файл и выполните вышеупомянутый скрипт, чтобы вам пришлось запустить только новый файл для восстановления базы данных.SELECT
, а затем используйте их в DELETE WHERE IN
, чтобы удалить найденные записи. Попробуйте удалить всех ваших мёртвых питомцев.person_pet
и не отметить, что они умерли? Напишите запрос, чтобы удалить связи с мёртвыми питомцами из таблицы person_pet
.## Дополнительное чтениеДля полноты следует прочитать документацию по DELETE
.
Вы можете оставить комментарий после Вход в систему
Неприемлемый контент может быть отображен здесь и не будет показан на странице. Вы можете проверить и изменить его с помощью соответствующей функции редактирования.
Если вы подтверждаете, что содержание не содержит непристойной лексики/перенаправления на рекламу/насилия/вульгарной порнографии/нарушений/пиратства/ложного/незначительного или незаконного контента, связанного с национальными законами и предписаниями, вы можете нажать «Отправить» для подачи апелляции, и мы обработаем ее как можно скорее.
Опубликовать ( 0 )