Содержание

Команда DELETE — Язык запросов SQL

Команда DELETE

Команда DELETE удаляет строки из таблицы или представления основной таблицы базы данных, например, в MySQL, Oracle.

Команда DELETE. Синтаксис команды DELETE

Синтаксис команды DELETE

Команда DELETE. Основные ключевые слова и параметры команды DELETE

  • schema — идентификатор полномочий, обычно совпадающий с именем некоторого пользователя
  • table view — имя таблицы, из которой удаляются строки; если определяется представление, сервер удаляет строки из основной таблицы представления
  • subqueryподзапрос, с помощью которого выбираются строки для удаления; сервер выполняет подзапрос и использует строки его результата как таблицу фразы FROM
  • WHERE — удаляет только строки, которые удовлетворяют условию; условие может ссылаться на таблицу и содержать
    подзапрос
    .

При выдаче утверждения DELETE включается любой DELETE-триггер, определенный на таблице.
Команда DELETE Пример №1
Удаление всех строк из таблицы:

DELETE FROM temp_assign;

В данном примере команда DELETE удаляет все строки без исключения.
Команда DELETE Пример №2.
Удаляет из таблицы всех продавцов, у которых комиссионные меньше 100 у.е. в месяц:

DELETE FROM emp WHERE JOB = ‘SALESMAN’ AND COMM < 100;

В данном примере команда DELETE удаляет все строки, которые попадают под условие JOB = ‘SALESMAN’ AND COMM < 100;
Команда DELETE Пример №3
Предыдущий пример можно записать по-другому:

DELETE FROM (select * from emp) WHERE job = ‘SALESMAN’ AND comm < 100;

Для удаления всех записей в MySQL можно использовать следующую команду DELETE:

DELETE * FROM table_nam;

Удаление существующего экземпляра — SQL Server

  • Чтение занимает 3 мин

В этой статье

Применимо к: SQL Server (все поддерживаемые версии)  — только Windows Управляемый экземпляр SQL Azure

В данной статье описан процесс удаления изолированного экземпляра SQL Server. Шаги, перечисленные в этой статье, помогут подготовить систему для повторной установки SQL Server.

Рекомендации

  • Удаление экземпляра SQL Server должен производить локальный администратор, имеющий разрешения на вход в систему в качестве службы.
  • Если на компьютере установлен минимальный требуемый объем физической памяти, увеличьте размер файла подкачки вдвое больше объема физической памяти. Нехватка виртуальной памяти может привести к неполному удалению SQL Server.
  • В системе с несколькими экземплярами SQL Server служба браузера SQL Server удаляется только после удаления последнего экземпляра SQL Server. Службу браузера SQL Server можно удалить вручную через Программы и компоненты на панели управления.
  • При удалении SQL Server удаляются файлы данных tempdb, добавленные во время процесса установки. Файлы с именем, удовлетворяющим шаблону tempdb_mssql_*.ndf, удаляются, если они существуют в каталоге системной базы данных.

Подготовка.

  1. Резервное копирование данных. Либо создайте полные резервные копии всех баз данных, включая системные базы данных, либо вручную скопируйте MDF- и LDF-файлы в отдельное место. База данных master содержит все сведения на уровне системы для сервера, такие как имена входа и схемы. База данных msdb содержит сведения о заданиях, такие как задания агента SQL Server, журнал резервного копирования и планы обслуживания. Дополнительные сведения о системных базах данных см. в разделе Системные базы данных.

    Необходимо сохранить следующие файлы баз данных.

    • master.mdf
    • msdbdata.mdf
    • Tempdb.mdf
    • mastlog.ldf
    • msdblog.ldf
    • Templog.ldf
    • model.mdf
    • Mssqlsystemresource.mdf
    • ReportServer[$InstanceName]
    • modellog.ldf
    • Mssqlsustemresource.ldf
    • ReportServer[$InstanceName]TempDB

    Примечание

    Базы данных ReportServer включены в службы SQL Server Reporting Services.

  2. Остановите все службы SQL Server. Перед удалением компонентов SQL Server рекомендуется остановить все службы SQL Server. Наличие активных соединений может помешать удалению компонентов.

  3. Выбор учетной записи с необходимыми разрешениями. Выполните вход на сервер с учетной записью службы SQL Server или с учетной записью, обладающей аналогичным набором разрешений. Например, можно войти на сервер с учетной записью, входящей в локальную группу администраторов.

Удаление

Чтобы удалить SQL Server из Windows 10, Windows Server 2016, Windows Server 2019 и более поздних версий, выполните следующие действия.

  1. Чтобы начать процесс удаления, перейдите к

    Параметры в меню «Пуск» и выберите Приложения.

  2. Введите sql в поле поиска.

  3. Выберите Microsoft SQL Server (версия) (разрядность) . Например, Microsoft SQL Server 2017 (64-bit).

  4. Выберите Удалить.

  5. Выберите Удалить во всплывающем диалоговом окне SQL Server, чтобы запустить мастер установки Microsoft SQL Server.

  6. На странице Выбор экземпляра воспользуйтесь раскрывающимся списком, чтобы указать удаляемый экземпляр SQL Server, или укажите параметр для удаления только общих компонентов и средств управления SQL Server. Чтобы продолжить работу, щелкните

    Далее.

  7. На странице Выбор компонентов укажите компоненты, которые нужно удалить из указанного экземпляра SQL Server.

  8. На странице Все готово для удаления просмотрите список компонентов и функций, подлежащих удалению. Нажмите кнопку Удалить , чтобы начать удаление

  9. Обновите окно Приложения и компоненты, чтобы убедиться, что экземпляр SQL Server был успешно удален, и определите, какие компоненты SQL Server все еще остались. При необходимости удалите эти компоненты из этого окна.

Чтобы удалить SQL Server из Windows Server 2008, Windows Server 2012 и Windows 2012 R2, выполните следующие действия.

  1. Чтобы начать процесс удаления, перейдите в панель управления, а затем выберите Программы и компоненты.

  2. Щелкните правой кнопкой мыши Microsoft SQL Server (версия) (разрядность) и выберите Удалить. Например, Microsoft SQL Server 2012 (64-bit).

  3. Выберите Удалить во всплывающем диалоговом окне SQL Server, чтобы запустить мастер установки Microsoft SQL Server.

  4. На странице Выбор экземпляра воспользуйтесь раскрывающимся списком, чтобы указать удаляемый экземпляр SQL Server, или укажите параметр для удаления только общих компонентов и средств управления SQL Server. Чтобы продолжить работу, щелкните Далее.

  5. На странице Выбор компонентов укажите компоненты, которые нужно удалить из указанного экземпляра SQL Server.

  6. На странице Все готово для удаления просмотрите список компонентов и функций, подлежащих удалению. Нажмите кнопку Удалить , чтобы начать удаление

  7. Обновите окно

    Программы и компоненты, чтобы убедиться, что экземпляр SQL Server был успешно удален, и определите, какие компоненты SQL Server все еще остались. При необходимости удалите эти компоненты из этого окна.

В случае сбоя

В случае сбоя процесса удаления изучите файлы журнала установки SQL Server, чтобы определить основную причину.

Статья базы знаний Обнаружение проблем установки SQL Server в файлах журнала установки может помочь в расследовании. Хотя она предназначена для SQL Server 2008, описываемая методология применима к каждой версии SQL Server.

См. также:

Просмотр и чтение файлов журналов программы установки SQL Server

Руководство по SQL. Удаление данных. – PROSELYTE

Для удаления данных из базы данных (далее – БД) мы используем SQL выражение DELETE.

Для того, чтобы указать, какие именно данные мы хотим удалить используется условный оператор WHERE.

Данный запрос имеет следующий вид:


DELETE FROM имя_таблицы
WHERE [условие];

Мы также можем использовать операторы AND/OR для комбинирования нескольких условий.

Пример:

Предположим, что у нас есть таблица developers, которая содержит следующие данные:


+----+-------------------+------------+------------+--------+
| ID | NAME              | SPECIALTY  | EXPERIENCE | SALARY |
+----+-------------------+------------+------------+--------+
|  1 | Eugene Suleimanov | Java       |          2 |   2500 |
|  2 | Peter Romanenko   | Java       |          3 |   3500 |
|  3 | Andrei Komarov    | JavaScript |          3 |   2500 |
|  4 | Konstantin Geiko  | C#         |          2 |   2000 |
|  5 | Asya Suleimanova  | UI/UX      |          2 |   1800 |
|  6 | Ivan Ivanov       | Java       |          1 |   1500 |
+----+-------------------+------------+------------+--------+

Допустим, что мы хотим удалить разработчика с ID = 6.
Для этого нам необходимо создать следующий запрос:


DELETE FROM developers WHERE ID = 6;

В результате выполнения данного запроса, наша таблица будет содержать следующие записи:


+----+-------------------+------------+------------+--------+
| ID | NAME              | SPECIALTY  | EXPERIENCE | SALARY |
+----+-------------------+------------+------------+--------+
|  1 | Eugene Suleimanov | Java       |          2 |   2500 |
|  2 | Peter Romanenko   | Java       |          3 |   3500 |
|  3 | Andrei Komarov    | JavaScript |          3 |   2500 |
|  4 | Konstantin Geiko  | C#         |          2 |   2000 |
|  5 | Asya Suleimanova  | UI/UX      |          2 |   1800 |
+----+-------------------+------------+------------+--------+

Если же мы хотим удалить все данные из таблицы, то мы можем использовать команду:


DELETE FROM developers;

