SlideShare a Scribd company logo
1
SQL標準とMySQL
MySQL Casual Talks vol.12
2019-09-13 19:50 LT
@meijik
免責事項
• 本プレゼンテーションにおいて示されている
見解は、私自身の見解であって、私の所属す
る会社・団体の見解を必ずしも反映したもの
ではありません。ご了承ください。
2
自己紹介
• 日本オラクルでMySQLサポートをしています。
–漢と書いてオトコ(奥野幹也氏)の同僚。
–漢は「理論から学ぶデータベース実践入門 」「Pro
MySQL NDB Cluster(共著)」著者
• DB関連のブログや書籍を書いてます。
–キムラデービーブログ(blog.kimuradb.com)
–「おうちで学べるデータベースのきほん(共著)」
• ミックさんの知り合い。外人じゃないよ。
• MyNA会員、Neo4Jユーザ会会員
• Firebird日本ユーザ会の理事長
日本語サポートメンバー募集中!
MySQLの漢といっしょにはたらこう
4
SQL標準(SQL STANDARD)
MySQLが思いついた便利な機能との関係
5
6
SQL標準
• リレーショナルデータベースではデータを表に
格納し、その表に対して様々な指定をし、必
要な情報を取得することができます。
• SQL文自体は当初標準がなく、各社が独自
に仕様・実装を進めていましたが、1980年代
中盤以降、徐々にISO(国際標準化機構)や
JISでの標準化が進み、各社実装依存の例
外や方言は残るものの基本的な部分はかな
り共通化されてきました。
7
SQL標準からのアプローチ
• SQL標準からMySQL側にアプローチするわ
けではありませんが、MySQLが未実装の機
能を実装するときに便利に利用できます
• わりと最近MySQLに実装された機能には
SQL標準に準拠したものがいくつかあります。
– SQL/PSMストアドルーチンやトリガー
– 共通表式(Common Table Expression: CTE)
– ウインドウ関数(Window Functions)
– CHECK句
– 生成列(Generated Column)
8
MySQLからのアプローチ
• MySQLは開発当初から「便利」と思った機能
を実装してきました。
• その中にはSQL標準として取り込まれたり、
取り込まれないにしても多くのRDBMSでとり
いれられた機能がいくつもあります。
– GROUP_CONCAT()関数
– LIMIT句
– REPLACE, INSERT …. ON CONFLICT ….
– バルクインサート(INSERT …. VALUES(),(),())
のVALUES部分(複数の値の組)
GROUP_CONCAT
WATCOM SQL由来の便利な関数
9
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
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
SQL標準はLISTAGG !
• でも観点(落とし穴)がいろいろ
– 結果の最大長(連結していくので要素が多いほど
大きくなる)
• 超えた場合の扱い: 切捨てか例外か
• MySQLの場合デフォルト1024, 超えたら切り捨て
– 要素の順序(ORDER BY)
– 要素のユニークネス(ALL | DISTINCT)
– デリミタの指定
LIMIT, OFFSET
ページング(Pagenation)に便利?
13
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
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
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
流れ
MySQL: LIMIT 便利だよ
↓
せやな、じゃFETCH FIRST ROWSで by IBM
↓
でも、DB2にないOFFSET, WITH TIESつける
で(なんで?)
REPLACE, INSERT..ON
CONFLICT
表のマージに便利
18
日本語サポートメンバー募集中!
MySQLの漢といっしょにはたらこう
19
20
MERGE軍勢に加わるか?
• PostgreSQL, MySQL, SQLiteは加わらず
– まぁ、INSERT … ON CONFLICTで事足りるの
で。。。。
INSERT INTO … VALUES(値1),(
値2),…,(値N)
INSERTには便利だが、まさかの展開
21
22
MySQL最初のサポート時
MySQL & mSQL
p.111より引用
(赤下線は筆者追加)
https://www.oreilly.co.jp/books/4873110114/
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
わーい! MySQL!!
• しかし、今はINSERTのみならず、より汎用的
な位置づけとして、テーブル値コンストラク
ター(TVC: Table Value Constructor)とし
て利用される。
• 以下のような利用方法
– INSERT...VALUESステートメントのVALUES 句
– MERGE ステートメントの USING 句
– FROM 句の派生テーブル
– 「そのまま」
25
FROM句の派生テーブルの例
• SQL Serverの例
– SELECT a, b FROM (VALUES (1, 2), (3, 4),
(5, 6), (7, 8), (9, 10) ) AS MyTable(a, b);
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';
まぁ、まだMYSQLには実装されて
ないんですけどね。。。
27
28
流れ
MySQL: VALUSE(),(),() 便利だよ
↓
せやな、じゃ色々使えるように拡張したるわ by
SQL標準
↓
えー、MySQLくらいでいいんじゃない。。。
(MySQLはINSERT以外の拡張分は未サポート)
ちなみにOracle DBはガン無視。。。。
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 における制約の処理
日本語サポートメンバー募集中!
是非!!
MySQLの漢といっしょにはたらこう
30

More Related Content

