Различия в синтаксисе операторов SQL - PullRequest
1 голос
/ 14 января 2012

Мне было интересно, какие типы вещей обычно различаются в разных реализациях SQL при взгляде на операторы запроса.Одна вещь, о которой я подумал, это использование IS NULL в предложении WHERE.Смотрите Blowow, например.Я пишу синтаксический анализатор операторов запросов, который обрабатывает операторы и запросы на собственном языке и должен учитывать большинство общих различий между более широко используемыми продуктами SQL.

Синтаксис Oracle:

SELECT * FROM TABLE WHERE COLUMN_A IS NULL 
SELECT * FROM TABLE WHERE COLUMN_A IS NOT NULL

Синтаксис MySQL?

Синтаксис SQL Server?

Ответы [ 6 ]

5 голосов
/ 14 января 2012

Я не уверен, что вы найдете окончательный список всех различий.Несколько вещей, о которых я могу подумать:

  • MySQL использует LIMIT, в то время как SQL Server использует TOP.
  • SQL Server намного строже в операциях GROUP BY, чем MySQL,требуя, чтобы все неагрегированные столбцы из SELECT отображались в предложении GROUP BY.
  • SQL Server поддерживает собственный синтаксис UPDATE FROM и DELETE FROM, выходящий за рамки стандарта ANSI.
  • Существующие функциив одной системе, но не в другой.MySQL имеет FIND_IN_SET и GROUP_CONCAT, которые не существуют в SQL Server.Аналогично, в SQL Server есть ROW_NUMBER (), которого нет в MySQL.
5 голосов
/ 14 января 2012

Синтаксис IS NULL / IS NOT NULL является стандартом ANSI SQL и поддерживается во всех трех этих СУБД, как вы перечислили его для Oracle.

2 голосов
/ 14 января 2012

НЕДЕЙСТВИТЕЛЕН и НЕТ НУЛЕВ, почти везде одинаков. Основные различия для базовых запросов касаются вызовов функций, и они сильно различаются, поэтому вам нужно быть более конкретным.

1 голос
/ 14 января 2012

Есть много вещей, которые различаются в разных реализациях RDMBS.Вот простой пример, который не использует какую-либо конкретную функцию:

В Oracle вы можете обновить таблицу A из данных в таблице B следующим образом:

UPDATE A
SET (COL1,COL2) = (SELECT B.COL3, B.COL4 FROM B WHERE B.COL5 = A.COL6)
WHERE A.COL7 = 3
AND EXISTS (SELECT 1 FROM B WHERE B.COL5 = A.COL6);

Но в SQL Server то же самоеЗадача может быть выполнена следующим образом:

UPDATE A
SET COL1 = B.COL3, COL2 = B.COL4
FROM B
WHERE B.COL5 = A.COL6 
AND A.COL7 = 3;

Кроме того, синтаксис Oracle недопустим в SQL Server и наоборот, поэтому вы не можете согласиться на общий знаменатель.Написание синтаксического анализатора для этого конкретного синтаксиса является сложной задачей, поэтому общий синтаксический анализатор представляется весьма нетривиальной задачей.

0 голосов
/ 16 января 2012

Около десяти лет назад я установил ссылку на давно устаревшую ссылку на документ, озаглавленный «Уровни соответствия поставщиков ANSI SQL».Я сохранил это, чтобы я мог думать: «Ах, как странно».Стандарт теперь ISO (I = международный), а не только ANSI (A = США).Никто больше не пытается документировать подобные вещи для более чем одного продукта SQL.

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

Взяв в качестве примеров mySQL и SQL Server.Я предполагаю, что некоторые функции mySQL (например, ORDER BY LIMIT) ближе к стандартам, чем SQL Server (TOP), потому что mySQL пришел на вечеринку позже и на самом деле имел стандартную спецификацию, которой нужно следовать, и не было устаревшей версии, которая была бы совместима с,Я предполагаю, что другие функции в MySQL (update on duplicate key) не соответствуют стандартам (SQL Server расширяет MERGE от стандартов), потому что они хотели что-то более простое в реализации и более простых пользователей.Я предполагаю, что некоторые функции MySQL близки к тем, что есть в SQL Server, чтобы иметь возможность переманивать пользователей!

0 голосов
/ 14 января 2012

Вы можете применить оба запроса ко всем rdbms.Это стандартная информация.

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