Стоит отметить, что это не самый лучший способ удаления всех данных из таблицы. Более грамотный способ будет рассмотрен позже.

На этом мы заканчиваем изучение способов удаления данных из БД.
В следующей статье мы рассмотрим предикат LIKE.

2.18. Удаление данных — Transact-SQL В подлиннике : Персональный сайт Михаила Флёнова

Теперь посмотрим, как можно удалять записи из таблицы. Для этого используется оператор DELETE. Общий вид оператора показан в листинге 2.7.

Листинг 2.7. Общий вид оператора удаления DELETE


DELETE 
    [ FROM ] 
        { table_name WITH ( < table_hint_limited > [ ...n ] ) 
         | view_name 
         | rowset_function_limited 
        } 

        [ FROM { < table_source > } [ ,...n ] ] 

    [ WHERE 
        { < search_condition > 
        | { [ CURRENT OF 
                { { [ GLOBAL ] cursor_name } 
                    | cursor_variable_name 
                } 
            ] }
        } 
    ] 

Минимальная команда удаления выглядит следующим образом:


DELETE tbPeoples

Эта команда удаляет все строки из таблицы tbPeoples. Те же самые действия можно выполнить с помощью вызова команды:


DELETE FROM tbPeoples

Отличие этой команды в том, что мы добавили ключевое слово FROM, которое в данной команде может опускаться.

Пока не надо выполнять эти команды, потому что они очистят таблицу tbPeoples, а нам этого пока не нужно. Данные еще пригодятся для тестирования будущих запросов. Если хотите протестировать удаление, то создайте новую таблицу, заполните ее данными и очистите. Заодно вспомните и закрепите знания, которые мы рассматривали ранее. Можно создать новую таблицу с помощью команды SELECT INTO, это будет проще и быстрее.

Я предпочитаю использовать вторую команду, хотя она выполняет те же самые действия, а содержит на одно слово больше. Просто второй вариант более интеллектуально понятен. В первом случае команда читается как «удалить tbPeoples». Это не совсем корректно. Второй вариант команды звучит как «Удалить из tbPeoples». Это уже ближе отражает суть выполняемых действий.

Честно сказать, такая простота очистки всего содержимого таблицы, на мой взгляд, является недостатком. В моей практике уже не раз были случаи, когда удаление происходило случайно. Просто кто-то выделял в Query Analizyr не полную команду, и таблица очищалась сильнее, чем хотелось бы. Проблема кроется и в том, что в большинстве редакторов нет подтверждения при удаления. Я видел только одну программу, которая перед удалением отображала окно подтверждения и показывала, сколько строк будет удаляться – phpMySQLAdmin. Это программа для управления через WEB интерфейс базой данных MySQL.

Чтобы ограничить количество удаляемых строк, используется секция WHERE. Она используется точно так же, как и в запросах SELECT или UPDATE. Когда мы тестировали оператор INSERT, то вставили в таблицу достаточно много записей. Давайте подчистим их и попрактикуемся в использовании оператора DELETE.

Для начала удалим все строки, в которых поле «vcFamil» содержит нулевое значение. Это делается с помощью следующего запроса:


DELETE FROM tbPeoples
WHERE vcFamil is NULL

С помощью секции WHERE мы требуем, чтобы сервер удалил только те записи, в которых поле «vcFamil» содержит нулевое значение.

Следующий запрос удаляет запись, в которой первичный ключ «idPeoples» содержит значение -22:


DELETE FROM tbPeoples
WHERE idPeoples = -22

Предыдущие два запроса можно было бы выполнить одной командой:


DELETE FROM tbPeoples
WHERE vcFamil is NULL
 OR idPeoples = -22

В данном случае удаляются записи, в которых или фамилия не заполнена, или ключевое поле равно -22.

Давайте теперь для закрепления материала создадим что-нибудь посложнее. Например, удалим все записи из таблицы tbPeoples, у которых нет записей в таблице телефонов tbPhoneNumbers. Для этого сначала пишем запрос SELECT, чтобы убедиться, что он выбирает необходимые данные и не ошибиться:


SELECT *
FROM tbPeoples pl
WHERE NOT EXISTS
  (SELECT idPeoples 
   FROM tbPhoneNumbers pn
   WHERE pl.idPeoples=pn.idPeoples)

Этот запрос выбирает все строки, для которых не существует (NOT EXISTS) записи в таблице tbPhoneNumbers. Отличный пример, ведь подобные запросы приходиться писать достаточно часто.

Теперь модифицируем пример для того, чтобы он удалял выбранные данные. Для этого первую строку заменяем на DELETE:


DELETE
FROM tbPeoples
WHERE NOT EXISTS
  (SELECT idPeoples pl
   FROM tbPhoneNumbers pn
   WHERE pl.idPeoples=pn.idPeoples)

Но этого не достаточно, потому что при удалении, в секции FROM не должно быть псевдонимов. Это значит, что от них нужно отказаться и в подзапросе использовать вместо псевдонима полное имя таблицы из внешнего запроса:


DELETE
FROM tbPeoples
WHERE NOT EXISTS
  (SELECT idPeoples 
   FROM tbPhoneNumbers pn
   WHERE tbPeoples.idPeoples=pn.idPeoples)

Недавно меня один очень опытный программист спросил: «А можно использовать оператор LIKE при удалении?». А почему бы и нет? Можно использовать любые операторы, которые мы изучали для секции WHERE, и LIKE тут не исключение. Следующий запрос удалит все записи, в которых фамилия начинается с буквы «С»:


DELETE
FROM tbPeoples
WHERE vcFamil LIKE 'С'

Теперь рассмотрим удаление из связанных таблиц. Допустим, что нам необходимо удалить номера телефонов определенного работника. Для этого выполняем следующий запрос:


DELETE pn
FROM tbPhoneNumbers pn, inserted i
WHERE pn.idPeoples=i.idPeoples
 AND vcFamil = Фамилия

Нельзя удалять сразу из двух таблиц, может быть только одна. Так как в этом примере связываются две таблицы, то после оператора DELETE необходимо явно указать, из какой из двух происходит удаление.

При удалении данных, для каждой удаляемой строки в журнале транзакций создается отдельная запись. О транзакциях мы подробно поговорим в разделе 2.19, а сейчас нам необходимо понимать, что это достаточно трудоемкий процесс. Это можно понять, даже не вникая в суть самих транзакций. Журнал транзакций – это файл и в него происходит запись для каждой удаляемой строки. Если в таблице 1 000 000 записей, то будет столько же обращений к жесткому диску, а если каждое обращение к диску отнимет хотя бы 10 байт данных, то мы потеряем на жестком диске 10 000 000 байт свободного пространства. Я думаю, что нас ожидают не очень радужные перспективы.

Но у MS SQL Server есть вариант решения этой проблемы — TRUNCATE TABLE. Ее можно использовать при удалении из таблицы всех записей, и при этом обращения к журналу будут сведены к минимуму. Для удаления всех записей из таблицы Товары нужно использовать следующий запрос:


TRUNCATE TABLE Имя_Таблицы

В результате этого из таблицы будут удалены все записи, а в журнал будет записано только информация о том, что все удалено.

С помощью оператора TRUNCATE TABLE можно удалять только все записи из таблицы, потому что нет секции WHERE. К тому же, нельзя удалять из таблицы, которая связана с помощью внешнего ключа.

Есть еще одно очень важное отличие между операторами DELETE и TRUNCATE TABLE. Если удалить все записи из таблицы с помощью DELETE, а затем добавить новую запись, то значение автоматически увеличиваемого поля будет увеличиваться дальше, т.е. счетчик не будет сброшен. А после удаления с помощью TRUNCATE TABLE, значение счетчика сбрасывается и если после этого добавить строку, то значение автоматически увеличиваемого поля начнет свой отсчет с единицы. Учитывайте этот эффект при использовании определенного оператора удаления данных.

SQL удаление записей в определенном диапазоне



Это, вероятно, очень простой вопрос для кого-то с опытом, но я просто хотел знать самый безопасный способ удалить пару сотен записей в таблице SQL, которые попадают между определенным диапазоном.

Например, мне нужно удалить строки с ID между 79 & 296:

Меня беспокоит то, что если я скажу удалить все с помощью ID (>79 AND < 296), то это может буквально стереть всю таблицу.

sql sql-delete records
Поделиться Источник Unknown     22 ноября 2011 в 10:06

7 ответов




116

если вы используете Sql Server

delete from Table where id between 79 and 296

После вашей правки: теперь вы уточнили, что хотите :

ID (>79 AND < 296)

Так что используйте это :

delete from Table where id > 79 and id < 296

Поделиться Royi Namir     22 ноября 2011 в 10:07



14

Вы дали условие ID (>79 и < 296), то ответ таков:

delete from tab
where id > 79 and id < 296

это то же самое, что:

delete from tab
where id between 80 and 295

если id -целое число.

Все ответили:

delete from tab
where id between 79 and 296

это то же самое, что:

delete from tab
where id => 79 and id <= 296

Обратите внимание на разницу.

Поделиться Michał Powaga     22 ноября 2011 в 10:20



2

DELETE FROM table_name 
WHERE id BETWEEN 79 AND 296;

