Удаление строк из таблицы (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
- удалить строку
В этом месте не является обязательным (SQL Server, Oracle, Sybase).
Однако есть небольшие различия: например, Oracle позволяет назначать псевдоним имени таблицы, а SQL Server — нет; и другие вещи также немного отличаются.
Также обратите внимание, что ваш образец FROM отличается от следующего, где он является обязательным:
УДАЛИТЬ phone_book FROM some_table WHERE ...2
Краткий ответ: ответ Luceros правильный: это необязательно
Мне нужно поддерживать sql и адаптировать его между sql-сервером и Oracle. Вот несколько правил:
- Пишите скрипты вручную, не используйте сгенерированный код.
- Всегда используйте INSERT INTO.
- Всегда УДАЛИТЬ — без ОТ.
- Не использовать » — идентификатор в кавычках.
- Удалить все [ ] и dbo. (Имена схем)
- Внимание, когда вы видите УДАЛИТЬ… ИЗ…
- Внимание, когда вы видите ОБНОВЛЕНИЕ… ОТ…
Для операторов ORACLE Select требуется предложение from, которое вы можете использовать из DUAL
- ОК, вы можете заскриптовать свои объекты и редактировать их стандартным способом
- USE [Current_DB] — вы не хотите, чтобы ссылка на вашу тестовую базу данных попадала в производственный скрипт
- SET ANSI_NULLS ON — один раз решить, какие настройки использовать — не включать и не выключать
- SET QUOTED_IDENTIFIER ON — идентификаторы в кавычках чувствительны к регистру.

- INSERT INTO требуется для Oracle.
- Это мой личный стиль, не используйте необязательное ключевое слово, изучите значения по умолчанию
- Вы должны указать идентификатор в кавычках, если вы используете одно из зарезервированных ключевых слов ORACLES в качестве имени столбца, мы попали в эту ловушку, и в конечном итоге было бы лучше переименовать столбец на стороне sql-Server.
- Oracle их не использует.
- Oracle не поддерживает этот синтаксис.
- Oracle не поддерживает этот синтаксис.
- ОК, вы можете заскриптовать свои объекты и редактировать их стандартным способом
Согласно документации 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
- выбрать
- уникальный идентификатор
- подзапрос
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.


00 sec)
`id`=`table_2`.`id` &&
`table_2`.`id`=`table_3`.`id`
