RDBMS の SQL の比較

このページは、RDBMS の SQL の文法などの違いについてまとめる予定のページです。

目次

注意

  • このページを作ったひとが自分のために記載しているため網羅性はありません。
  • データ型は「RDBMS のデータ型の比較」にあります。

一覧

文字列

リテラル

RDBMS
MySQL
 ANSI_QUOTES モードなし 'text', "text"
 ANSI_QUOTES モードあり 'text'
PostgreSQL 'text'
Oracle 'text'
SQL Server
 SET QUOTED_IDENTIFIER OFF 'text', "text"
 SET QUOTED_IDENTIFIER ON 'text'
SQLite 'text'

引用符のエスケープ

RDBMS
MySQL
 NO_BACKSLASH_ESCAPES モードなし 'text '' text', 'text \' text'
 NO_BACKSLASH_ESCAPES モードあり 'text '' text'
PostgreSQL
 standard_conforming_strings = off 'text '' text', 'text \' text', E'text \' text'
 standard_conforming_strings = on 'text '' text', E'text \' text'
Oracle 'text '' text', q'{text '' text}' など (代替引用符)
SQL Server 'text '' text'
SQLite 'text '' text'

文字列結合 (演算子)

RDBMS
MySQL
 PIPES_AS_CONCAT モードなし 演算子なし (CONCAT('A', 'B') など)
 PIPES_AS_CONCAT モードあり 'A' || 'B'
PostgreSQL 'A' || 'B'
Oracle 'A' || 'B'
SQL Server 'A' + 'B'
SQLite 'A' || 'B'

識別子のエスケープ

RDBMS
MySQL
 ANSI_QUOTES モードなし `keyword`
 ANSI_QUOTES モードあり `keyword`, "keyword"
PostgreSQL "keyword"
Oracle "keyword"
SQL Server
 SET QUOTED_IDENTIFIER OFF [keyword]
 SET QUOTED_IDENTIFIER ON [keyword], "keyword"
SQLite "keyword", [keyword], `keyword`

CREATE TABLE

自動採番列の指定

RDBMS
MySQL AUTO_INCREMENT
SERIAL 型エイリアス (BIGINT UNSIGNED NOT NULL AUTO_INCREMENT UNIQUE のエイリアス)
PostgreSQL GENERATED AS IDENTITY
SERIAL 型エイリアス (integer NOT NULL DEFAULT nextval('固有シーケンス') のエイリアス)
Oracle (12c~) GENERATED AS IDENTITY
SQL Server IDENTITY(1, 1)
SQLite AUTOINCREMENT
MySQL の例
CREATE TABLE test1 (
  id BIGINT UNSIGNED AUTO_INCREMENT PRIMARY KEY
);

CREATE TABLE test2 (
  id SERIAL PRIMARY KEY
);
PostgreSQL の例
CREATE TABLE test1 (
  id integer GENERATED BY DEFAULT AS IDENTITY PRIMARY KEY
);

CREATE TABLE test2 (
  id SERIAL PRIMARY KEY
);
Oracle の例
CREATE TABLE test1 (
  id NUMBER GENERATED BY DEFAULT AS IDENTITY PRIMARY KEY 
);
SQL Server の例
CREATE TABLE test1 (
  id INT IDENTITY(1,1) PRIMARY KEY 
);
SQLite の例
CREATE TABLE test1 (
  id INTEGER PRIMARY KEY AUTOINCREMENT
);

SELECT

結果の制限 (LIMIT, FETCH)

RDBMS
MySQL LIMIT 10 OFFSET 20
PostgreSQL LIMIT 10 OFFSET 20, OFFSET 20 ROWS FETCH NEXT 10 ROWS ONLY
Oracle OFFSET 20 ROWS FETCH NEXT 10 ROWS ONLY
SQL Server (2012~) OFFSET 20 ROWS FETCH NEXT 10 ROWS ONLY
SQLite LIMIT 10 OFFSET 20

OVER 句 (ウィンドウ関数)

RDBMS
MySQL (8.0~) SELECT gender, ROW_NUMBER() OVER(PARTITION BY gender ORDER BY id ASC) AS num FROM emp
PostgreSQL
Oracle
SQL Server
SQLite (3.25~)

グループ化したデータの文字列化 (カンマ区切りなど)

RDBMS
MySQL GROUP_CONCAT()
PostgreSQL string_agg()
Oracle XMLAGG()
SQL Server FOR XML PATH (''), STRING_AGG() (2017~)
SQLite GROUP_CONCAT()
サンプルデータ
CREATE TABLE emp ( id INTEGER, emp_name CHARACTER VARYING(10), gender INTEGER );
INSERT INTO emp VALUES (1, 'emp1', 1);
INSERT INTO emp VALUES (2, 'emp2', 1);
INSERT INTO emp VALUES (3, 'emp3', 2);
INSERT INTO emp VALUES (4, 'emp4', 2);
期待する結果
gender	emp_names
1	emp1,emp2
2	emp3,emp4
MySQL の例
SELECT gender, GROUP_CONCAT(emp_name ORDER BY id SEPARATOR ',') AS emp_names
FROM emp
GROUP BY gender
PostgreSQL の例
SELECT gender, string_agg(emp_name, ',' ORDER BY id) AS emp_names
FROM emp
GROUP BY gender
Oracle の例
SELECT gender, RTRIM(XMLAGG(XMLELEMENT("t", emp_name || ',') ORDER BY id).EXTRACT('//text()'), ',') AS emp_names
FROM emp
GROUP BY gender
SQL Server の例
SELECT gender, STUFF((SELECT ',' + emp_name FROM emp WHERE gender = e.gender ORDER BY id FOR XML PATH ('')), 1, 1, '') AS emp_names
FROM emp AS e
GROUP BY gender
SQL Server (2017~) の例
SELECT gender, STRING_AGG(emp_name, ',') WITHIN GROUP (ORDER BY id) AS emp_names
FROM emp
GROUP BY gender
SQLite の例
SELECT gender, GROUP_CONCAT(emp_name, ',') AS emp_names
FROM emp
GROUP BY gender

INSERT

複数行インサート

RDBMS
MySQL カンマ区切り
PostgreSQL カンマ区切り
Oracle INSERT ALL
SQL Server カンマ区切り
SQLite (3.7.11~) カンマ区切り
MySQL, PostgreSQL, SQL Server, SQLite
INSERT INTO emp VALUES
  (1, 'emp1', 1),
  (2, 'emp2', 1)
Oracle
INSERT ALL
  INTO emp VALUES (1, 'emp1', 1)
  INTO emp VALUES (2, 'emp2', 1)
  SELECT * FROM dual

トランザクションの開始

RDBMS
MySQL BEGIN (BEGIN WORK), START TRANSACTION
PostgreSQL BEGIN (BEGIN WORK, BEGIN TRANSACTION)
Oracle なし (自動)
SQL Server BEGIN (BEGIN TRAN, BEGIN TRANSACTION)
SQLite BEGIN (BEGIN TRANSACTION)