ANSI SQLについて
■規格団体
ANSI(American National Standards Institute:米国標準化団体)
ISO(International Standards Organization: 国際標準化機構)
SQL以外にもDBに関係する事全般も決めている
→DBの型、オブジェクト、トランザクション、etc
■SQLの規格
SQL86, SQL89, SQL92, SQL:1999, SQL:2003, SQL:2006, SQL:2008, SQL:2011
Oracle11g(11.1)≒SQL:2003
Oracle11g(11.2)≒SQL:2008
Oracle12c ≒SQL:2011
↑すべての規約を準拠しているわけではない
■SQLって何?
関係データベース管理システム (RDBMS) において、データの操作や定義を行うためのデータベース言語(問い合わせ言語)
ANSI=SQLはSQL
IBM社が開発したRDBMSの実験実装である
System R の操作言語「SEQUEL (Structured English Query Language)」であったことが由来となっている。
■SQLって何でできてるの?
構成 =命令・演算子・関数+拡張命令セット(PL-SQL、Trunsact-SQL)
構成要素=予約語・データベースオブジェクト・式
■SQLとは
命令
DML(データ操作命令)
SELECT、FROM、WHERE、ORDER BY、GROUP BY、HAVING、
UPDATE、DELETE、
MERGE(SQL:2003)・REPLACE
・・・
DDL(データ定義命令)
CREATE、DROP、ALTER、TRUNCATE(SQL:2008)→COMMIT、ROLLBACKの扱いが会社によって違う
・・・
DCL(データ制御命令)
GRANT、REVOKE・・・
演算子
算術演算子(+-*/%)
比較演算子(= < > >= <= <> !=)
論理演算子(ALL、AND、ANY、BETWEEN、EXISTS、ILIKE、IN、LIKE、NOT、OR・・・)
単項演算子(+、-、IS NULL)
集合演算子(UNION、EXCEPT、MINUS、INTERSECT)
ビット演算子(&|^#)
その他演算子(||、CASE)
||はOracle、DB2、PostgreSqlのみOK
MySQLでは「OR」と同じ
型の違う結合は禁止(char || varchar)
OracleだけNULLの扱いが違う('a' || null→'a')
関数
集計関数(SUM、COUNT、MAX・・・)
文字列関数(TRIM、UPPER、LOWER・・・)
日付関数(EXTRACT、CURRENT_DATE、CURRENT_TIME・・・)
EXTRACT ( 日付要素 FROM 日付式、または、期間式 ) →指定した日時フィールドの値を取り出す
変換関数(CAST、COLALESCE・・・)
算術関数(COS、SIN、POW・・・)
●ANSI準拠じゃないマイナーSQL
LIMIT(MySQL・PostgreSQL)、TOP(SQLServer)⇒OFFSETとFETCH※Oracleは12cから
SQL> SELECT * FROM (
2 SELECT tab2.*, ROW_NUMBER() OVER(ORDER BY c2) rn
3 FROM tab2) WHERE rn <= 5;
SQL> SELECT * FROM tab2 ORDER BY c2 FETCH FIRST 5 ROWS ONLY;
SELECT INTO(MySQL・PostgreSQL)⇒OracleだとCreate Table AS、どっちにしても独自機能
REPLACE→MERGE
算術演算子(%→ない)
比較演算子(!=→<>)
ビット演算子(&|^#)
●ANSI準拠じゃないまあまあ知ってるなSQL
集合演算子(MINUS→INTERSECT)
変換関数(NVL(Oracle)→COLALESCE:コウアレス、DECODE→CASE)
COLALESCE=NULL値でない最初の引数を返す、すべてNULLならUNKNOWNを返す
日付関数全般(TO_CHAR、TO_DATE、ADD_MONTH、YEAR、MONTH、DAY・・・)
■これが困った独自SQL
Oracleの結合→+(SqlServerだと*= =*がある)※制限がある
SQL(wiki)
https://ja.wikipedia.org/wiki/SQL
SQL言語の概要
http://rfs.jp/sb/sql/s01/02-16.html
SQLの観点から「Oracle Database」「PostgreSQL」「MySQL」の特徴を整理しよう!
https://www.ashisuto.co.jp/corporate/column/technical-column/detail/1197236_2274.html
1.8.2 MySQL と標準 SQL との違い
https://dev.mysql.com/doc/refman/5.6/ja/differences-from-ansi.html
第20回 RDBMSの種類によるUPDATE文の仕様の違い
http://www.oss-db.jp/measures/dojo_20.shtml
データベース
https://www.ipa.go.jp/files/000018652.pdf
■規格団体
ANSI(American National Standards Institute:米国標準化団体)
ISO(International Standards Organization: 国際標準化機構)
SQL以外にもDBに関係する事全般も決めている
→DBの型、オブジェクト、トランザクション、etc
■SQLの規格
SQL86, SQL89, SQL92, SQL:1999, SQL:2003, SQL:2006, SQL:2008, SQL:2011
Oracle11g(11.1)≒SQL:2003
Oracle11g(11.2)≒SQL:2008
Oracle12c ≒SQL:2011
↑すべての規約を準拠しているわけではない
■SQLって何?
関係データベース管理システム (RDBMS) において、データの操作や定義を行うためのデータベース言語(問い合わせ言語)
ANSI=SQLはSQL
IBM社が開発したRDBMSの実験実装である
System R の操作言語「SEQUEL (Structured English Query Language)」であったことが由来となっている。
■SQLって何でできてるの?
構成 =命令・演算子・関数+拡張命令セット(PL-SQL、Trunsact-SQL)
構成要素=予約語・データベースオブジェクト・式
■SQLとは
命令
DML(データ操作命令)
SELECT、FROM、WHERE、ORDER BY、GROUP BY、HAVING、
UPDATE、DELETE、
MERGE(SQL:2003)・REPLACE
・・・
DDL(データ定義命令)
CREATE、DROP、ALTER、TRUNCATE(SQL:2008)→COMMIT、ROLLBACKの扱いが会社によって違う
・・・
DCL(データ制御命令)
GRANT、REVOKE・・・
演算子
算術演算子(+-*/%)
比較演算子(= < > >= <= <> !=)
論理演算子(ALL、AND、ANY、BETWEEN、EXISTS、ILIKE、IN、LIKE、NOT、OR・・・)
単項演算子(+、-、IS NULL)
集合演算子(UNION、EXCEPT、MINUS、INTERSECT)
ビット演算子(&|^#)
その他演算子(||、CASE)
||はOracle、DB2、PostgreSqlのみOK
MySQLでは「OR」と同じ
型の違う結合は禁止(char || varchar)
OracleだけNULLの扱いが違う('a' || null→'a')
関数
集計関数(SUM、COUNT、MAX・・・)
文字列関数(TRIM、UPPER、LOWER・・・)
日付関数(EXTRACT、CURRENT_DATE、CURRENT_TIME・・・)
EXTRACT ( 日付要素 FROM 日付式、または、期間式 ) →指定した日時フィールドの値を取り出す
変換関数(CAST、COLALESCE・・・)
算術関数(COS、SIN、POW・・・)
●ANSI準拠じゃないマイナーSQL
LIMIT(MySQL・PostgreSQL)、TOP(SQLServer)⇒OFFSETとFETCH※Oracleは12cから
SQL> SELECT * FROM (
2 SELECT tab2.*, ROW_NUMBER() OVER(ORDER BY c2) rn
3 FROM tab2) WHERE rn <= 5;
SQL> SELECT * FROM tab2 ORDER BY c2 FETCH FIRST 5 ROWS ONLY;
SELECT INTO(MySQL・PostgreSQL)⇒OracleだとCreate Table AS、どっちにしても独自機能
REPLACE→MERGE
算術演算子(%→ない)
比較演算子(!=→<>)
ビット演算子(&|^#)
●ANSI準拠じゃないまあまあ知ってるなSQL
集合演算子(MINUS→INTERSECT)
変換関数(NVL(Oracle)→COLALESCE:コウアレス、DECODE→CASE)
COLALESCE=NULL値でない最初の引数を返す、すべてNULLならUNKNOWNを返す
日付関数全般(TO_CHAR、TO_DATE、ADD_MONTH、YEAR、MONTH、DAY・・・)
■これが困った独自SQL
Oracleの結合→+(SqlServerだと*= =*がある)※制限がある
SQL(wiki)
https://ja.wikipedia.org/wiki/SQL
SQL言語の概要
http://rfs.jp/sb/sql/s01/02-16.html
SQLの観点から「Oracle Database」「PostgreSQL」「MySQL」の特徴を整理しよう!
https://www.ashisuto.co.jp/corporate/column/technical-column/detail/1197236_2274.html
1.8.2 MySQL と標準 SQL との違い
https://dev.mysql.com/doc/refman/5.6/ja/differences-from-ansi.html
第20回 RDBMSの種類によるUPDATE文の仕様の違い
http://www.oss-db.jp/measures/dojo_20.shtml
データベース
https://www.ipa.go.jp/files/000018652.pdf