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
ジャンル:
ウェブログ
コメント   この記事についてブログを書く
この記事をはてなブックマークに追加
« [oracle]パーティションについて | トップ |   
最近の画像もっと見る

あわせて読む

トラックバック

この記事のトラックバック  Ping-URL
ブログ作成者から承認されるまでトラックバックは反映されません。
  • 30日以上前の記事に対するトラックバックは受け取らないよう設定されております。
  • 送信元の記事内容が半角英数のみのトラックバックは受け取らないよう設定されております。
  • このブログへのリンクがない記事からのトラックバックは受け取らないよう設定されております。
  • ※ブログ管理者のみ、編集画面で設定の変更が可能です。