O slideshow foi denunciado.
Utilizamos seu perfil e dados de atividades no LinkedIn para personalizar e exibir anúncios mais relevantes. Altere suas preferências de anúncios quando desejar.

My sql casual12lt

340 visualizações

Publicada em

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

Publicada em: Software
  • Seja o primeiro a comentar

  • Seja a primeira pessoa a gostar disto

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

×