PPTX
いまいまMySQL@OSC2016福岡
PDF
Node js 入門
PDF
WordBeach 2012
PPTX
Node.jsではじめるサーバ構築
PDF
MySQL Fabricつらい
PDF
NDBCLUSTERを使わない理由
PPTX
このべん第一回 ~ 「ConoHaってどんなVPS?」を勉強して3,000円クーポンをもらっちゃおうの会
PDF
NCstudy 2.5
いまいまMySQL@OSC2016福岡
Node js 入門
WordBeach 2012
Node.jsではじめるサーバ構築
MySQL Fabricつらい
NDBCLUSTERを使わない理由
このべん第一回 ~ 「ConoHaってどんなVPS?」を勉強して3,000円クーポンをもらっちゃおうの会
NCstudy 2.5

What's hot (20)

PDF
今日はMongoDBの話はしない
PPTX
クラウドのようなVPS 「ConoHa」 を使ってみよう。
PDF
CSS text-spacingサポート等Vivliostyle.jsの進化と今後の開発予定
PDF
これからはじめるひとのためのdev.mysql.com
PDF
MySQLの系譜について少々
PPTX
OSC2017 Hokkaido. MySQL今こそインストールを極めよう~改めて考える環境構築~
PPTX
FreeBSD VPSでLive Migration
PDF
データベース勉強会 In 広島 mongodb
PPTX
20130417 movbale type_seminar
PDF
MySQL5.7 GA の Multi-threaded slave
PDF
mrubyでゲームを書いてみた
PDF
こんてなぐらし!〜FreeBSD VPSでライブマイグレーション〜
PPTX
Aozorahack20161106
PPTX
Sql world を支える技術
PDF
aozorahack hackathon #1
PPTX
AWSのRedHatにMySQL最速インストール
PDF
JAWS-UG CLI #07 VPC
PDF
Scala web framework比較
PDF
Introduction to MongoDB
PDF
新人営業のためのよくわかる仮想化技術r
今日はMongoDBの話はしない
クラウドのようなVPS 「ConoHa」 を使ってみよう。
CSS text-spacingサポート等Vivliostyle.jsの進化と今後の開発予定
これからはじめるひとのためのdev.mysql.com
MySQLの系譜について少々
OSC2017 Hokkaido. MySQL今こそインストールを極めよう~改めて考える環境構築~
FreeBSD VPSでLive Migration
データベース勉強会 In 広島 mongodb
20130417 movbale type_seminar
MySQL5.7 GA の Multi-threaded slave
mrubyでゲームを書いてみた
こんてなぐらし!〜FreeBSD VPSでライブマイグレーション〜
Aozorahack20161106
Sql world を支える技術
aozorahack hackathon #1
AWSのRedHatにMySQL最速インストール
JAWS-UG CLI #07 VPC
Scala web framework比較
Introduction to MongoDB
新人営業のためのよくわかる仮想化技術r
Ad

Similar to My sql casual12lt (20)

PDF
オープンソース・データベースの最新事情
PDF
What's New in MySQL 5.7 InnoDB
PDF
MySQL Cluster 7.4で楽しむスケールアウト @DB Tech Showcase 2015/06
PDF
大規模ソーシャルゲーム開発から学んだPHP&MySQL実践テクニック
PDF
オープンソースRDBMS新機能ランダウンOSC2017TokyoSpring
PPTX
いまいまMySQL@OSC2016長岡
PPT
Devsumi2013【15-e-5】NoSQLの野心的な使い方 ~Apache Cassandra編~
PDF
PHP+MySQLを使ったスケーラブルなソーシャルゲーム開発
PDF
Not only sql _ 新卒エンジニア勉強会20130417
PDF
MySQLアーキテクチャ図解講座
PDF
SQL+NoSQL!? それならMySQL Clusterでしょ。
PPT
Cassandra(no sql)によるシステム提案と開発
PDF
あなたが知らない リレーショナルモデル
PPTX
初心者向け負荷軽減のはなし
PDF
地方企業がソーシャルゲーム開発を成功させるための10のポイント
PDF
MySQL at Yahoo! JAPAN #dbts2018
PDF
MySQL 5.5 Update #denatech
PPTX
NoSQLに関するまとめ
PDF
Standard Edition 2でも使えるOracle Database 12c Release 2オススメ新機能
PDF
MySQL Cluster 新機能解説 7.5 and beyond
オープンソース・データベースの最新事情
What's New in MySQL 5.7 InnoDB
MySQL Cluster 7.4で楽しむスケールアウト @DB Tech Showcase 2015/06
大規模ソーシャルゲーム開発から学んだPHP&MySQL実践テクニック
オープンソースRDBMS新機能ランダウンOSC2017TokyoSpring
いまいまMySQL@OSC2016長岡
Devsumi2013【15-e-5】NoSQLの野心的な使い方 ~Apache Cassandra編~
PHP+MySQLを使ったスケーラブルなソーシャルゲーム開発
Not only sql _ 新卒エンジニア勉強会20130417
MySQLアーキテクチャ図解講座
SQL+NoSQL!? それならMySQL Clusterでしょ。
Cassandra(no sql)によるシステム提案と開発
あなたが知らない リレーショナルモデル
初心者向け負荷軽減のはなし
地方企業がソーシャルゲーム開発を成功させるための10のポイント
MySQL at Yahoo! JAPAN #dbts2018
MySQL 5.5 Update #denatech
NoSQLに関するまとめ
Standard Edition 2でも使えるOracle Database 12c Release 2オススメ新機能
MySQL Cluster 新機能解説 7.5 and beyond
Ad

My sql casual12lt