Поделиться yosh     22 ноября 2011 в 10:08


  • Перетасовать список в определенном диапазоне python

    Я очень новичок в Python, так что потерпите. Я хотел бы запустить программу, которая будет перетасовывать строку целых чисел в определенном диапазоне, но без необходимости вводить каждое целое число в этом диапазоне. I.e., я хочу рандомизировать список целых чисел b / w 1-100 без ввода (1, 2,. ..

  • SQL для возврата целочисленных значений, не используемых в определенном диапазоне

    Можно ли использовать SQL для возврата списка значений, которые являются NOT в определенном наборе данных, но находятся в пределах диапазона значений? Например, у меня есть колонка со следующим текстом…. Registration_no 1 5 6 9 Я хотел бы вернуть все целые числа ‘unused’ между min и max в…



1

вы также можете просто изменить свой delete на select *

и проверьте свой выбор

выбранные записи будут такими же, как и удаленные

вы также можете обернуть свой оператор в begin / rollback, если вы не уверены — проверьте оператор, а затем, если все хорошо, удалите rollback

например

SELECT * FROM таблица WHERE id BETWEEN 79 AND 296

покажет все записи, соответствующие тому, где они находятся, если они хотят, чтобы вы ‘really’ хотели удалить, а затем использовать

Удалить из таблицы WHERE id BETWEEN 79 AND 296

Вы также можете создать триггер /, который ловит удаления и помещает их в таблицу истории

так что если вы удалили что-то по ошибке, вы всегда можете получить его обратно

(храните записи в таблице истории не старше, скажем, 6 месяцев или что там говорят бизнес-правила)

Поделиться TheTiger     16 июня 2012 в 12:10



0

Если вы запишете его следующим образом в SQL server, то не будет никакой опасности стереть таблицу базы данных, если только все значения в этой таблице не окажутся между этими значениями:

DELETE FROM [dbo]. [TableName] WHERE [TableName].[IdField] BETWEEN 79 AND 296 

Поделиться CSharpened     22 ноября 2011 в 10:11



0

Меня беспокоит, если я скажу удалить все с помощью ID (>79 AND < 296) тогда он может буквально вытереть весь стол…

Этого не произойдет, потому что у вас будет пункт where. Если у вас есть оператор типа delete * from Table1 where id between 70 and 1296 , то первое, что сделает обработчик запросов sql, — это просканирует таблицу и отыщет записи в этом диапазоне, а затем применит удаление.

Поделиться lloydom     22 ноября 2011 в 10:16



0

Вы можете использовать этот способ, потому что id не может быть последовательным во всех случаях.

SELECT * 
FROM  `ht_news` 
LIMIT 0 , 30

Поделиться Ali     02 октября 2014 в 05:48


Похожие вопросы:


Выберите случайную дату в определенном диапазоне

Как я могу выбрать случайную дату в определенном диапазоне включительно, скажем, 1950-01-01 и 1999-12-31 с SQL Server?


Выборка каждой записи в таблице MySQL в определенном диапазоне дат

может ли кто-нибудь предложить мне способ отображения всех записей в таблице MySQL в определенном диапазоне дат, и если на эту дату нет доступных записей, она все равно будет отображаться как NULL?


Получение записей в определенном диапазоне дат

У меня есть столбец в базе данных DateCreated , который показывает дату создания. Теперь я хочу отфильтровать записи в зависимости от выбранного диапазона дат. Например: создано в течение 60 дней…


SQL : как найти пробелы в определенном диапазоне чисел?

Я хочу найти пробелы в числовом столбце (не во всем столбце), а в определенном диапазоне . Например : Моя колонка : 1 2 5 6 8 10 18 19 20 Я хочу указать конкретный диапазон, в котором мой запрос SQL…


Как создать запрос SQL, который группируется в определенном процентном диапазоне

Я хотел бы создать запрос SQL, который группирует увеличение цены товаров в определенном процентном диапазоне. Например 2 предмета увеличены от 0 до 10 % 4 пункта увеличены с 10 до 20% 2 пункта…


Перетасовать список в определенном диапазоне python

Я очень новичок в Python, так что потерпите. Я хотел бы запустить программу, которая будет перетасовывать строку целых чисел в определенном диапазоне, но без необходимости вводить каждое целое число…


SQL для возврата целочисленных значений, не используемых в определенном диапазоне

Можно ли использовать SQL для возврата списка значений, которые являются NOT в определенном наборе данных, но находятся в пределах диапазона значений? Например, у меня есть колонка со следующим. ..


SQL удаление таблиц в определенном диапазоне

У меня есть база данных MySQL с 20.000 таблицами. Все таблицы идут как таблица 1 Таблица 2 … table20000 Существует ли код sql для удаления таблиц в определенном диапазоне? Или есть простой способ?…


Генерация случайной даты в определенном диапазоне в JAVA

Как генерировать случайные даты в определенном диапазоне в JAVA? Я видел, как я генерирую случайные целые числа в определенном диапазоне в Java? ссылка, которая предназначена для генерации случайных…


Привязка к открытому порту в определенном диапазоне

Я хочу привязать сокет для прослушивания любого открытого порта в определенном диапазоне. Обычно я привязываюсь к нулю, и операционная система хороша тем, что дает мне случайный открытый порт….

Способы удаления дубликатов в SQL Server — Разработка на vc.ru

При проектировании объектов, в частности таблиц в БД SQL Server, необходимо придерживаться определенных правил. Однако, даже если следовать данным правилам существует вероятность появления дубликатов в строках таблиц. Данная статья посвящена различным способам очистки данных от дубликатов.

8149 просмотров

При проектировании объектов, в частности таблиц в БД SQL Server необходимо придерживаться определенных правил: рекомендуется использовать правила нормализации БД; таблица должна иметь первичные ключи, кластерные и некластерные индексы; ограничения для обеспечения целостности данных и производительности. Но даже если следовать этим правилам, мы можем столкнуться с проблемой появления дубликатов в строках таблицы. Кроме этого, возможна ситуация получения дубликатов при импорте данных, когда мы загружаем данные as is в промежуточные таблицы, и далее требуется удалить дублирующие записи перед загрузкой в промышленные таблицы.

Рассмотрим различные способы для очистки данных от дублей. Создадим простую таблицу сотрудников и наполним её несколькими записями.

CREATE TABLE Employee ( [id] int identity(1,1), [Фамилия] nvarchar(100), [Имя] nvarchar(100), [Отчество] nvarchar(100), [Дата рождения] date, ) GO Insert into Employee ([Фамилия],[Имя],[Отчество],[Дата рождения]) values (N’Алексеев’,N’Алексей’,N’Алексеевич’,’1990-03-01′), (N’Алексеев’,N’Алексей’,N’Алексеевич’,’1990-03-01′), (N’Алексеев’,N’Алексей’,N’Алексеевич’,’1990-03-01′) (N’Иванов’,N’Иван’,N’Иванович’,’1985-01-01′), (N’Иванов’,N’Иван’,N’Иванович’,’1985-01-01′), (N’Петров’,N’Петр’,N’Петрович’,’1988-02-01′),

Как мы видим, в таблице присутствуют дублирующие строки, которые необходимо удалить.

  • Удаление дубликатов с использованием агрегатных функций

C помощью условия GROUP BY мы группируем данные по определенным столбцам и используем функцию COUNT для подсчета вхождений строк в таблицу.

Например, с помощью следующего запроса, определим записи, которые присутствуют в таблице более 1 раза.

Select [Фамилия], [Имя], [Отчество], [Дата рождения], count(*) as CNT FROM NTA.dbo.Employee GROUP BY [Фамилия], [Имя], [Отчество], [Дата рождения] having count(*) > 1

Т. е. сотрудники Алексеев А.А. и Иванов И.И. присутствуют в таблице 3 и 2 раза соответственно.

Удалим дублирующие записи, оставив только строки с MIN id сотрудника.

Delete FROM NTA.dbo.Employee Where id not in ( select min(id) as MinRowID FROM NTA.dbo.Employee group by [Фамилия],[Имя],[Отчество],[Дата рождения] )

Выведем оставшиеся записи таблицы, и убедимся, что дубликаты отсутствуют.

Отметим, что данный способ удаления дубликатов возможен в случае таблиц, для которых определен первичный ключ.

  • Удаление дубликатов используя обобщенные табличные выражения (CTE)

Мы можем использовать связку обобщенных табличных выражений и функции ROW_number() для удаления дубликатов, например следующим образом:

WITH CTE ([Фамилия], [Имя], [Отчество], [Дата рождения], [Нумерация] ) AS (SELECT [Фамилия], [Имя], [Отчество], [Дата рождения], ROW_NUMBER () OVER (PARTITION BY [Фамилия], [Имя], [Отчество], [Дата рождения] ORDER BY id) AS [Нумерация] FROM NTA. dbo.Employee) DELETE FROM CTE WHERE [Нумерация] > 1

В данном запросе мы используем функцию ROW_number() с конструкцией partition BY в предложении OVER для нумерации записей, и удаляем записи с пронумерованными значениями > 1, соответствующие дубликатам.

  • Удаление дубликатов с использованием инструментария SSIS пакетов.

Создадим в SQL Server Data Tools новый пакет integration Services.

Добавим в пакет элемент «OLE DB Source», откроем редактор OLE DB Source, в графе Connection Manager укажем реквизиты экземпляра СУБД и БД, и наименование исходной таблицы с данными, содержащей дубликаты.

С помощью кнопки Preview убедимся, что в исходной таблице присутствуют дубликаты.

Добавим оператор «Sort», и выделим поля, в которых присутствуют дублирующие данные.

Установим галку «Remove rows with duplicate sort values» для удаления дубликатов.

Добавим элемент «OLE DB Destination», в котором укажем целевую таблицу для записей результата очистки данных.

Запустив на исполнение реализованный SSIS пакет, мы видим, что в целевой источник загрузилось 3 строки, проверим, что отсутствуют дубликаты.

Необходимо отметить, что при использовании данного способа потребуется дополнительное место для хранения новой целевой таблицы, однако данный вариант позволяет избежать ошибок и вернуться к исходному варианту, в случае если результат в целевой таблице не будет являться удовлетворительным.

В данной статье мы рассмотрели различные способы удаления дубликатов записей в таблицах БД SQL Server, которые могут быть использованы в работе в зависимости от задачи и объема данных.

При больших объемах дубликатов в данных целесообразно рассмотреть возможность сохранения уникальных значений в промежуточную таблицу, очистку рабочей таблицы, и возврат оставленных уникальных записей.

SQL — запрос DELETE

Запрос DELETE используется для удаления существующих записей из таблицы.

Вы можете использовать запрос WHERE с DELETE, чтобы удалить выбранные строки, в противном случае все записи будут удалены.

Синтаксис:

Базовый синтаксис DELETE запроса с WHERE выглядит следующим образом:

DELETE FROM table_name
WHERE [condition];

 

Вы можете объединить N число условий с помощью операторов AND или OR.

Пример:

Рассмотрим таблицу CUSTOMERS, имеющую следующие записи:

+----+----------+-----+-----------+----------+
| ID | NAME     | AGE | ADDRESS   | SALARY   |
+----+----------+-----+-----------+----------+
|  1 | Maxim    |  35 | Moscow    | 21000.00 |
|  2 | AndreyEx |  38 | Krasnodar | 55500.00 |
|  3 | Oleg     |  33 | Rostov    | 34000.00 |
|  4 | Masha    |  35 | Moscow    | 31500.00 |
|  5 | Ruslan   |  34 | Omsk      | 43000. 00 |
|  6 | Dima     |  32 | SP        | 45000.00 |
|  7 | Roma     |  34 | SP        | 10000.00 |
+----+----------+-----+-----------+----------+

 

Ниже приведен пример, который бы удалил из таблицы CUSTOMERS строку, идентификатор равной 6:

SQL> DELETE FROM CUSTOMERS
WHERE ID = 6;

 

Теперь таблица CUSTOMERS будет иметь следующие записи:

+----+----------+-----+-----------+----------+
| ID | NAME     | AGE | ADDRESS   | SALARY   |
+----+----------+-----+-----------+----------+
|  1 | Maxim    |  35 | Moscow    | 21000.00 |
|  2 | AndreyEx |  38 | Krasnodar | 55500.00 |
|  3 | Oleg     |  33 | Rostov    | 34000.00 |
|  4 | Masha    |  35 | Moscow    | 31500.00 |
|  5 | Ruslan   |  34 | Omsk      | 43000.00 |
|  7 | Roma     |  34 | SP        | 10000.00 |
+----+----------+-----+-----------+----------+

 

Если вы хотите УДАЛИТЬ все записи из таблицы CUSTOMERS, вам не нужно использовать WHERE и запрос DELETE будет выглядеть следующим образом:

SQL> DELETE FROM CUSTOMERS;

 

Теперь таблица КЛИЕНТОВ не будет иметь никаких записей.

Если вы нашли ошибку, пожалуйста, выделите фрагмент текста и нажмите Ctrl+Enter.

SQL SELECT TOP, LIMIT, FETCH FIRST ROWS ONLY, ROWNUM


Предложение SQL SELECT TOP

Предложение SELECT TOP используется для указания количества возвращаемых записей.

Предложение SELECT TOP полезно для больших таблиц с тысячами записи. Возврат большого количества записей может повлиять на производительность.

Примечание: Не все системы баз данных поддерживают Предложение SELECT TOP . MySQL поддерживает предложение LIMIT для выбора ограниченного числа записей, в то время как Oracle использует ВЫБРАТЬ ПЕРВЫЙ n РЯД ТОЛЬКО и ROWNUM .

Синтаксис доступа к SQL Server / MS:

ВЫБЕРИТЕ ТОП номер | процент имя_столбца
ОТ имя_таблицы
ГДЕ условие ;

MySQL Синтаксис:

ВЫБЕРИТЕ имя_столбца
ОТ имя_таблицы
ГДЕ условие
LIMIT номер ;

Oracle 12 Синтаксис:

ВЫБЕРИТЕ имя_столбца
ИЗ имя_таблицы
ЗАКАЗАТЬ ПО имя_столбца
ПОЛУЧИТЕ ПЕРВЫЙ номер ТОЛЬКО РЯД;

Старый синтаксис Oracle:

ВЫБЕРИТЕ имя_столбца
FROM имя_таблицы
ГДЕ ROWNUM <= число ;

Старый синтаксис Oracle (с ORDER BY):

ВЫБРАТЬ *
ИЗ (ВЫБРАТЬ имя_столбца ИЗ имя_таблицы ЗАКАЗАТЬ имя_столбца )
ГДЕ ROWNUM <= число ;


Демо-база данных

Ниже представлен выбор из таблицы «Клиенты» в образце базы данных Northwind:

Идентификатор клиента Имя клиента ContactName Адрес Город Почтовый индекс Страна
1 Альфредс Футтеркисте Мария Андерс Обере, ул. 57 Берлин 12209 Германия
2 Ana Trujillo Emparedados y helados Ана Трухильо Avda. de la Constitución 2222 México D.F. 05021 Мексика
3 Антонио Морено Такерия Антонио Морено Матадерос 2312 Мексика Д.F. 05023 Мексика
4 Вокруг Рога Томас Харди 120 Ганновер пл. Лондон WA1 1DP Великобритания
5 Berglunds snabbköp Кристина Берглунд Berguvsvägen 8 Лулео С-958 22 Швеция


Примеры SQL TOP, LIMIT и FETCH FIRST

Следующий оператор SQL выбирает первые три записи из таблицы «Клиенты». (для SQL Server / MS Access):

Следующий оператор SQL показывает эквивалентный пример для MySQL:

Следующий оператор SQL показывает эквивалентный пример для Оракул:

Пример

ВЫБРАТЬ * ИЗ клиентов
ВЫБРАТЬ ТОЛЬКО ПЕРВЫЕ 3 РЯДЫ;


SQL TOP PERCENT Пример

Следующий оператор SQL выбирает первые 50% записей из Таблица «Клиенты» (для SQL Server / MS Access):

Следующий оператор SQL показывает эквивалентный пример для Оракул:

Пример

ВЫБРАТЬ * ИЗ клиентов
ВЫБРАТЬ ТОЛЬКО ПЕРВЫЕ 50 ПРОЦЕНТНЫХ СТРОК;


ДОБАВИТЬ СТАТЬЮ ГДЕ

Следующий оператор SQL выбирает первые три записи из таблицы «Клиенты», где страна «Германия» (для SQL Server / MS Access):

Следующий оператор SQL показывает эквивалентный пример для MySQL:

Следующий оператор SQL показывает эквивалентный пример для Оракул:

Пример

ВЫБРАТЬ * ИЗ клиентов
ГДЕ Страна = «Германия»
ПОЛУЧАТЬ ТОЛЬКО ПЕРВЫЕ 3 СТРОКИ;



Как удалить записи с помощью Delete в SQL

Управление данными может быть сложной задачей, учитывая огромные объемы данных, с которыми приходится иметь дело. Любой, кто управляет данными, знает, что иногда нам нужно удалить некоторые данные из нашей базы данных из-за изменений в реальном мире. Например, когда магазин прекращает продажу товара, его запись удаляется из базы данных инвентаризации. Это делается с помощью команды SQL Delete. Эта команда является важной и неотъемлемой частью этого языка запросов.

В этой статье о команде удаления SQL мы рассмотрим следующие темы:

  • Что такое удаление в SQL?
  • Синтаксис для использования команды удаления SQL
  • Удаление определенных строк на основе одного условия
  • Удаление определенных строк на основе нескольких условий
  • Удаление всех записей из таблицы

Что такое удаление в SQL?

Команда Delete в SQL является частью языка обработки данных, подъязыка SQL, который позволяет изменять данные в базах данных.Эта команда используется для удаления существующих записей из таблицы. Используя это, вы можете удалить определенные записи на основе условия или все записи из таблицы.

ПРИМЕЧАНИЕ: Крайне важно быть полностью уверенным в использовании этой команды, поскольку она удаляет данные безвозвратно.

Чтобы начать использовать команду «Удалить», нам нужно знать ее синтаксис.

Программа последипломного образования по бизнес-анализу
В партнерстве с Университетом Пердью КУРС ПРОСМОТРА

Синтаксис для использования команды удаления SQL

УДАЛИТЬ ИЗ имя_таблицы

ГДЕ [условие];

  • Таблица, из которой мы хотим удалить строки, указывается в параметре table_name оператора DELETE FROM.
  • Существует необязательное предложение WHERE, в котором мы можем указать условие, в соответствии с которым должны удаляться строки.

ПРИМЕЧАНИЕ. Следует проявлять особую осторожность с предложением WHERE, поскольку без него все строки из таблицы будут удалены.

В предложении WHERE можно указать несколько условий с помощью операторов AND и OR.

Давайте применим концепции, изложенные выше, к строкам таблицы.

Удаление определенных строк на основе одного условия

Возьмем образец таблицы «Employee_details»;

  • Из приведенной выше таблицы, чтобы удалить запись сотрудника с «EmployeeID», равным единице, мы воспользуемся следующим запросом:

  • Чтобы проверить результат запроса в таблице выше, мы воспользуемся командой «SELECT *»:

Как мы видим, одна запись была удалена на основании условия, указанного в предложении WHERE.

  • Из приведенной выше таблицы нам нужно удалить запись сотрудника с именем «Арун»:

Как мы видим, «Имя» имеет тип данных символьной строки, поэтому указанное значение должно быть заключено в одиночные кавычки, без которых система вернет синтаксическую ошибку.

Результатом вышеуказанного запроса будет следующее:

  • Мы также можем удалить несколько строк с помощью одного запроса.

Из приведенной выше таблицы нам нужно удалить все записи о сотрудниках с зарплатой менее 60000:

Это приведет к следующему:

Как видим, удалены четыре строки.

С помощью одного запроса к столбцам можно применить несколько условий. Посмотрим, как это делается.

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

Мы можем использовать операторы AND и OR для объединения нескольких условий в предложении WHERE команды DELETE.

  • При использовании оператора OR все строки, удовлетворяющие одному из указанных условий, удаляются.

Из нашего образца таблицы «Employee_details», чтобы удалить все записи сотрудников, в которых имя сотрудника — «Аджай» или город — «Ченнаи»:

Это приведет к следующему:

Как мы видим, обе строки, удовлетворяющие любому из условий, были удалены.

  • При использовании оператора AND удаляются только строки, удовлетворяющие обоим указанным условиям.

Из приведенной выше таблицы нам нужно удалить все записи для сотрудников, которые принадлежат «Бангалору» и имеют зарплату менее 50000:

Это приведет к следующему:

Как мы видим, была удалена только одна запись, удовлетворяющая обоим условиям.

Давайте посмотрим, что произойдет, если мы не будем использовать предложение WHERE.

Магистерская программа для бизнес-аналитиков
Получите опыт работы с инструментами бизнес-аналитикиПросмотрите программу

Удаление всех записей из таблицы

Крайне важно быть предельно осторожным при использовании команды DELETE для таблицы, поскольку данные удаляются безвозвратно.

  • Без предложения WHERE все записи таблицы удаляются. Если не сделать это намеренно, это может вызвать множество проблем.

Чтобы удалить все записи из нашей таблицы «Employee_details», воспользуемся следующим запросом:

Чтобы проверить, все ли записи удалены, воспользуемся командой SELECT:

Как мы видим, команда SELECT возвращает пустой набор, поскольку все записи из таблицы «Employee_details» были удалены.

  • Мы также можем использовать команду TRUNCATE для удаления всех записей из таблицы.

Это часть языка определения данных, подъязыка SQL, который позволяет создавать и изменять объекты базы данных. Синтаксис этой команды:

Как мы видим, здесь нет предложения WHERE, поэтому эта команда используется только тогда, когда нам нужно очистить содержимое таблицы.

Чтобы удалить все записи из таблицы «Employee_details»:

Чтобы проверить, все ли записи удалены:

Как мы видим, записи были удалены, и таблица возвращает пустой набор.

Получите знания о новейших инструментах и ​​методах бизнес-аналитики с помощью магистерской программы Business Analyst. Запишитесь сейчас!

Следующие шаги

Удаление записей из таблиц и баз данных — огромная часть управления данными. Иногда мы вставляем неправильные данные или данные в таблице устаревают и требуют модификации, все это требует помощи Delete в SQL.

Ознакомьтесь с нашими руководствами, чтобы узнать, как удалить повторяющиеся строки в таблицах и многих операторах SQL.

Теперь, когда вы знаете, как удалять существующие записи, пора вам начать изучать другие команды SQL, чтобы вы могли начать манипулировать и запрашивать данные и продвигаться вперед в своем пути, чтобы стать экспертом в SQL. Если вам понравилась эта статья, вы должны ознакомиться с нашей магистерской программой для бизнес-аналитиков, поскольку она также охватывает А-Я SQL.

У вас есть к нам вопросы? Упомяните их в разделе комментариев нашей статьи «Удаление в SQL», и наши специалисты ответят на них за вас.

Оператор SQL DELETE — с примерами

Как удалить записи в SQL?

DELETE безвозвратно удаляет записи из таблицы.
DELETE может удалить одну или несколько записей в таблице.
Используйте предложение WHERE, чтобы УДАЛИТЬ только определенные записи.

Синтаксис SQL DELETE

Общий синтаксис:

УДАЛИТЬ имя-таблицы
 

Чтобы удалить определенные записи, добавьте предложение WHERE:

УДАЛИТЬ имя-таблицы
 ГДЕ условие
 

3
ПРОДУКТ
Идентификатор
Название продукта
Идентификатор поставщика
Цена за единицу
Упаковка

Примеры SQL DELETE

Проблема : Удалить все продукты.

УДАЛИТЬ продукт
 

Результат: 77 записей удалено.


3
ПРОДУКТ
Идентификатор
Название продукта
Идентификатор поставщика
Цена за единицу
Упаковка

Проблема : Удалить продукты стоимостью более 50 долларов.

УДАЛИТЬ продукт
 ГДЕ UnitPrice> 50
 

Результат: 7 записей удалены.


КЛИЕНТ
Идентификатор
Имя
Фамилия
Город
Страна
Телефон

Проблема : Удалить клиента с Id = 21.

УДАЛИТЬ клиента
 ГДЕ Id = 21
 

Это распространенный сценарий, при котором удаляется одна запись.

Результат: 1 запись удалена.

Оператор удаления строки SQL — Как удалить данные из таблицы с примерами запросов

Я не сомневаюсь, насколько мне нравится работать с SQL как в моих профессиональных, так и в личных проектах.

Его прямолинейность и простота апеллируют к моему желанию иметь четко определенные границы с точки зрения того, что язык будет и не позволит мне «уйти с рук» в отношении синтаксиса.

SQL имеет четкую и лаконичную структуру операций, при которой вводимые пользователем данные диктуются возвращаемыми данными. Отсюда мой комментарий о четко определенных границах синтаксиса.

Хотя я отмечаю его отказоустойчивость (SQL был создан в 1974 году с первоначальной версией 1986 года) в сообществе разработчиков, я также знаю, что при работе с данными может казаться, что даже основы вызывают стресс и страх.

Я здесь, чтобы (надеюсь) пролить свет на одну из основ работы с данными: удаление всей строки данных.

Хотя мы не собираемся подробно описывать процесс создания таблицы в SQL или заполнения этой таблицы данными / обновления этих данных, я связал эти другие статьи на случай, если вы хотите узнать больше или просто нуждаетесь в освежить.

Хорошо, теперь самое интересное — приступим к удалению данных из таблицы!

Обзор строки удаления SQL

Вот таблица с метким названием Cute_Doggos , которую мы будем использовать в качестве примера для начала удаления данных из:

Имя Цвет Порода Возраст Вес Высота Fav_Food Игрушка Fav_Toy Дизлайки Аллергия
ромашка красный Такса стандартная 1 год 14 6 Кусок со вкусом лосося скрипучий мяч птицы летают над двором кошки, бани, чистота
Уинстон чёрно-коричневый ротвейлер 3 года 41 17 буквально все что угодно буксир не вставать с дивана слушать, вести себя, не слюнявить на все
Сэмми светлый мед золотистый ретривер 9 лет 46 19 Кусочки со вкусом говядины ее кровать щенков рамбутсиса неизвестно
пенелопа серый и белый хаски 9 месяцев 16 12 обувь старая снаружи питомник неизвестно

Как вы уже догадались, это фиктивные данные из таблицы, которую я придумал из воздуха 🙂 Однако я надеюсь, что она достаточно хорошо иллюстрирует данные для наших целей.

Как и в большинстве случаев технического характера, также никогда не помешает проверить официальную документацию. Если вы хотите это сделать, у Microsoft есть отличная подробная информация об операторе SQL Delete.

В основе статьи — удаление данных. Действие так же просто, как само имя, и вот его базовый синтаксис:

УДАЛИТЬ ИЗ имя_таблицы

*** С помощью этого синтаксиса вы удалите все строки данных во всей таблице. ***

Итак, для В приведенной выше таблице в качестве примера запрос будет выглядеть следующим образом:

DELETE FROM Cute_Doggos

Это может быть ваша предполагаемая цель, и чем дольше вы пишете SQL, тем больше случаев вы найдете для использования оператора удаления в этом качестве.

Я использовал этот оператор много раз, чтобы очистить таблицу после того, как она была заполнена тестовыми данными. Такой подход позволяет нам поддерживать имена столбцов, типы данных, индексы и общую структуру таблицы в такт, не удаляя саму таблицу.

В качестве примечания: если ваша предполагаемая цель — удалить все строки в таблице, более быстрым подходом будет использование оператора TRUNCATE TABLE, поскольку он использует гораздо меньше системных ресурсов.

Пример запросов на удаление

В подавляющем большинстве случаев, когда вы используете функцию удаления, вы захотите, чтобы ваш подход был более целенаправленным.Для этого мы добавим условие, и синтаксис будет выглядеть так:

DELETE FROM name_of_table WHERE conditions_exist

Используя нашу таблицу собак выше, наш запрос будет выглядеть так:

DELETE FROM Cute_Doggos WHERE dbo.Cute_Doggos.Height> 18

Это приведет к удалению всех записей из нашей таблицы, которые соответствуют нашему условию, когда высота больше 18 . А если вы используете Microsoft SQL Server Manager, вы получите следующий оператор возврата:

(затронута 1 строка)

Если вы хотите увидеть строки данных, которые были удалены (для целей ведения журнала , визуальные указания для пользователей и т. д.), мы можем использовать оператор OUTPUT для этого.

Теперь наша таблица будет выглядеть так:

Имя Цвет Порода Возраст Вес Высота Fav_Food Игрушка Fav_Toy Дизлайки Аллергия
ромашка красный Такса стандартная 1 год 14 6 Кусок со вкусом лосося скрипучий мяч птицы летают над двором кошки, бани, чистота
Уинстон чёрно-коричневый ротвейлер 3 года 41 17 буквально все что угодно буксир не вставать с дивана слушать, вести себя, не слюнявить на все
пенелопа серый и белый хаски 9 месяцев 16 12 обувь старая снаружи питомник неизвестно

Условие, которое мы устанавливаем, полностью наш выбор, и если это слишком узко для ваших нужд, есть другие варианты.

Допустим, вас не интересуют конкретные удаляемые записи, а только то, что вам нужно удалить определенное количество записей в таблице.

DELETE TOP 2 FROM Cute_Doggos

Вы могли подумать, что этот запрос удалит самые первые две записи в вашей таблице — и вы не так уж далеко. Единственная проблема заключается в том, что поскольку SQL хранит записи в случайном порядке, этот синтаксис удалит из таблицы 2 RANDOM записей.

Если вы хотите удалить какой-то процент записей, SQL тоже может это сделать:

УДАЛИТЬ 25 ПРОЦЕНТОВ ИЗ Cute_Doggos

Опять же, этот запрос удалит RANDOM записей.В нашем примере, поскольку у нас есть 4 записи, этот запрос удалит 1 случайную запись (4 * 0,25 = 1).

В качестве последнего примечания, при использовании ключевого слова TOP мы не можем использовать предложение ORDER BY из-за случайности хранения записей.

Завершение

Теперь, когда вы увидели оператор DELETE в действии, вы готовы выйти на улицу и извлечь все данные из всех таблиц! Может быть, не делайте этого, так как восстановление из резервных копий займет у вас долгие выходные 🙂

В любом случае, теперь вы готовы начать использовать его с пользой.

Если вы нашли эту статью полезной, загляните в мой блог (в настоящее время я перестраиваю его в Gatsby / WordPress, так что ждите статьи об этом), где я часто публикую статьи о веб-разработке, жизни и обучении.

Пока вы там, почему бы не подписаться на мою рассылку новостей? Вы можете сделать это в правом верхнем углу главной страницы блога. Мне нравится присылать интересные статьи (свои и другие), ресурсы и инструменты для разработчиков время от времени.

Если у вас есть вопросы по этой статье или просто дайте мне знать — приходите поздороваться в Twitter или в любой из моих других социальных сетей, которые вы можете найти под рассылкой новостей, подпишитесь на главной странице моего блога или в моем профиле здесь, на freeCodeCamp 🙂

Хорошего дня! Удачного обучения и удачного программирования, друг.

MySQL :: Справочное руководство MySQL 8.0 :: 13.2.2 Оператор DELETE

DELETE — это оператор DML, который удаляет строки из таблицы.

Оператор DELETE может начинаться с С предложением для определения общей таблицы выражения, доступные в УДАЛИТЬ . См. Раздел 13.2.15, «WITH (общие табличные выражения)».

Синтаксис одной таблицы
  УДАЛИТЬ [LOW_PRIORITY] [QUICK] [IGNORE] FROM  имя_таблицы  [[AS]  псевдоним_таблицы ]
    [РАЗДЕЛ ( имя_раздела  [,  имя_раздела ])...)]
    [WHERE  where_condition ]
    [СОРТИРОВАТЬ ПО ...]
    [LIMIT  row_count ]  

