. Является ли в SQL «ОТ» в «УДАЛИТЬ ИЗ» необязательным, если вы планируете использовать «ГДЕ»?
спросил
Изменено 4 месяца назад
Просмотрено 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. Вот несколько правил:
- Пишите скрипты вручную, не используйте сгенерированный код.
- Всегда используйте 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 не поддерживает этот синтаксис.
- ОК, вы можете заскриптовать свои объекты и редактировать их стандартным способом
1
Согласно документации Microsoft SQL Server, FROM является необязательным.
2
из
является необязательным в удалить из
в этих трех СУБД, но является обязательным в соответствии со стандартом SQL. Я бы всегда использовал для удаления из
, чтобы упростить миграцию кода SQL из одной СУБД в другую.
В SQL Server , ИЗ
из УДАЛИТЬ ИЗ
является необязательным, а УДАЛИТЬ
без ИЗ
не является стандартом SQL , а УДАЛИТЬ ИЗ
— это стандарт SQL .
I Экспериментировал DEDETE с
и DEDETE
без с
на SQL Server , MySQL , Postgresql и SQLITE
Кроме того, я еще экспериментировал ВСТАВИТЬ В
и ВСТАВЬТЕ
без В
на SQL Server , MySQL , PostgreSQL и SQLite
База данных | ВСТАВКА В | ВСТАВКА |
---|---|---|
SQL Server | Возможно | Возможно |
MySQL | Возможно | Возможно |
PostgreSQL | Возможно | Невозможно |
SQLite | Возможно | Невозможно |
Зарегистрируйтесь или войдите
Зарегистрируйтесь с помощью Google
Зарегистрироваться через Facebook
Зарегистрируйтесь, используя электронную почту и пароль
Опубликовать как гость
Электронная почта
Обязательно, но не отображается
Опубликовать как гость
Электронная почта
Требуется, но не отображается
Оператор SQL DELETE — Как безопасно удалить записи из базы данных
В этом посте мы сосредоточимся на удалении записей из базы данных. Эта операция выполняется оператором SQL DELETE. Прежде чем читать это руководство, обязательно ознакомьтесь с нашими сообщениями об операторе SQL UPDATE и операторе SQL INSERT.
Выполнение инструкции SQL DELETEПосле того, что мы сказали в предыдущем посте о COMMIT и ROLLBACK, и зная, что в этом посте мы собираемся удалить элементы, мы начнем с выполнения COMMIT. Таким образом, мы будем хранить текущее состояние нашей базы данных. При необходимости мы сможем вернуться к нему позже с помощью ROLLBACK.
В пост о INSERT под номером сотрудника 9-9-9-9-0-3 мы добавили информацию о Джонатане Крике. Выберем его запись в таблице «Сотрудники».
Отлично — мы можем видеть его «дату рождения», «пол» и «дату найма».
Теперь посмотрим, какая информация содержится об этом же сотруднике в таблице «Титулы».
Отлично! Его должность «старший инженер», и он начал работать на 1 st от октября 1997 г.
Как мы упоминали в начале руководства, синтаксис, который следует соблюдать при удалении информации, — это DELETE FROM, имя таблицы и WHERE с соответствующим условием.
В нашем случае код будет УДАЛИТЬ ИЗ «Сотрудников», ГДЕ «Номер сотрудника» — 9-9-9-9-0-3.
Что должно произойти, когда мы запустим этот запрос, так это то, что только строка с номером сотрудника 9-9-9-9-0-3 будут удалены.
Давайте посмотрим, так ли это, выполнив этот оператор DELETE, затем выбрав запись из таблицы «Сотрудники», указав то же условие в предложении WHERE.
Итак… какой вывод появится?
Пустая запись. Это означает, что мы надлежащим образом удалили информацию о Джонатане Крике. Потрясающий! Как вы думаете… можем ли мы все еще видеть, что он был старшим инженером, нанятым в октябре 1997 года? Придется проверить, что осталось в таблице «Заголовки».
Хм… тоже пусто. Почему? Разве мы не заказывали команду DELETE только для таблицы «Сотрудники»? Ответ заключается в связи между двумя таблицами.
Затем проверяем информацию DDL о таблице «Titles».
Мы видим в ограничении внешнего ключа, что у нас также есть предложение ON DELETE CASCADE.
Использование этого предложения означает, что все связанные записи в дочерней таблице также будут удалены. Фантастика!
Предположим, что мы удалили информацию о Джонатане по ошибке. Есть ли способ вернуться? Учитывая, что мы применили оператор COMMIT в начале поста, то да, есть. Мы должны иметь возможность запустить команду ROLLBACK.
Выполним… ок!
А теперь давайте проверим, что запись вернулась в таблицу. Это в таблице «Сотрудники»… ок…
И… он есть и у нас в «Титлах».
Итак, наш последний COMMIT хорошо справился с задачей сохранения полного набора данных — начального большого набора данных вместе с тремя записями, которые мы добавили в разделе INSERT.
Продолжайте в том же духе в следующем разделе, в котором мы покажем вам кое-что, с чем вы должны быть очень осторожны.
Небезопасная операция удаленияЕсли мы не установим условие в предложении WHERE оператора DELETE, мы сильно рискуем. Это потенциально может привести к удалению всех записей таблицы. Вот почему мы должны быть очень осторожны при использовании этого утверждения. Всегда!
Вспомним, что у нас есть в таблице «Дубликаты отделов».
Номера и названия девяти отделов компании.
Давайте выполним оператор DELETE без прикрепленного к нему предложения WHERE.
Видишь? Были затронуты девять рядов.
Теперь мы можем еще раз проверить таблицу.
Пустее и быть не может!
Чтобы отменить изменения, мы должны выполнить оператор ROLLBACK. Хорошо?
И… получилось? Нам нужно будет выбрать всю информацию из этой крошечной таблицы, чтобы проверить, есть ли у нас обратно наши данные.
Вот оно! Ожидание получения!
Поэтому в заключение можно сказать следующее: Будьте осторожны с оператором DELETE. Не забудьте добавить условие в предложение WHERE, если вы не хотите потерять всю свою информацию.
В следующем разделе мы сравним DROP, DELETE и TRUNCATE.
DROP vs TRUNCATE vs DELETEВ этом разделе мы кратко обсудим основное различие между тремя зарезервированными словами: DROP, TRUNCATE и DELETE.
Их функциональность похожа, и вы можете задаться вопросом, почему они все, а не только один, существуют.
КАПЛЯПосмотрите на эту гипотетическую таблицу с 10 записями.
Если вы УДАЛИТЕ его, вы потеряете записи, таблицу как структуру и все связанные объекты, такие как индексы и ограничения. Вы потеряете все! Кроме того, вы не сможете вернуться к исходному состоянию или к последнему оператору COMMIT. Как только вы уроните стол, он исчезнет. В такой ситуации поможет только дополнительное программное обеспечение для восстановления данных, но оно не считается стандартным SQL-инструментом.
Следовательно, используйте DROP TABLE только в том случае, если вы уверены, что больше не собираетесь использовать данную таблицу.
ОБРЕЗАТЬTRUNCATE — это оператор, который по существу удалит все записи из таблицы, как если бы вы использовали DELETE без предложения WHERE. Это означает, что TRUNCATE удалит все записи в вашей таблице, но ее структура останется неизменной.
Имейте в виду, что при усечении значения автоинкремента будут сброшены. Итак, если в вашей таблице 10 записей, а затем вы усекаете ее, когда вы начнете повторно заполнять этот объект данных информацией, следующие записи, которые будут вставлены, будут не 11 и 12. Первая запись будет номер 1, вторая запись будет номер 2 и так далее. Хороший!
УДАЛИТЬНаконец, DELETE удаляет записи построчно. Будут удалены только строки, соответствующие определенному условию или условиям, указанным в предложении WHERE.
Если блок WHERE опущен, вывод будет похож на результат, полученный с помощью TRUNCATE. Однако будет несколько существенных отличий.
Во-первых, оптимизатор SQL реализует различные программные подходы, когда мы используем TRUNCATE или DELETE. В результате TRUNCATE выдает результат гораздо быстрее, чем DELETE, потому что не нужно удалять информацию построчно.
Во-вторых, значения автоинкремента не сбрасываются с помощью DELETE. Итак, если вы УДАЛИТЕ все 10 записей в этой таблице, а затем начнете вставлять новые данные, первая новая запись будет иметь номер 11, а не 1; второй будет 12, а не 2 и так далее.
Есть много других технических особенностей, касающихся этих трех опций, но их подробное объяснение выходит за рамки этого поста. Тем не менее, мы надеемся, что этот пост поможет вам сделать более осознанный выбор между DROP, TRUNCATE и DELETE.