Delete from: DELETE (Transact-SQL) — SQL Server

Удаление строк из таблицы (DELETE FROM) — Справочник Web-языков

Материал из Справочник Web-языков

Перейти к: навигация, поиск

Удаление записей осуществляется командой DELETE FROM.

DELETE [LOW_PRIORITY | QUICK] FROM table_name
    [WHERE where_definition]
    [ORDER BY ...]
    [LIMIT rows]

или

DELETE [LOW_PRIORITY | QUICK] table_name[.*] [,table_name[.*] ...]
    FROM table-references
    [WHERE where_definition]

или

DELETE [LOW_PRIORITY | QUICK]
    FROM table_name[.*], [table_name[.*] ...]
    USING table-references
    [WHERE where_definition]

Команда DELETE удаляет из таблицы table_name все записи, удовлетворяющие условию where_definition. Если условие WHERE where_definition не задано, то из таблицы table_name удаляются все записи.

Команда DELETE возвращает количество удаленных записей.

Следует учитывать, что если в команде DELETE не задано условие WHERE where_definition, то команда возвратит 0, хотя записи были удалены.

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

DELETE FROM
    `users`
WHERE
    1=1

Но в этом случае выполнение команды происходит значительно медленнее.

LOW_PRIORITY
— Если указано это ключевое слово, то удаление записей из таблицы table_name не будет произведено до тех пор, пока другие процессы не закончат чтение их этой таблицы.
QUICK
— Если указано это ключевое слово, то при удалении записей обработчик таблицы не будет объединять индексы, что может ускорить операцию удаления.
table_name
— Имя таблицы в базе данных, из которой будет происходить удаление строк.
LIMIT
— Задает максимальное количество строк, которые могут быть удалены за текущий запрос.
Следующий запрос удалит из таблицы users только 5 строк:
DELETE FROM
    `users`
LIMIT
    5
ORDER BY
— Задает имя поля, или имена полей через запятую, по которым происходит сортировка удаляемых записей.
Эта возможность актуальна при необходимости удалить только определенное кол-во записей, отсортированных по какому-либо свойству.
Следующий пример удалит из таблицы users запись самого молодого человека.
Допустим таблица users имеет следующий вид:
CREATE TABLE
    `users`(
        `name` VARCHAR(255) NOT NULL,
        `age` SMALLINT(3) NOT NULL
    )
Запишем в нее несколько записей:
INSERT INTO
    `users` (
        `name`, `age`
    )
VALUES
    ('Миша', 25),
    ('Ксюша', 15),
    ('Настя', 12),
    ('Саша', 26),
    ('Дима', 30)
Таблица users имеет значения:
SELECT
    *
FROM
    `users`
+-------+-----+
| name  | age |
+-------+-----+
| Миша  |  25 |
| Ксюша |  15 |
| Настя |  12 |
| Саша  |  26 |
| Дима  |  30 |
+-------+-----+
5 rows in set (0.00 sec)
Удаляем самого молодого:
DELETE FROM
    `users`
ORDER BY
    `age`
LIMIT
    1
Теперь таблица имеет значения:
SELECT
    *
FROM
    `users`
+-------+-----+
| name  | age |
+-------+-----+
| Миша  |  25 |
| Ксюша |  15 |
| Саша  |  26 |
| Дима  |  30 |
+-------+-----+
4 rows in set (0. 00 sec)
Можем также удалить самого старого:
DELETE FROM
    `users`
ORDER BY
    `age` DESC
LIMIT
    1
Теперь таблица имеет значения:
SELECT
    *
FROM
    `users`
+-------+-----+
| name  | age |
+-------+-----+
| Миша  |  25 |
| Ксюша |  15 |
| Саша  |  26 |
+-------+-----+
3 rows in set (0.00 sec)
Сортировка удаляемых записей при помощи команды ORDER BY появилась в MySQL начиная с версии 4.0.
FROM table-references и USING …
— Позволяют удалять записи сразу из нескольких таблиц руководствуясь многотабличным условием WHERE where_definition.
Следующие два примера равнозначны по производимым действиям и удаляют одинаковые записи в таблицах table_1 и table_2 и используя при поиске значений еще и таблицу table_3:
DELETE
    `table_1`,
    `table_2`
FROM
    `table_1`,
    `table_2`,
    `table_3`
WHERE
    `table_1`. `id`=`table_2`.`id` &&
    `table_2`.`id`=`table_3`.`id`
Аналогичный запрос:
DELETE FROM
    `table_1`,
    `table_2`
USING
    `table_1`,
    `table_2`,
    `table_3`
WHERE
    `table_1`.`id`=`table_2`.`id` &&
    `table_2`.`id`=`table_3`.`id`
Возможность многотабличного удаления записей появилась в MySQL начиная с версии 4.0.
База данных

. Является ли в SQL «ОТ» в «УДАЛИТЬ ИЗ» необязательным, если вы планируете использовать «ГДЕ»?

спросил

Изменено 8 месяцев назад

Просмотрено 16 тысяч раз

Я новичок в SQL. У нас есть код, который должен работать на SQL Server 2005/2008, Oracle 10, а также на Sybase.

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

, обновить и удалить .

удалить один оказался озадачивающим — иногда я вижу такие утверждения, как:

 удалить телефонную_книгу, где ...
 

в отличие от:

 удалить из телефонной_книги, где ...
 

Итак… является ли ключевое слово из действительно необязательным в данном случае? Вызывает ли это какие-либо проблемы? Это просто плохой стиль, или это не имеет значения?

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