Оператор DELETE удаляет строки из tbl_name и возвращает количество удаленные строки. Чтобы проверить количество удаленных строк, вызовите ROW_COUNT () функция, описанная в Раздел 12.16, «Информационные функции».

Основные статьи

Условия в дополнительном пункте WHERE определить, какие строки нужно удалить.Без ГДЕ предложение, все строки удаляются.

где_условие — выражение, которое оценивается как истина для каждой удаляемой строки. Он указан как описано в Раздел 13.2.10, «Оператор SELECT».

Если указано предложение ORDER BY , строки удаляются в указанном порядке. В LIMIT Пункт устанавливает ограничение на количество строки, которые можно удалить.Эти пункты применяются к одиночным таблицам удаляет, но не удаляет несколько таблиц.

Синтаксис для нескольких таблиц
  УДАЛИТЬ [LOW_PRIORITY] [QUICK] [IGNORE]
      имя_таблицы  [. *] [,  имя_таблицы  [. *]] ...
    ИЗ  table_references 
    [WHERE  where_condition ]

УДАЛИТЬ [LOW_PRIORITY] [QUICK] [IGNORE]
    FROM  имя_таблицы  [. *] [,  имя_таблицы  [. *]] ...
    ИСПОЛЬЗОВАНИЕ  table_references 
    [ГДЕ , где_условие ]  
