Является ли Sql синтаксис для базы данных двигателя (JDBC) - PullRequest
2 голосов
/ 20 января 2011

Предположим, что есть приложение, которое должно взаимодействовать с БД более чем на тип (т.е. MySql, MSSQL и т. Д.). Сделать это. Между приложением и БД существует слой (независимо от типа БД), который отвечает за взаимодействие с БД. Этот слой имеет несколько частей, которые имеют SQL-операторы (жестко закодированные) типа:

`"SELECT "+ obj.getName()+ "FROM TABLE_X WHERE NAME=?"` etc (trivial sample sql).  

У меня вопрос: одинаковый ли синтаксис SQL во всех движках баз данных (MySql, MSSQL и т. Д.)? Какая часть отличается?

Я спрашиваю об этом, потому что я частично работаю в старом проекте, который делает это, и насколько я знаю, он работает. Операторы sql намного сложнее, чем пример, включающий объединения и обновления.
Я всегда думал, что синтаксис SQL варьируется в зависимости от типа базы данных.

Ответы [ 5 ]

5 голосов
/ 20 января 2011

Полный поддерживаемый синтаксис базы данных различается для разных серверов базы данных.

Однако большинство VAST поддерживают один из двух основных стандартов подмножеств: ANSI SQL (основной стандарт SQL ) и / или Transact.SQL («расширенная» версия ANSI SQL для MS SQL / Sybase).

  • Действительно базовый SQL (запросы SELECT / INSERT / UPDATE) в значительной степени одинаковы.

  • Возможности, которые НЕ связаны напрямую с оператором SQL, могут бытьотличаются в гораздо большей степени (вызовы хранимых процедур, операторы потока управления, синтаксис DDL).

  • Кроме того, каждый механизм БД добавляет свои собственные дополнительные возможности поверх стандартного ANSI SQL, от полногонадмножества (T-SQL, PLSQL) для незначительных дополнительных способностей / ключевых слов тут и там (см. пример LIMIT/TOP в другом ответе).

Очевидно, что вы должны придерживаться стандартного ANSI SQL, если вы хотите сделать свой код SQL как можно более переносимым, но какие конкретные возможности помимо того, что вы можете использовать, сильно зависят от , какие движкиВы хотите ограничить себя .

Обратите внимание, что подготовленные операторы (часть "?" в вашем примере) не имеют ничего общего с синтаксисом SQL и вместо этогосвойство API / библиотек подключения к базе данных;как таковые, они настолько портативны, насколько позволяют библиотеки вашего языка (а также API отдельного сервера базы данных, который они используют).Портативность, очевидно, не так универсальна, как у синтаксиса ANSI SQL, но они достаточно широко поддерживаются.

4 голосов
/ 20 января 2011

Основы - SELECT, INSERT, UPDATE, DELETE согласованы между поставщиками.Это включает агрегатные функции (MIN, MAX, COUNT, AVG) и предложения GROUP BY, HAVING и ORDER BY.Также подзапросы и UNION.

Кроме того, все становится очень схематичным.
Сравнение / манипулирование строками и датами имеет некоторые сходства, но, как правило, очень разные.ANSI помогает, но в действительности ни один поставщик не реализует всю спецификацию ANSI для данного года.Например, SQL Server добавил аналитические функции в v2005, но это ограниченное подмножество (ROW_NUMBER, RANK, DENSE_RANK и NTILE) по сравнению с поддержкой Oracle 9i + для LEAD и LAG, помимо уже упомянутых.PostgreSQL не поддерживал аналитику до 8.4, MySQL до сих пор не имеет никакой аналитической поддержки.Другая реальность, которую люди игнорируют, заключается в том, что версия ANSI может работать не так хорошо, как при использовании собственного синтаксиса - COALESCE на SQL Server - хороший пример, потому что он медленнее / менее эффективен.Список слишком велик, чтобы охватить все различия - содержит справку по конкретному типу данных, но тогда вам нужно знать версии соответствующих поставщиков ...

Некоторые базы данных назвали свои расширения стандарта SQL/синтаксис.Sybase и SQL Server - это Transact-SQL (TSQL), потому что SQL Server изначально был построен на Sybase.У Oracle есть PLSQL, а синтаксис PLSQL в значительной степени поддерживается PostgreSQL, но все еще есть отклонения.MySQL еще не назвал их расширение.

1 голос
/ 20 января 2011

Очень простой синтаксис SQL, подобный вашему примеру выше, практически одинаков во всех базах данных SQL, но как только вы начинаете входить в объединения и делать что-то более сложное, между ними довольно много отличий.

0 голосов
/ 20 января 2011

К сожалению, синтаксис отличается в системах управления БД. Например, в MSSQL есть конструкция TOP, тогда как в MySQL вам придется использовать LIMIT. Они также различаются по основным вещам, таким как типы данных. Вообще говоря, чем более сложные запросы вы пишете, тем больше различий.

Возможно, вам будет интересно посмотреть Сравнение систем управления реляционными базами данных .

0 голосов
/ 20 января 2011

Вы правы. Хотя базовые функции аналогичны, поддержка более сложных функций варьируется от двигателя к двигателю. Если вы хотите разобраться со спецификой, для начала лучше всего обратиться к исходному коду hibernate * * * * * * * *

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