uso

雑記いろいろ
★書いてある内容に保証は一切ありません。
 ご自身で判断をしてください。

[SQL]ANSI SQLについて

2016-10-16 00:46:44 | work
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

最新の画像もっと見る