Привилегии

Вам нужна привилегия DELETE на table, чтобы удалить из него строки.Вам нужно только SELECT привилегия для любых столбцов которые только читаются, например, те, которые указаны в ГДЕ пункт.

Производительность

Когда вам не нужно знать количество удаленных строк, TRUNCATE TABLE оператор является более быстрый способ очистить стол, чем DELETE выписка без WHERE clause. в отличие УДАЛИТЬ , TRUNCATE TABLE не может быть использован внутри транзакции или если у вас есть блокировка таблицы.Видеть Раздел 13.1.37, «Оператор TRUNCATE TABLE» и Раздел 13.3.6, «Операторы LOCK TABLES и UNLOCK TABLES».

На скорость операций удаления также могут влиять факторы. обсуждается в Раздел 8.2.5.3, «Оптимизация операторов DELETE».

Чтобы гарантировать, что данный УДАЛИТЬ не занимает много времени, специфичный для MySQL LIMIT row_count пункт для DELETE определяет максимальное количество удаляемых строк.Если количество строк до удаление превышает лимит, повторите DELETE до количества затронутых строк меньше значения LIMIT .

Подзапросы

Вы не можете удалить из таблицы и выбрать из той же таблицы в подзапрос.

Опора для разделенных таблиц

DELETE поддерживает явный выбор раздела используя предложение PARTITION , которое принимает список разделенных запятыми имен одного или нескольких разделов или подразделы (или оба), из которых можно выбрать строки для удаления.Разделы, не включенные в список, игнорируются. Учитывая многораздельная таблица t с разделом с именем p0 , выполнение оператора DELETE FROM t PARTITION (p0) оказывает такое же влияние на таблицу как выполнение ALTER ТАБЛИЦА t ОБРЕЗАТЬ РАЗДЕЛ (p0) ; в обоих случаях все строки в разделе сбрасываются p0 .