Вопросы/комментарии/ссылки приветствуются (или приветствуются?).

  • sql
  • база данных
  • tsql
  • sql-delete
  • удалить строку
2

В этом месте

ОТ не является обязательным (SQL Server, Oracle, Sybase).

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

Также обратите внимание, что ваш образец FROM отличается от следующего, где он является обязательным:

 УДАЛИТЬ phone_book FROM some_table WHERE ...
 
2

Краткий ответ: ответ Luceros правильный: это необязательно

Мне нужно поддерживать sql и адаптировать его между sql-сервером и Oracle. Вот несколько правил:

  1. Пишите скрипты вручную, не используйте сгенерированный код.
  2. Всегда используйте INSERT INTO.
  3. Всегда УДАЛИТЬ — без ОТ.
  4. Не использовать » — идентификатор в кавычках.
  5. Удалить все [ ] и dbo. (Имена схем)
  6. Внимание, когда вы видите УДАЛИТЬ… ИЗ…
  7. Внимание, когда вы видите ОБНОВЛЕНИЕ… ОТ…
  8. Для операторов ORACLE Select требуется предложение from, которое вы можете использовать из DUAL

    1. ОК, вы можете заскриптовать свои объекты и редактировать их стандартным способом
      • USE [Current_DB] — вы не хотите, чтобы ссылка на вашу тестовую базу данных попадала в производственный скрипт
      • SET ANSI_NULLS ON — один раз решить, какие настройки использовать — не включать и не выключать
      • SET QUOTED_IDENTIFIER ON — идентификаторы в кавычках чувствительны к регистру.
    2. INSERT INTO требуется для Oracle.
    3. Это мой личный стиль, не используйте необязательное ключевое слово, изучите значения по умолчанию
    4. Вы должны указать идентификатор в кавычках, если вы используете одно из зарезервированных ключевых слов ORACLES в качестве имени столбца, мы попали в эту ловушку, и в конечном итоге было бы лучше переименовать столбец на стороне sql-Server.
    5. Oracle их не использует.
    6. Oracle не поддерживает этот синтаксис.
    7. Oracle не поддерживает этот синтаксис.
1

Согласно документации Microsoft SQL Server, FROM является необязательным.

2

из является необязательным в удалить из в этих трех СУБД, но является обязательным в соответствии со стандартом SQL. Я бы всегда использовал для удаления из , чтобы упростить миграцию кода SQL из одной СУБД в другую.

В SQL Server , ИЗ из УДАЛИТЬ ИЗ является необязательным, а УДАЛИТЬ

без ИЗ не является стандартом SQL , а УДАЛИТЬ ИЗ — это стандарт SQL .

Я экспериментировал УДАЛИТЬ ИЗ и УДАЛИТЬ без ИЗ на SQL Server , MySQL , PostgreSQL и SQLite , как показано ниже:

База данных УДАЛИТЬ ИЗ УДАЛИТЬ
SQL Server Возможно Возможно
MySQL Возможно Невозможно
PostgreSQL Возможно Невозможно
SQLite Возможно
Невозможно

Кроме того, я еще экспериментировал ВСТАВИТЬ В и ВСТАВЬТЕ без В на SQL Server , MySQL , PostgreSQL и SQLite , как показано ниже.

База данных ВСТАВКА В ВСТАВКА
SQL Server Возможно Возможно
MySQL Возможно Возможно
PostgreSQL Возможно Невозможно
SQLite Возможно Невозможно

Зарегистрируйтесь или войдите

Зарегистрируйтесь с помощью Google

Зарегистрироваться через Facebook

Зарегистрируйтесь, используя электронную почту и пароль

Опубликовать как гость

Электронная почта

Обязательно, но не отображается

Опубликовать как гость

Электронная почта

Требуется, но не отображается

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

sql — Как удалить из выбора в MySQL?

спросил

Изменено 6 лет, 2 месяца назад

Просмотрено 237 тысяч раз

Этот код не работает для MySQL 5.0, как переписать его, чтобы он работал

Я хочу удалить столбцы, у которых нет уникального идентификатора. Я добавлю, что в большинстве случаев это только один идентификатор (я пробовал синтаксис in, и он тоже не работает).

  • sql
  • mysql
  • выбрать
  • уникальный идентификатор
  • подзапрос
0

SELECT (под)запросы возвращают результат устанавливает . Поэтому вам нужно использовать IN , а не = в вашем предложении WHERE .

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

 УДАЛИТЬ ИЗ сообщений, ГДЕ id В (
    ВЫБЕРИТЕ ИЗ (
        ВЫБЕРИТЕ id ИЗ сообщений СГРУППИРОВАТЬ ПО id HAVING ( COUNT (id) > 1 )
    ) АС р
)
 

Или используйте соединения, предложенные Mchl.

12

 УДАЛИТЬ
  р1
  ИЗ постов AS p1
ПЕРЕКРЕСТНОЕ СОЕДИНЕНИЕ (
  ВЫБЕРИТЕ ID ИЗ сообщений СГРУППИРОВАТЬ ПО id ИМЕЕТ COUNT (id)> 1
) АС р2
ИСПОЛЬЗОВАНИЕ (идентификатор)
 
5

вы можете использовать внутреннее соединение:

 УДАЛИТЬ
 PS
ОТ
 сообщения ps ВНУТРЕННЕЕ СОЕДИНЕНИЕ
 (ВЫБИРАТЬ
 уникальный идентификатор
 ОТ
 сообщения
 СГРУППИРОВАТЬ ПО идентификатору
 HAVING COUNT(id) > 1 ) dubids на dubids.
Оставить комментарий

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

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