2011-01-20 3 views
2

유형이 다른 DB (예 : MySql, MSSQL 등)와 상호 작용해야하는 응용 프로그램이 있다고 가정합니다. 이것을하기 위해. DB와의 상호 작용을 담당하는 응용 프로그램과 DB (어떤 유형의 DB인지) 사이에 레이어가 있습니다.DataBase 엔진 (jdbc) 당 Sql 구문

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

내 질문은, SQL 구문 모든 데이터베이스 엔진 (MySQL은, MSSQL 등)에서 동일하다 :이 계층은 유형이 일부, SQL 문 (하드)가? 어떤 부분이 다른가요?

이 작업을 수행하는 오래된 프로젝트에서 부분적으로 작업하고 있기 때문에이 작업을 요청하고 있습니다. SQL 문은 조인과 업데이트를 포함하여 예제보다 훨씬 복잡합니다.
나는 항상 SQL 구문이 데이터베이스 유형마다 다르다고 생각했습니다.

답변

5

지원되는 전체 데이터베이스 구문은 데이터베이스 서버마다 다릅니다.

그러나 VAST는 ANSI SQL (Main SQL standard) 및/또는 Transact SQL (ANSI SQL의 MS SQL/Sybase "향상된"버전)과 같은 두 가지 기본 하위 집합 표준 중 하나를 지원합니다.

  • 정말 기본적인 SQL (SELECT/INSERT/UPDATE 쿼리)은 거의 동일합니다.

  • SQL 문과 직접 ​​관련이없는 기능은 스토어드 프로 시저 호출, 제어 흐름 명령문, DDL 구문과 크게 다를 수 있습니다.

  • 더하기 모든 DB 엔진은 완전한 supersets (T-SQL, PLSQL)에서 작은 보조 능력/키워드에 이르기까지 바닐라 ANSI SQL 위에 추가 기능을 추가합니다 (다른 대답의 예제 LIMIT/TOP 참조) .

가능한 한 당신의 SQL 코드와 같은 휴대용 만들고 싶어 당신은 분명히 바닐라의 ANSI SQL에 충실해야하지만, 당신이 사용할 수있는 이상 어떤 특정 기능이 which engines you want to limit yourself to에 크게 의존한다.

주의하시기 바랍니다 준비된 문 (이하 "?"귀하의 예제의 일부) SQL 구문과는 아무 상관이없는 대신 데이터베이스 연결 API를/라이브러리의 재산입니다; 언어 라이브러리 (뿐만 아니라 사용하는 개별 데이터베이스 서버의 API)와 마찬가지로 이식성이 뛰어납니다. 분명히 이식성은 ANSI SQL 구문만큼이나 보편적이지는 않지만 상당히 널리 지원됩니다.

+0

@DVK : 프로젝트에서 수행하는 SQL 문 유형이 벗어났다는 것을 의미합니까? 그들은 업데이트 및 조인을 수행하고 있습니다. – Cratylus

+0

PLSQL은 Oracle 기본이지만 PostgreSQL에 많은 양이 넘칩니다. MySQL에는 SQL 확장명에 대한 이름이 없습니다. –

+0

엔딩 질문 마크는 모든 엔진에서 괜찮습니까? – Cratylus

1

위의 예제와 같은 매우 기본적인 SQL 구문은 모든 SQL 데이터베이스에서 거의 동일하지만 일단 조인과 더 복잡한 것에 들어가기 시작하면 상당히 많은 차이가 있습니다.

0

정확합니다. 기본 기능은 비슷하지만 더 복잡한 기능에 대한 지원은 엔진마다 다릅니다. 구체적인 내용을 알고 싶다면 hibernate의 다양한 dialects 소스 코드를 살펴 보는 것이 좋습니다.

0

DB 관리 시스템 간에는 구문이 다릅니다. 예를 들어, MSSQL에는 TOP 구조가 있고, MySQL에는 LIMIT을 사용해야합니다. 또한 데이터 유형과 같은 기본 사항도 다릅니다. 일반적으로 더 복잡한 쿼리를 작성하면 더 큰 차이가 나타납니다.

을보고 싶으 실 것입니다.

4

기본 사항 - SELECT, INSERT, UPDATE, DELETE는 공급 업체간에 일관성이 있습니다. 여기에는 집계 함수 (MIN, MAX, COUNT, AVG)와 GROUP BY, HAVING 및 ORDER BY 절이 포함됩니다. 또한 서브 쿼리와 UNION.

그 외에도 모든 것이 매우 개략적입니다.
문자열 및 날짜 비교/조작에는 몇 가지 유사점이 있지만 일반적으로 매우 다릅니다. ANSI는 도움을 주지만, 실제로 주어진 공급 업체는 주어진 ANSI 사양을 구현하지 않습니다. 예를 들어, SQL Server는 v2005에 분석 함수를 추가했지만 이미 언급 한 것 외에 LEAD 및 LAG에 대한 Oracle 9i + 지원에 대해서는 제한된 하위 집합 (ROW_NUMBER, RANK, DENSE_RANK 및 NTILE)을 지원합니다. PostgreSQL은 8.4가 될 때까지 분석을 지원하지 않았지만, MySQL은 여전히 ​​분석적 지원을하지 않습니다. 다른 사람들은 SQL Server의 COALESCE가 느린/덜 효율적이기 때문에 ANSI 버전이 기본 구문을 사용할 때뿐만 아니라 성능이 좋지 않을 수도 있다는 사실을 알고 있습니다. 이 목록은 모든 차이점을 모두 다루기에는 너무 커서 특정 데이터 유형을 포함하지만 각 공급 업체의 버전을 알아야합니다 ...

SQL 표준/구문 확장 . SQL Server는 원래 Sybase에서 구축 되었기 때문에 Sybase 및 SQL Server는 TSQL (Transact-SQL)입니다. 오라클은 PLSQL을 가지고 있으며, PLSQL 구문은 PostgreSQL에서 크게 지원하지만, 여전히 변화가 있습니다. MySQL은 아직 확장명을 지정하지 않았습니다.

+0

더 "밀교적인"것들은 어떻습니까? Informix? DB2? SQLite? – DVK

+0

DB2에는 분석적 지원이 있지만 실제로 그것에 대해 많이 알지 못합니다. 나는 Informix에 대해 덜 알고 있습니다. SQLite는 데이터베이스의 임베디드 영역에 속하며 MySQL의 구문과 많이 유사하지만 제한적입니다. 수많은 벤더에 대해 잘 알고있는 사람들을 찾기가 어렵습니다. –

+0

+1 포괄적 인 답변 – DVK