РАЗДЕЛ можно использовать вместе с ГДЕ условие, в этом случае условие проверено только на строках в перечисленных разделах.Например, УДАЛИТЬ ИЗ РАЗДЕЛА t (p0), ГДЕ c <5 удаляет строки только из раздела p0 , для которого выполняется условие c <5 ; строк в любых другие разделы не проверяются и, следовательно, на них не распространяется УДАЛИТЬ .

Предложение PARTITION также может использоваться в несколько таблиц DELETE операторов. Ты можешь использовать до одной такой опции для каждой таблицы, названной в ИЗ вариант.

Для получения дополнительной информации и примеров см. Раздел 24.5, «Выбор раздела».

Столбцы с автоматическим приращением

Если вы удалите строку, содержащую максимальное значение для AUTO_INCREMENT столбец, значение не используется повторно для MyISAM или InnoDB Таблица. Если вы удалите все строки в таблице с помощью DELETE ИЗ имя_таблицы (без WHERE clause) в autocommit mode, последовательность запускается заново для всех механизмов хранения, кроме InnoDB и MyISAM .Есть некоторые исключения из этого поведения для InnoDB таблицы, как описано в Раздел 15.6.1.6, «Обработка AUTO_INCREMENT в InnoDB».

Для таблиц MyISAM можно указать AUTO_INCREMENT вторичный столбец в ключ из нескольких столбцов. В этом случае повторное использование значений, удаленных из начало последовательности встречается даже для MyISAM столы. См. Раздел 3.6.9, «Использование AUTO_INCREMENT».

Модификаторы

Оператор DELETE поддерживает следующие модификаторы:

  • Если вы укажете модификатор LOW_PRIORITY , сервер задерживает выполнение УДАЛИТЬ , пока не прекратятся другие клиенты читаем из таблицы.Это влияет только на механизмы хранения. которые используют только блокировку на уровне таблицы (например, MyISAM , ПАМЯТЬ и MERGE ).

  • Для таблиц MyISAM , если вы используете QUICK модификатор, механизм хранения не работает. индекс слияния уходит во время удаления, что может ускорить некоторые виды операций удаления.

  • Модификатор IGNORE заставляет MySQL игнорировать игнорируемые ошибки в процессе удаления строк.(Ошибки обнаруженные на этапе синтаксического анализа, обрабатываются в обычным способом.) Ошибки, которые игнорируются из-за использования IGNORE возвращаются как предупреждения. Для большего Для получения дополнительной информации см. «Влияние IGNORE на выполнение оператора».

Порядок удаления

Если оператор DELETE включает ORDER BY , строки удаляются в порядке указанные в пункте. Это полезно в первую очередь в сочетании с LIMIT .Например, следующие оператор находит строки, соответствующие предложению WHERE , сортирует их по timestamp_column и удаляет первый (самый старый):

  УДАЛИТЬ ИЗ somelog WHERE user = 'jcole'
ORDER BY timestamp_column LIMIT 1;  

