Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.

My sql casual12lt

296 views

Published on

SQL標準とMySQLの仕様(実装)についていくつか。

Published in: Software
  • Be the first to comment

  • Be the first to like this

My sql casual12lt

  1. 1. 1 SQL標準とMySQL MySQL Casual Talks vol.12 2019-09-13 19:50 LT @meijik
  2. 2. 免責事項 • 本プレゼンテーションにおいて示されている 見解は、私自身の見解であって、私の所属す る会社・団体の見解を必ずしも反映したもの ではありません。ご了承ください。 2
  3. 3. 自己紹介 • 日本オラクルでMySQLサポートをしています。 –漢と書いてオトコ(奥野幹也氏)の同僚。 –漢は「理論から学ぶデータベース実践入門 」「Pro MySQL NDB Cluster(共著)」著者 • DB関連のブログや書籍を書いてます。 –キムラデービーブログ(blog.kimuradb.com) –「おうちで学べるデータベースのきほん(共著)」 • ミックさんの知り合い。外人じゃないよ。 • MyNA会員、Neo4Jユーザ会会員 • Firebird日本ユーザ会の理事長
  4. 4. 日本語サポートメンバー募集中! MySQLの漢といっしょにはたらこう 4
  5. 5. SQL標準(SQL STANDARD) MySQLが思いついた便利な機能との関係 5
  6. 6. 6 SQL標準 • リレーショナルデータベースではデータを表に 格納し、その表に対して様々な指定をし、必 要な情報を取得することができます。 • SQL文自体は当初標準がなく、各社が独自 に仕様・実装を進めていましたが、1980年代 中盤以降、徐々にISO(国際標準化機構)や JISでの標準化が進み、各社実装依存の例 外や方言は残るものの基本的な部分はかな り共通化されてきました。
  7. 7. 7 SQL標準からのアプローチ • SQL標準からMySQL側にアプローチするわ けではありませんが、MySQLが未実装の機 能を実装するときに便利に利用できます • わりと最近MySQLに実装された機能には SQL標準に準拠したものがいくつかあります。 – SQL/PSMストアドルーチンやトリガー – 共通表式(Common Table Expression: CTE) – ウインドウ関数(Window Functions) – CHECK句 – 生成列(Generated Column)
  8. 8. 8 MySQLからのアプローチ • MySQLは開発当初から「便利」と思った機能 を実装してきました。 • その中にはSQL標準として取り込まれたり、 取り込まれないにしても多くのRDBMSでとり いれられた機能がいくつもあります。 – GROUP_CONCAT()関数 – LIMIT句 – REPLACE, INSERT …. ON CONFLICT …. – バルクインサート(INSERT …. VALUES(),(),()) のVALUES部分(複数の値の組)
  9. 9. GROUP_CONCAT WATCOM SQL由来の便利な関数 9
  10. 10. 10 GROUP_CONCAT() • 数字に対するSUMの文字版 – 文字の場合足せないのでデリミタ(通常カンマ)で 結合していく。 • DBCAT DBNAME ----- ------ 1 Firebird 2 Oracle 1 MySQL 2 DB2 1 PostgreSQL 2 SQLServer 1 SQLite DBCAT DBNAME ----- ------ 1 Firebird,MySQL,PostgreSQL,SQLite 2 Oracle,DB2,SQLServer
  11. 11. 11 MySQL,Firebird(LIST)がサポート • PostgreSQL 9.0でSTRING_AGGサポート – PostgreSQLでは、ARRAY_AGG類似表記の STRING_AGGをサポートしました。 – その後SQL Server 2017でSTRING_AGGがサ ポートされました。 • Oraclel 11g R2, IBM DB2 9.7 FP4で LISTAGGをサポート • SQLiteでは2007-12-14 (3.5.4)にて GROUP_CONCATをサポート
  12. 12. 12 SQL標準はLISTAGG ! • でも観点(落とし穴)がいろいろ – 結果の最大長(連結していくので要素が多いほど 大きくなる) • 超えた場合の扱い: 切捨てか例外か • MySQLの場合デフォルト1024, 超えたら切り捨て – 要素の順序(ORDER BY) – 要素のユニークネス(ALL | DISTINCT) – デリミタの指定
  13. 13. LIMIT, OFFSET ページング(Pagenation)に便利? 13
  14. 14. 14 FETCH FIRST n ROWS構文 • みなさんご存知のLIMITはSQL標準ではあり ません。。。。 • SELECT C1, C2 FROM TBL_A ORDER BY C1 OFFSET 5 ROWS FETCH FIRST 10 ROWS ONLY; • MySQLでは以下のどちらか – SELECT C1, C2 FROM TBL_A ORDER BY C1 LIMIT 10 OFFSET 5; – SELECT C1, C2 FROM TBL_A ORDER BY C1 LIMIT 5,10;
  15. 15. 15 FETCH FIRST n ROWS … WITH TIES構文 • 順位のようにソートして、同位を含める指定 • SELECT C1, C2 FROM TBL_A ORDER BY C1 OFFSET 5 ROWS FETCH FIRST 10 ROWS WITH TIES; • SELECT C1, C2 FROM TBL_A ORDER BY C1 LIMIT 5,10 WITH TIES;
  16. 16. 16 WITH TIES構文 →Window関数で書き換え可能 SELECT w.C1, w.C2 FROM ( SELECT TBL_A.*, RANK() OVER (ORDER BY C1) r FROM TBL_A ) w WHERE r <= 5;
  17. 17. 17 流れ MySQL: LIMIT 便利だよ ↓ せやな、じゃFETCH FIRST ROWSで by IBM ↓ でも、DB2にないOFFSET, WITH TIESつける で(なんで?)
  18. 18. REPLACE, INSERT..ON CONFLICT 表のマージに便利 18
  19. 19. 日本語サポートメンバー募集中! MySQLの漢といっしょにはたらこう 19
  20. 20. 20 MERGE軍勢に加わるか? • PostgreSQL, MySQL, SQLiteは加わらず – まぁ、INSERT … ON CONFLICTで事足りるの で。。。。
  21. 21. INSERT INTO … VALUES(値1),( 値2),…,(値N) INSERTには便利だが、まさかの展開 21
  22. 22. 22 MySQL最初のサポート時 MySQL & mSQL p.111より引用 (赤下線は筆者追加) https://www.oreilly.co.jp/books/4873110114/
  23. 23. 23 なので独自機能と思いきや • 実はSQL92(Full)で標準SQLで定義されてい た。 – SQL2はSQL92の古い名称。(SQL3がSQL99) • MySQL(と、DB2)が初期から実装していた。 – D.2.21 Changes in release 3.22.5 • Add support for INSERT INTO table ... VALUES(...),(...),(...), to allow inserting multiple rows with a single statement.
  24. 24. 24 わーい! MySQL!! • しかし、今はINSERTのみならず、より汎用的 な位置づけとして、テーブル値コンストラク ター(TVC: Table Value Constructor)とし て利用される。 • 以下のような利用方法 – INSERT...VALUESステートメントのVALUES 句 – MERGE ステートメントの USING 句 – FROM 句の派生テーブル – 「そのまま」
  25. 25. 25 FROM句の派生テーブルの例 • SQL Serverの例 – SELECT a, b FROM (VALUES (1, 2), (3, 4), (5, 6), (7, 8), (9, 10) ) AS MyTable(a, b);
  26. 26. 26 「そのまま」の例 • PostgreSQLの例(8.2以降) – 必要最小限の VALUES コマンドは以下のとおり。 VALUES (1, 'one'), (2, 'two'), (3, 'three'); – これは、カラムが二つで行が三つの表を返します。 事実上、これは次と同じことです。 SELECT 1 AS column1, 'one' AS column2 UNION ALL SELECT 2, 'two' UNION ALL SELECT 3, 'three';
  27. 27. まぁ、まだMYSQLには実装されて ないんですけどね。。。 27
  28. 28. 28 流れ MySQL: VALUSE(),(),() 便利だよ ↓ せやな、じゃ色々使えるように拡張したるわ by SQL標準 ↓ えー、MySQLくらいでいいんじゃない。。。 (MySQLはINSERT以外の拡張分は未サポート) ちなみにOracle DBはガン無視。。。。
  29. 29. 29 1.7 MySQLの標準への準拠 • 実はマニュアルにある – https://dev.mysql.com/doc/refman/5.6/ja/comp atibility.html – PostgreSQLマニュアルのように、細かいもので はなく概略的なもの • 1.7.1 標準 SQL に対する MySQL 拡張機能 • 1.7.2 MySQL と標準 SQL との違い • 1.7.3 MySQL における制約の処理
  30. 30. 日本語サポートメンバー募集中! 是非!! MySQLの漢といっしょにはたらこう 30

×