Удаление строк из таблицы (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.