ORDER BY также помогает удалять строки в заказе требуется, чтобы избежать нарушений ссылочной целостности.

Таблицы InnoDB

Если вы удаляете много строк из большой таблицы, вы можете превысить размер таблицы блокировок для таблицы InnoDB .К избежать этой проблемы или просто свести к минимуму время, в течение которого стол остается заблокированным, следующая стратегия (которая не использует DELETE вообще) может быть полезно:

  1. Выберите строки , а не , которые нужно удалить в пустая таблица, имеющая ту же структуру, что и исходная таблица:

      INSERT INTO t_copy SELECT * FROM t WHERE ...;  
  2. Используйте RENAME TABLE , чтобы атомарно переместите исходную таблицу в сторону и переименуйте копию в исходное название:

      ПЕРЕИМЕНОВАНИЕ ТАБЛИЦЫ t TO t_old, t_copy TO t;  
  3. Отбросьте исходную таблицу:

      ТАБЛИЦА ПАДЕНИЯ t_old;  

Никакие другие сеансы не могут получить доступ к задействованным таблицам, пока RENAME TABLE выполняется, поэтому Операция переименования не вызывает проблем с параллелизмом.Видеть Раздел 13.1.36, «Оператор RENAME TABLE».

Таблицы MyISAM

В таблицах MyISAM удаленные строки сохраняются. в связанном списке и последующих INSERT операций повторно используют старую строку позиции. Чтобы освободить неиспользуемое пространство и уменьшить размер файлов, используйте OPTIMIZE TABLE заявление или myisamchk Утилита для реорганизации таблиц. ТАБЛИЦА ОПТИМИЗАЦИИ проще в использовании, но myisamchk шустрее.Видеть Раздел 13.7.3.4, «Оператор OPTIMIZE TABLE» и Раздел 4.6.4, «myisamchk - Утилита обслуживания таблиц MyISAM».

Модификатор QUICK влияет на то, покидает ли индекс объединяются для операций удаления. УДАЛИТЬ БЫСТРО наиболее полезен для приложений, в которых значения индекса для удаленных строки заменяются аналогичными значениями индекса из вставленных строк позже. В этом случае повторно используются дыры, оставленные удаленными значениями.

БЫСТРОЕ УДАЛЕНИЕ не используется при удалении значений приводит к неполному заполнению индексных блоков, охватывающих диапазон значений индекса для которых снова появляются новые вставки.В этом случае использование QUICK может привести к потере места в индексе что остается невостребованным. Вот пример такого сценария:

  1. Создайте таблицу, содержащую индексированный AUTO_INCREMENT столбец.

  2. Вставьте много строк в таблицу. Каждая вставка приводит к значение индекса, которое добавляется к верхнему пределу индекса.

  3. Удалить блок строк в нижнем конце диапазона столбцов используя DELETE QUICK .

В этом сценарии индексные блоки, связанные с удаленным значения индекса не заполняются, но не объединяются с другими index блоков за счет использования QUICK . Они остаются незаполненными при новых вставках, потому что новые строки не имеют значения индекса в удаленном диапазоне. Кроме того, они остаются недостаточно заполнен, даже если вы позже воспользуетесь DELETE без QUICK , если только некоторые из удаленных значений индекса оказываются в индексных блоках внутри или рядом с недозаполненные блоки.Чтобы освободить неиспользуемое пространство индекса под этими обстоятельства, используйте OPTIMIZE TABLE .

Если вы собираетесь удалить много строк из таблицы, это может быть быстрее использовать УДАЛИТЬ БЫСТРО с последующим ТАБЛИЦА ОПТИМИЗАЦИИ . Это восстанавливает index вместо выполнения многих операций слияния блоков индекса.

Удаление нескольких таблиц

Вы можете указать несколько таблиц в DELETE инструкция для удаления строк из одной или нескольких таблиц в зависимости от условия в WHERE clause.Вы не можете использовать ЗАКАЗАТЬ BY или LIMIT в многостоловой УДАЛИТЬ . В table_references пункт перечисляет таблицы, участвующие в объединении, как описано в Раздел 13.2.10.2, «Пункт JOIN».

Для первого синтаксиса с несколькими таблицами только соответствующие строки из таблицы, перечисленные перед пунктом FROM , являются удалено. Для второго синтаксиса с несколькими таблицами только совпадающие строки из таблиц, перечисленных в пункте ИЗ (перед предложением USING ) удаляются.В эффект заключается в том, что вы можете удалять строки из многих таблиц одновременно time и есть дополнительные таблицы, которые используются только для поиска:

  УДАЛИТЬ t1, t2 ИЗ t1 ВНУТРЕННЕЕ СОЕДИНЕНИЕ t2 ВНУТРЕННЕЕ СОЕДИНЕНИЕ t3
ГДЕ t1.id = t2.id И t2.id = t3.id;  

Или же:

  УДАЛИТЬ ИЗ t1, t2 ИСПОЛЬЗУЯ t1 ВНУТРЕННЕЕ СОЕДИНЕНИЕ t2 ВНУТРЕННЕЕ СОЕДИНЕНИЕ t3
ГДЕ t1.id = t2.id И t2.id = t3.id;  

Эти операторы используют все три таблицы при поиске строк для удалить, но удалить совпадающие строки только из таблиц t1 и t2 .

В предыдущих примерах используется INNER JOIN , но несколько таблиц DELETE операторов может использовать другие типы соединений, разрешенные в SELECT операторов, например ЛЕВОЕ СОЕДИНЕНИЕ . Например, чтобы удалить строки, существуют в t1 , которые не совпадают в t2 , используйте LEFT JOIN :

  УДАЛИТЬ t1 ИЗ t1 ЛЕВОЕ СОЕДИНЕНИЕ t2 НА t1.id = t2.id ГДЕ t2.id ЕСТЬ NULL;  

Синтаксис разрешает .* после каждого имя_таблицы для совместимости с Доступ .

Если вы используете многотабличный DELETE оператор, включающий таблиц InnoDB , для которых есть ограничения внешнего ключа, оптимизатор MySQL может обрабатывают таблицы в порядке, отличном от их родительско-дочерние отношения. В этом случае утверждение не выполняется и откатывается. Вместо этого вы должны удалить из одной таблицы и полагаться на возможности ON DELETE , которые InnoDB позволяет заставить другие таблицы быть изменен соответствующим образом.

Примечание

Если вы объявляете псевдоним для таблицы, вы должны использовать псевдоним, когда ссылаясь на таблицу:

  УДАЛИТЬ t1 ИЗ теста AS t1, test2 ГДЕ ...  

Псевдонимы таблиц в нескольких таблицах DELETE следует декларировать только в table_references часть утверждение. В других местах ссылки на псевдонимы разрешены, но не на псевдонимы. декларации.

Верный:

  УДАЛИТЬ a1, a2 ИЗ t1 КАК a1 ВНУТРЕННЕЕ СОЕДИНЕНИЕ t2 КАК a2
ГДЕ a1.id = a2.id;

УДАЛИТЬ ИЗ a1, a2 ИСПОЛЬЗУЯ t1 КАК a1 ВНУТРЕННЕЕ СОЕДИНЕНИЕ t2 КАК a2
ГДЕ a1.id = a2.id;  

Неправильно:

  УДАЛИТЬ t1 КАК a1, t2 КАК a2 ИЗ t1 ВНУТРЕННЕГО СОЕДИНЕНИЯ t2
ГДЕ a1.id = a2.id;

УДАЛИТЬ ИЗ t1 КАК a1, t2 КАК a2 ИСПОЛЬЗУЯ t1 ВНУТРЕННЕЕ СОЕДИНЕНИЕ t2
ГДЕ a1.id = a2.id;  

Псевдонимы таблиц также поддерживаются для одиночных таблиц. DELETE операторов, начиная с MySQL 8.0.16. (Ошибка № 89410, Ошибка № 27455809)

SQL УДАЛИТЬ


Вы уже знаете, как извлекать, вставлять и обновлять данные в таблице базы данных SQL.В этой главе мы узнаем, как удалить данные из таблицы с помощью команды SQL DELETE.

Используя нашу таблицу Users, мы проиллюстрируем использование SQL DELETE. Один из пользователей в таблице «Пользователи» (Стивен Грант) только что покинул компанию, и ваш начальник попросил вас удалить его запись. Как ты это делаешь? Рассмотрим инструкцию SQL ниже:

УДАЛИТЬ ОТ пользователей ГДЕ LastName = 'Grant'

Первая строка в приведенном выше операторе SQL DELETE указывает таблицу, из которой мы удаляем запись (записи).Вторая строка (предложение WHERE) указывает, какие именно строки мы удаляем (в нашем случае все строки с LastName равным «Grant»). Как видите, SQL-запросы DELETE имеют очень простой синтаксис и фактически очень близки к естественному языку. Но подождите, в приведенном выше утверждении что-то не так! Проблема в том, что у нас есть несколько пользователей с фамилией «Грант», и все пользователи с этой фамилией будут удалены. Поскольку мы не хотим этого делать, нам нужно найти поле таблицы или комбинацию полей, которые однозначно идентифицируют пользователя Стивена Гранта.Если посмотреть на таблицу «Пользователи», очевидным кандидатом на такое уникальное поле является столбец «Электронная почта» (маловероятно, что разные пользователи используют один и тот же адрес электронной почты). Наш улучшенный запрос SQL, который удаляет только запись Стивена Гранта, будет выглядеть так:

УДАЛИТЬ ОТ пользователей ГДЕ Электронная почта = '[email protected]'

