1 В избранное 0 Ответвления 0

OSCHINA-MIRROR/wizardforcel-lmpythw-zh

Присоединиться к Gitlife
Откройте для себя и примите участие в публичных проектах с открытым исходным кодом с участием более 10 миллионов разработчиков. Приватные репозитории также полностью бесплатны :)
Присоединиться бесплатно
Клонировать/Скачать
ex42.md 7.1 КБ
Копировать Редактировать Web IDE Исходные данные Просмотреть построчно История
Отправлено 06.03.2025 03:52 f9ec0dd

Упражнение 42: Удаление с помощью SQL

Оригинал: 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 )

Вы можете оставить комментарий после Вход в систему

1
https://api.gitlife.ru/oschina-mirror/wizardforcel-lmpythw-zh.git
git@api.gitlife.ru:oschina-mirror/wizardforcel-lmpythw-zh.git
oschina-mirror
wizardforcel-lmpythw-zh
wizardforcel-lmpythw-zh
master