このページは、RDBMS の SQL の文法などの違いについてまとめる予定のページです。
目次
注意
一覧
文字列
リテラル
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
);
- 補足
GENERATED AS IDENTITY
は GENERATED ALWAYS AS IDENTITY
(値を手動で登録できない) と GENERATED BY DEFAULT AS IDENTITY
(値を手動で登録することもできる) がある
- 参考
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
- 補足
- MySQL, SQLite の
GROUP_CONCAT()
は区切り文字を省略した場合カンマ区切りがデフォルト
- SQLite の
GROUP_CONCAT()
は順序指定できない
- 参考
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 ) |