2012-01-13 4 views
1

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

Oracle Синтаксис:

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

MySQL Синтаксис?

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

+0

Если вам нужно беспокоиться о различиях между различными ароматами SQL, эта книга бесценна: http://www.amazon.com/SQL-Nutshell-OReilly-Kevin-Kline/dp/0596518846/ref=sr_1_3?s = книги и т = UTF8 & QID = 1326486636 & стер = 1-3 – HLGEM

ответ

5

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

  • 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

Синтаксис является стандартным SQL ANSI и поддерживается во всех трех RDBMS, поскольку вы указали его для Oracle.

2

IS NULL и IS NULL - это то же самое почти везде. Основные отличия базовых запросов будут связаны с вызовами функций, и они значительно отличаются друг от друга, поэтому вы должны быть более конкретными.

0

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

1

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

В Oracle, вы можете обновить таблицу А из данных в таблице 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

Около десяти лет назад я добавил ссылку, давно сошедшуюся с надписью, в документ под названием «Уровни соответствия поставщика 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, чтобы использовать пользователей!