Что произойдет, если вы не укажете предложение WHERE в запросе DELETE?

УДАЛИТЬ ОТ пользователей

Ответ - все записи в таблице Users будут удалены.Приведенный ниже оператор SQL TRUNCATE будет иметь тот же эффект, что и последний оператор DELETE:

TRUNCATE TABLE Пользователи

Оператор TRUNCATE удалит все строки в таблице Users, не удаляя саму таблицу.

Будьте очень осторожны при использовании DELETE и TRUNCATE, потому что вы не можете отменить эти операторы, и после удаления строки (строк) из вашей таблицы они исчезают навсегда, если у вас нет резервной копии.

Введение в оператор Delete

Оператор DELETE используется для удаления строк из таблицы данных SQL Server.В этой статье мы узнаем, как использовать оператор DELETE. Мы обсуждаем некоторые передовые практики, ограничения и подводим итоги на нескольких примерах.

Это четвертая статья в серии статей. Вы можете начать с самого начала, прочитав Введение в операторы изменения данных SQL Server.

Все примеры для этого урока основаны на Microsoft SQL Server Management Studio и базе данных AdventureWorks2012. Вы можете начать использовать эти бесплатные инструменты, используя мое Руководство Начало работы с SQL Server

Прежде чем мы начнем

Хотя в этой статье в качестве примеров используется база данных AdventureWorks, я решил создать примерную таблицу для использования в базе данных, чтобы лучше проиллюстрировать примеры.Здесь вы можете найти скрипт, который вам понадобится для запуска.

Кроме того, давайте сначала заполним таблицу некоторыми данными, используя следующий оператор INSERT:

 С topSalesPerson (FullName, SalesLastYear, City, rowguid)
В ВИДЕ (
ВЫБЕРИТЕ S.FirstName + '' + S.LastName, S.SalesLastYear, S.City, NEWID ()
ОТ Sales.vSalesPerson S
ГДЕ S.SalesLastYear> 1000000
)
ВСТАВИТЬ В esqlSalesPerson (FullName, SalesLastYear, City, rowguid)
       ВЫБЕРИТЕ FullName, SalesLastYear, City, rowguid
       ОТ topSalesPerson 

Вы можете узнать больше об операторе INSERT, прочитав нашу статью Введение в оператор INSERT.

Базовая структура оператора DELETE

Оператор DELETE используется для изменения значений столбца.

Оператор DELETE состоит из трех компонентов:

  1. Таблица, из которой нужно удалить строки.
  2. Критерий, используемый для выбора строк для удаления.

Общий формат оператора DELECT:

 УДАЛИТЬ
ОТ tableName
ГДЕ searchCondition
… 

Теперь мы собираемся выполнить несколько примеров DELETE, поэтому, если вы еще этого не сделали, запустите сценарий, чтобы создать таблицу esqlSalesPerson.

Простой пример - удаление каждой строки

Когда вы используете DELETE без предложения WHERE, он удаляет каждую строку из таблицы. Если мы хотим удалить все из esqlSalesPerson, мы могли бы запустить:

 УДАЛИТЬ
ОТ esqlSalesPerson 

Я бы рекомендовал для целей нашего примера заключить команду DELETE в транзакцию, чтобы вам не приходилось многократно вставлять строки в базу данных примера. Здесь вы увидите тот же оператор DELETE.

 НАЧАТЬ СДЕЛКУ
ВЫБРАТЬ СЧЕТЧИК (1) ОТ esqlSalesPerson

УДАЛИТЬ
ОТ esqlSalesPerson

ВЫБРАТЬ СЧЕТЧИК (1) ОТ esqlSalesPerson
ОТКАТ 

Первый оператор счетчика возвращает 13 строк; тогда как второй возвращает 0.Поскольку я ОТКАТИВАЮ транзакцию, операция удаления не является постоянной.

Простой пример - удаление одной строки

Более реалистичный вариант использования - удаление одной строки. Во многих приложениях это достигается путем фильтрации по одной строке.

Если вы знаете первичный ключ, вы золотой, поскольку первичный ключ уникален и предназначен для точной идентификации каждой строки.

Предположим, мы хотим удалить строку Джиллиан Карсон. Для этого мы выдадим следующее:

 УДАЛИТЬ
ОТ esqlSalesPerson
ГДЕ SalesPersonID = 10095 

Вам может быть интересно, как узнать первичный ключ.

Вы можете представить себе, что если бы у вас было веб-приложение, в котором перечислены все продавцы, сетка может содержать полное имя продавца и прошлогодние продажи, но в таблице также будет скрыт их SalesPersonID.

Когда пользователь выбирает строку в сетке и решает удалить строку, приложение извлекает скрытый первичный ключ для строки, а затем отправляет команду удаления в базу данных.

Простой пример - удаление нескольких строк

Предположим, мы хотим показать только высокоэффективных продавцов в таблице esqlSalesPerson.Мы только хотим, чтобы продавцы с прошлогодними продажами превышали или равнялись 2000000 долларов.

Поскольку наша таблица содержит те, у которых количество меньше этого, нам нужно удалить их, выполнив следующее:

 УДАЛИТЬ
ОТ esqlSalesPerson
ГДЕ Распродажа в прошлом году> 2000000.00 

Вы можете запустить следующую команду, чтобы попробовать сценарий в транзакции:

 НАЧАТЬ СДЕЛКУ
ВЫБРАТЬ СЧЕТЧИК (1) ОТ esqlSalesPerson

УДАЛИТЬ
ОТ esqlSalesPerson
ГДЕ SalesLastYear <2000000.00

ВЫБЕРИТЕ FullName, SalesLastYear
ОТ esqlSalesPerson
ОТКАТ 

Вот результат запуска скрипта:

Синяя стрелка показывает, что изначально было 13 записей, а красная - оставшиеся, продажи которых превышают или равны двум миллионам долларов.

Вы также можете создавать более сложные условия фильтрации. Позже в статье мы покажем, как использовать подзапрос. Вы также можете использовать логические условия в предложении WHERE так же, как и в операторе SELECT.

Соображения при использовании оператора DELETE

Чтобы удалить все строки в таблице, используйте TRUNCATE TABLE. Это намного быстрее, чем DELETE, поскольку регистрирует изменения. Но есть ключевые отличия (см. Ниже DELETE - это не TRUNCATE!)

Также не забывайте, что вы можете использовать функцию @@ ROWCOUNT, чтобы узнать, сколько строк было удалено.

Обработка ошибок

Если оператор DELETE вызывает ошибку, все строки восстанавливаются до своего состояния до выполнения оператора. Если возникает ошибка, никакие строки не удаляются.

Есть много причин, по которым оператор удаления может не работать. Вот некоторые из наиболее типичных:

  • Сиротские строки - если ограничение FOREIGN KEY определено между двумя таблицами, такими как parentTable и childTable, то DELETE строка parentTable вызовет ошибку, если существуют строки childTable, связанные с родительским. Чтобы решить эту проблему, сначала нужно удалить соответствующие строки childTable, а затем строку parentTable.
  • Арифметические ошибки - Если оценка выражения приводит к арифметической ошибке, такой как деление на ноль, DELETE отменяется, и строки не удаляются.

Поведение при блокировке

Оператор удаления устанавливает исключительную (X) блокировку на таблицу. Это означает, что никакой другой запрос не может изменять данные таблицы до завершения транзакции DELETE.

Вы все еще можете читать данные, но вам нужно использовать подсказку NOLOCK или прочитать незафиксированный уровень изоляции.

DELETE не является TRUNCATE!

Удалить не TRUNCATE! Используйте DELETE, чтобы удалить одну или несколько строк из таблицы. TRUNCATE следует рассматривать только в особых случаях, например, когда вам нужно вернуть таблицу в исходное состояние.

Многие люди путают DELETE и TRUNCATE. ЕСЛИ вы не уверены, я бы порекомендовал прочитать свой пост на тему «В чем разница между усечением и удалением в SQL Server?»

Сложный пример - УДАЛЕНИЕ с использованием подзапроса

Вы также можете создать более сложный оператор удаления. Практически любое предложение, которое вы можете записать в предложение WHERE оператора SELECT, можно записать в оператор DELETE, включая подзапросы в предложении WHERE.

Приведем пример.

Предположим, вам нужно удалить всех продавцов, проживающих в США, из таблицы esqlSalesPerson. Хотя в нашей таблице есть город, в нем нет страны. Мы можем обойти это с помощью подзапроса.

 НАЧАТЬ СДЕЛКУ
ВЫБРАТЬ СЧЕТЧИК (1) ОТ esqlSalesPerson

УДАЛИТЬ
ОТ esqlSalesPerson
ГДЕ esqlSalesPerson.City В
       (ВЫБЕРИТЕ ОТЛИЧНЫЙ город
        ОТ Person.Address A
        ВНУТРЕННЕЕ СОЕДИНЕНИЕ Person.StateProvince S
              НА A.StateProvinceID = S.StateProvinceID
                 И С.CountryRegionCode = 'США')

ВЫБЕРИТЕ FullName, SalesLastYear
ОТ esqlSalesPerson
ОТКАТ 

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

Подзапрос окрашен в синий цвет. Обратите внимание, что он ничем не отличается от любого другого коррелированного подзапроса, который вы, возможно, использовали в прошлом.

Механизм этого оператора DELETE:

  1. Найдите отдельные города для всех людей, живущих в США.
  2. УДАЛИТЬ продавцов, чей город находится в этом списке.

Первый шаг является результатом подзапроса.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *