Slide 1

Slide 1 text

ザ・データベース、MySQL ~ きほんと近況~ 2026-06-06 日本MySQLユーザ会(MyNA) 坂井 恵 (@sakaik) オープンソースカンファレンス2026 Sendai

Slide 2

Slide 2 text

自己紹介 日本MySQLユーザ会の運営には、2003年ごろから携わっている 名前 坂井 恵 (SAKAI Kei) 主なアカウント @sakaik 主なコミュニティ役割 日本MySQLユーザ会 副代表 OSGeo日本支部 運営委員 最近書いた本 『データベースエンジニア養成講座』 (2025/04/04発売; 秀和システム(当時)) 『MySQL徹底入門第5版』 (2025/6/16発売; 翔泳社)

Slide 3

Slide 3 text

自己紹介 • 最近空間モデリングはじめました • https://demo.3dportal.jp/20260603first/ • 点群データ+フォトグラメトリの技術で、結構きれいです • 楽しい!

Slide 4

Slide 4 text

今日のテーマ (案内文) 今回のOSCでは若い学生さんも多く来られるということで、そも そも「データベース(DBMS)ってなんなんだろう」ということか ら紹介したいと思います。OSSのDBMSソフトの代表格のひとつ であるMySQLを採り上げます。そのほか、開発社であるOracle社 のMySQLに対する体制が今年に入ってから大きく変わっている ので、その最新情報もお伝えできればと思います。発表者が大好 きな地理情報データ(GIS)の話も少し入るよ。

Slide 5

Slide 5 text

データベースとは • データを管理し、出し入れの操作ができる専用プログラム • 色々な種類がある。「リレーショナルデータベース(RDB)」と いう仕組みがよく使われる • RDBは 「テーブル」を作って、「SQL」を使ってデータを出し 入れする

Slide 6

Slide 6 text

データを管理するだけのために ソフトがいるの?? • ソフトがメモリで管理すりゃいいじゃない • → 電源消えたりソフト終了したらデータ消えますけど • ファイルに書いておけばいいじゃない • →次々にデータが変更される場合(在庫引き当てとか)大丈夫? • →集計作業とか結構面倒じゃない? 自分で実装すると結構大変よ!

Slide 7

Slide 7 text

RDBMSを使うことで得られるメ リット •シンプル •高速 •安全

Slide 8

Slide 8 text

RDBMSを使うことで得られる メリット ■シンプル • データの出し入れと管理を専門システムに任せることで、プログラムのコー ドをシンプルにできる ■高速 • データが増えても • 同時利用者が増えても ■安全 • 「壊れる」からの安全 • 「悪い人」からの安全

Slide 9

Slide 9 text

データベース(RDBMS) の ソフトウェア • 主に以下のようなソフトウェアがあります オープンソース • MySQL • PostgreSQL 非オープンソース • Oracle Database • Microsoft SQL Server • IBM Db2 Database ※今日の説明は、主にMySQLを具体例として使いますが、他のDBMSでも考え方は同じです。 ※実は「データベース」にも色々な種類があるのですが、今日の話の中では、SQLを使う「リレーショナルデータベース (RDBMS)」を対象とします

Slide 10

Slide 10 text

そもそもデータベースってどこで使われる の? • シンプルな例(サーバは機能によって複数台に分けられることがあります)

Slide 11

Slide 11 text

そもそもデータベースってどこで使われる の? • データ保管のためのワクをあらかじめ定義(テーブル) • データ配置を整理して高速に取り出せるように • バックアップなどの機能 • プログラムから命令する  データの検索・取り出し  データの登録  データの変更  データの削除

Slide 12

Slide 12 text

そもそもデータベースってどこで使われる の? • プログラムから命令する  データの検索・取り出し  データの登録  データの変更  データの削除 • データ保管のためのワクをあらかじめ定義 • データ配置を整理して高速に取り出せるように • バックアップなどの機能 SQL テーブルなど

Slide 13

Slide 13 text

テーブル • テーブルの例(イメージ) • 1行が1件のデータ(レコード) • 各列(「住所」や「氏名」など)には、その列に定められた内容だけを登録する • Excelのシートにイメージは似ているけど、カーソルキーで移動しながらデータ操作するわけでは ない

Slide 14

Slide 14 text

テーブル • テーブルの列には「型」を決めておく 数値 文字列 文字列 文字列 文字列 数値 日付

Slide 15

Slide 15 text

テーブルの「型」 • RDBMSにより、少し異なる部分があります。お使いのマニュアルを参照してください。 • MySQLの場合は以下のURLに記載されています • https://dev.mysql.com/doc/refman/8.0/en/data-types.html

Slide 16

Slide 16 text

テーブルのデータには順序はない 目に見えるイメージ こういうイメージを 持つと良いかも→

Slide 17

Slide 17 text

SQLとは • RDBMSを操作するための専用言語 • エス・キュー・エル と読む • Structured Query Language • ISOで標準化されている。 • SQL86/SQL89/SQL92/SQL:1999/SQL:2003/SQL:2008/SQL:2016 など • 1992年のSQL92 (ISO 9075-1992) で基本的な仕様はほぼ完成 • 冒頭で紹介した、様々なRDBMSがこの標準にできるだけ従って開発されてい るので、RDBMSの種類に依らず同じ構文を使用可能 • 実際にはある程度の方言はある(とは言え、かなり同じと言って良いと思う)

Slide 18

Slide 18 text

コラム: "SQL" の発音 • エス・キュー・エルです • (シークェルではないです) 例: MySQL リファレンスマニュアルより https://dev.mysql.com/doc/refman/8.0/en/what-is-mysql.html The official way to pronounce “MySQL” is “My Ess Que Ell” (not “my sequel”), but we do not mind if you pronounce it as “my sequel” or in some other localized way.

Slide 19

Slide 19 text

SQLでできること • データベース自体への操作  スキーマ作成/破棄  テーブル作成/破棄/変更  その他DBオブジェクトの作成/破棄/変更 • テーブルのデータに対する操作  データの登録(行追加)  既存データの修正(更新・変更)  既存データを削除  既存データの取出し(抽出、集計) • データの制御に関する指示  トランザクション制御 ※今日はこの中の一部のみ紹介します

Slide 20

Slide 20 text

SQLでできること ここから、具体的なSQLの構文を紹介していきます。 が 限られた時間ですので、 「こんな指示をすると」 「こんなことができる」 という雰囲気をつかんでもらえればと思います。

Slide 21

Slide 21 text

SQLでできること • データベース自体への操作  スキーマ作成/破棄  テーブル作成/破棄/変更  その他DBオブジェクトの作成/破棄/変更 • テーブルのデータに対する操作  データの登録(行追加)  既存データの修正(更新・変更)  既存データを削除  既存データの取出し(抽出、集計) • データの制御に関する指示  トランザクション制御 ※今日はこの中の一部のみ紹介します

Slide 22

Slide 22 text

スキーマ(データベース)の作成 • スキーマ = テーブルを入れるハコ • MySQLでは CREATE DATABASE文 • RDBMSによりスキーマやデータベースの考え方が少し異なります CREATE DATABASE mysystem; [例]

Slide 23

Slide 23 text

テーブルの作成と破棄 • CREATE TABLE 文で作る • 列名と、列の型、列の性質(制約)を羅列する CREATE TABLE items ( item_id INTEGER PRIMARY KEY, item_name VARCHAR(10) NOT NULL, price BIGINT, zaiko INTEGER, created_at DATETIME ); [例]テーブルの作り方 ※データ型は、各RDBMSのマニュアルを参照してください。 DROP TABLE items; [例]テーブルの破棄の仕方 今日は説明しませんが: • 既存テーブル定義の「変更」もできます(ALTER 文) • テーブル以外にも色々なオブジェクトがあります。CREATE文で作ります

Slide 24

Slide 24 text

SQLでできること • データベース自体への操作  スキーマ作成/削除  テーブル作成/削除/変更  その他DBオブジェクトの作成/削除/変更 • テーブルのデータに対する操作  データの登録(行追加)  既存データの修正(更新・変更)  既存データを削除  既存データの取出し(抽出、集計) • データの制御に関する指示  トランザクション制御 ※今日はこの中の一部のみ紹介します この4つが データの 基本操作!

Slide 25

Slide 25 text

データ操作:データ登録 • INSERT文を使います • 1件ずつ、登録します [例] INSERT INTO items (item_id, item_name, price, created_at) VALUES (12, '商品1', 150, '2022-09-07'); INSERT INTO items VALUES (12, '商品2', 380, 100, '2022-09-07'); CREATE TABLE items ( item_id INTEGER PRIMARY KEY, item_name VARCHAR(10) NOT NULL, price BIGINT, zaiko INTEGER, created_at DATETIME ); 先程 このSQLで 作ったテーブルに データを追加します

Slide 26

Slide 26 text

その他のデータ操作を学ぶ前に... テーブルに登録済のデータに対する操作を学んで行くために • 「どの行のデータ」を操作したいのかを指示する方法を学ぶ必要があります • Excelなどのスプレッドシートのように「123行目のデータ」という概念は、ない • ということで・・・・(つづく) (削除/更新/抽出)

Slide 27

Slide 27 text

対象の「行」を特定する方法 • 行を特定する方法を習得するのが大切! • 格納データには、Excelとかみたいに「何行目」という概念はない • 以下の ITEMS テーブルのデータを例にすると・・・・ • 「ID列の値が 8 のもの」 • 「CATEGORY_IDが 1または2のもの」 • 「CREATED_ATが 2021年11月1日以降のもの」 • 「 CATEGORY_IDが5のもののうち、AMOUNTが10以下のもの」 • 「ITEM_NAME に "mono"という文字列を含むもの」 • 「CATEGORY_IDが9以外のもの」 などのように、列の値を使って指定します。 ID ITEM_NAME CATEGORY_ID AMOUNT CREATED_AT 11 Nanika 3 3 2021/6/21 15 Tekitou 5 10 2021/7/23 13 Arekore 5 0 2021/9/12 8 iimono 2 27 2021/11/8 6 Good goods 1 21 2021/11/30 20 sample 2 99 2022/6/23

Slide 28

Slide 28 text

「行」を指定する方法 • 「ID列の値が 8 のもの」 • 「CATEGORY_IDが 1または2のもの」 • 「CREATED_ATが 2021年11月1日以降のもの」 • 「 CATEGORY_IDが5のもののうち、AMOUNTが10以下のもの」 • 「ITEM_NAME に "mono"という文字列を含むもの」 • 「CATEGORY_IDが9以外のもの」 • ID=8 • CATEGORY_ID = 1 OR CATEGORY_ID = 2 • CREATED_AT >= '2021-11-01' • CATEGORY_ID=5 AND AMOUNT<=10 • ITEM_NAME LIKE '%mono%' • CATEGORY_ID <> 9

Slide 29

Slide 29 text

行の特定(WHERE)あれこれ 基本:カラムの値がどういうものを取得したいかを指定する 例) 組み合わせ(AND と OR) 例) • col1 = 1234 • col2 = 'ok' • col3 > 1000 • col4 <= 10000 • col5 IN (123, 124, 127, 130) • col6 <> '05' WHERE col1 = 1234 AND col2 = 'ok' AND col3 > 1000 AND (col4='15' OR col5 > '2021-01-01') • LEFT(col7, 2) = 'Ho'

Slide 30

Slide 30 text

データ操作:データ削除 • DELETE文を使います • 行を特定する条件は、WHERE句で指定します DELETE FROM ITEMS WHERE CREATED_AT <= '2021-12-31'; [例] itemsテーブルの データの操作例

Slide 31

Slide 31 text

データ操作:データ更新 • UPDATE文を使います • 行を特定する条件は、WHERE句で指定します • 変更したいカラムと値の組を SET句で指定します UPDATE ITEMS SET AMOUNT = 20 WHERE ID=13; [例] itemsテーブルの データの操作例

Slide 32

Slide 32 text

データ操作:データ取り出しのきほん (抽出、検索、集計) • SELECT文を使います • 行を特定する条件は、WHERE句で指定します • 取得したい列を SELECT 句に指定します • SELECT句には計算式や関数を使用した加工を行うこともできます • 取得列には別名を付けることができます(ASは省略可能) SELECT ID, ITEM_NAME, AMOUNT FROM ITEMS WHERE ID=13; [例] SELECT ID, SUBSTR(ITEM_NAME,3,4) AS NAME_PART, TYPE1_AMT + TYPE2_AMT AS GOUKEI FROM ITEMS WHERE ID=13; [例] itemsテーブルの データの操作例

Slide 33

Slide 33 text

SELECT文をもう少し解説(きほん) ID ITEM_NAME CATEGORY_ID AMOUNT CREATED_AT 11 Nanika 3 3 2021/6/21 15 Tekitou 5 10 2021/7/23 13 Arekore 5 0 2021/9/12 8 iimono 2 27 2021/11/8 6 Good goods 1 21 2021/11/30 20 sample 2 99 2022/6/23 例:ITEMS テーブルとデータ SELECT [取得したいカラムを羅列] FROM [取得元テーブル名] WHERE [行を特定する条件] ORDER BY [並べ替えに使用する列]; SELECT ID, ITEM_NAME, CATEGORY_ID FROM ITEMS WHERE AMOUNT > 20 ORDER BY AMOUNT; ほしい列を絞る ほしい行を絞る

Slide 34

Slide 34 text

列は、加工(計算等)をすることができる AMOUNTを2倍して得る ITEM_NAMEの先頭文字を得る例 (LEFT()関数を使用) 列の指定あれこれ SELECT ID, ITEM_NAME, AMOUNT * 2 FROM ITEMS WHERE AMOUNT > 20 ORDER BY AMOUNT; SELECT ID, LEFT(ITEM_NAME,2), AMOUNT FROM ITEMS WHERE AMOUNT > 20 ORDER BY AMOUNT;

Slide 35

Slide 35 text

忘れないで!取得順序指定! • RDBMS内に格納されているデータには(Excelのシートとは違って)順序はありません。「何行目」 という指定がないことからも分かりますね。 • SELECT文で取得したい行を指定する際、どんな順序で取得したいかを指定します。(指定しない と、順序は「不定」となります) • 順序指定は ORDER BY 句を使用します。昇順(小さい順)は ASCを、降順(大きい順)は DESCを指定 します。(ASCは省略可能) SELECT ID, ITEM_NAME, AMOUNT FROM ITEMS WHERE ID=13 ORDER BY CREATED_AT DESC; itemsテーブルの データの操作例

Slide 36

Slide 36 text

データ抽出:集計 • SQLの検索機能の醍醐味 → 強力な集計機能 • GROUP BY 句を使います ID ITEM_NAME CATEGORY_ID AMOUNT CREATED_AT 11 Nanika 3 3 2021/6/21 15 Tekitou 5 10 2021/7/23 13 Arekore 5 0 2021/9/12 8 iimono 2 27 2021/11/8 6 Good goods 1 21 2021/11/30 20 sample 2 99 2022/6/23 SELECT CATEGORY_ID, COUNT(*) cnt, SUM(AMOUNT) goukei FROM ITEMS WHERE AMOUNT > 0 GROUP BY CATEGORY_ID; CATEGORY _ID cnt goukei 1 1 21 2 2 126 3 1 3 5 2 10

Slide 37

Slide 37 text

データ抽出:複数テーブルから • 多くの場合、SQLでの抽出(検索・集計)は、複数のテーブルをくっつけて情報を取得することが多 いです • 例えば、以下の ITEMSテーブルのCATEGORY_ID 列の数値は、CATEGORYテーブルの CAT_ID で 示される行を参照することで、その名称を取得することができます。 • テーブルを「結合」して 取得します。 ID ITEM_NAME CATEGORY_ID AMOUNT 11 Nanika 3 3 15 Tekitou 5 10 13 Arekore 5 0 8 iimono 2 27 6 Good goods 1 21 20 sample 2 99 CAT_ID CATEGORY_NAME NANIKA 1 カテゴリ1 2 カテゴリ2 3 カテゴリ3 5 カテゴリ5 7 カテゴリ7 [ITEMS] [CATEGORY]

Slide 38

Slide 38 text

テーブルの「結合」 • JOIN句を使用します • 両方のテーブルに存在するものだけを取得するもの(INNER JOIN)と、 どちらかのテーブルを 軸として、相手側テーブルの対象データ有無にかかわらず取得するもの(OUTER JOIN)がありま す。 • 個人的な意見ですが、まずはOUTER JOIN でテーブル結合の考え方になじんだ後で、「両方に存在するものだ け」のINNER JOIN を追加で覚えるという順序でいいんじゃなかな、と思っています ID ITEM_NAME CATEGORY_ID AMOUNT 11 Nanika 3 3 15 Tekitou 5 10 13 Arekore 5 0 8 iimono 2 27 6 Good goods 1 21 20 sample 2 99 CAT_ID CATEGORY_NAME NANIKA 1 カテゴリ1 2 カテゴリ2 5 カテゴリ5 7 カテゴリ7 [ITEMS] [CATEGORY]

Slide 39

Slide 39 text

テーブルの「結合」 • 左側のテーブルを基準にOUTER JOIN(外部結合)するには LEFT OUTER JOIN を使用します。 • 2つのテーブルだけでなく、3つ4つ5つ...結合することもできます。 ID ITEM_NAME CATEGORY_ID AMOUNT 11 Nanika 3 3 15 Tekitou 5 10 13 Arekore 5 0 8 iimono 2 27 6 Good goods 1 21 20 sample 2 99 CAT_ID CATEGORY_NAME NANIKA 1 カテゴリ1 2 カテゴリ2 5 カテゴリ5 7 カテゴリ7 [ITEMS] [CATEGORY] SELECT ITEMS.ID, ITEMS.ITEM_NAME, CATEGORY.CATEGORY_NAME, CATEGORY.NANIKA, ITEMS.AMOUNT FROM ITEMS LEFT OUTER JOIN CATEGORY ON (ITEMS.CATEGORY_ID=CATEGORY.CAT_ID) WHERE AMOUNT > 0

Slide 40

Slide 40 text

テーブルの別名 • 複数のテーブルを使用する際は、各カラムがどのテーブルのものかを修飾する必要があります。 • カラムの羅列をする際など、結構長いので、短めの別名を付けることも多いです。 SELECT ITEMS.ID, ITEMS.ITEM_NAME, CATEGORY.CATEGORY_NAME, CATEGORY.NANIKA, ITEMS.AMOUNT FROM ITEMS LEFT OUTER JOIN CATEGORY ON (ITEMS.CATEGORY_ID=CATEGORY.CAT_ID) WHERE ITEMS.AMOUNT > 0 ORDER BY ITEMS.ID; SELECT it.ID, it.ITEM_NAME, cat.CATEGORY_NAME, cat.NANIKA, it.AMOUNT FROM ITEMS it LEFT OUTER JOIN CATEGORY cat ON (it.CATEGORY_ID=cat.CAT_ID) WHERE it.AMOUNT > 0 ORDER BY it.ID;

Slide 41

Slide 41 text

SQLはさらに深く広い • 速度(パフォーマンス) • 良いハコ(テーブル設計) • 多彩な表現 • サブクエリ • CASE式 • Window関数 • CTE ひとつひとつ学んで、 できるようになっていく楽しさがあります。 ぜひ、データベース/SQLの学びに一歩を踏み出してください

Slide 42

Slide 42 text

自分で試してみたくなった人のために 「第一歩」を踏み出す時に迷子になりやすいあなたのためのガイド • 何のソフトを使うかを決める • インストールする • (必要ならば初期ユーザ等の設定をする) • 接続してみる • スキーマ(データベース)を作成してみる • スキーマの中に入って(*1) 、テーブルを作ってみる • テーブルにデータを何件か登録してみる • 登録したデータを見てみる • そのうち1件を削除してみる • 登録したデータの一部の値を更新してみる • 登録したデータを「集計」してみる • 「コード」的なものを別テーブルとして作成できそうなデータであれば、作 成して、テーブルの結合にもトライしてみる (*1)ちょっと正確な表現ではありませんがご了承ください

Slide 43

Slide 43 text

自分で試してみたくなった人のた めに MySQL編 • インストール:Windows/Linux/MacOS などで動作します。インストール方法は調べてください(インストーラ または yum/aptなどのパッケージあります)。2022年9月現在の最新バージョンは、MySQL 8.0.30 です。インス トール方法によって、パスワードを途中で設定したり、画面に表示されていたり、ログに書かれていたりしま す。 • コマンドライン(コマンドプロンプトやbash)で、MySQLに接続します。 • 接続されたら、とりあえず情報見てみましょう • データベース(スキーマ)を作成します。お好きな名前で。 • 作ったスキーマを使用する宣言をします(「中に入る」イメージ) これで、テーブルを作ったり、データを入れたり出したりできるようになります。 > mysql -uroot -p mysql> status; mysql> CREATE DATABASE sukinanamae; mysql> USE sukinanamae; インストール方法によっては、 初回接続後にパスワードを変更 する必要があるかもしれません。 画面の表示や、ドキュメントを よく見て対応しましょう。

Slide 44

Slide 44 text

自分で試してみたくなった人のために MySQL編 知っておくと便利なコマンドを紹介: • データベース(スキーマ)一覧を見る • カレントスキーマ(今使うことになっているスキーマ)を見る • カレントスキーマに存在するテーブル一覧を見る • テーブル定義を見る • MySQLから切断する mysql> SHOW DATABASES; mysql> SHOW TABLES; mysql> DESC mitai_table; mysql> SHOW CREATE TABLE mitai_table¥G mysql> SELECT DATABASE(); ¥Gの代わりに普通に ; でも良い です。見比べてみてください。 mysql> exit;

Slide 45

Slide 45 text

MySQLの地理情報機能 • RDBMS(MySQL)では、数値や文字、日付時刻などのデータを 扱うことができます。 • 例えば「日付時刻」を扱う専用の型がなかったとしたら・・・ • 文字列として “2026-06-06 11:36:40” のように保管する方法が考えられる • まぁ使えなくはないが、便利ではない • 「2つの日時の差」、とか「今から30日と12時間後」みたいな計算は? • 14月86日のような日時も自由に登録できちゃうのは、ヤだね • 「位置の情報」も同じ • 緯度経度とか、専用の型があったほうが便利 • 2点の距離を計算したり • 正しい地点(北緯160度とかがない世界)を扱える

Slide 46

Slide 46 text

MySQLの地理情報とは • 位置の情報=「点」の情報 • 緯度経度などで場所を表す • 実はそれだけじゃない。「平面直角座標系」といってメートルで位置 を表す手法もある • 緯度経度も、測地系と呼ばれる様々な地球モデルによって異なる • 日本では JGD2011(JGD2024)か、国際的なWGS84 を知っていれば大体足りる • →MySQLは、バージョン 8.0から本格的に対応 • PostgreSQLの extensionである PostGIS が大幅に先行

Slide 47

Slide 47 text

MySQLの地理情報 • 道路や川などの中心線の情報=「線」の情報 • 点を複数つないで一本の線を表現 • 枝分かれはしない • 仙台市や宮城県の形=「面」の情報 • 点を複数つないで元の点に戻る表現 • 当然クロスはしちゃだめ • 中をくりぬくこともできる →こういったものをMySQLのデータとして扱える

Slide 48

Slide 48 text

MySQLの地理情報 • ThinkIT で連載中です • 基礎からわかる • たのしく分かる • 関係ないことまで分かる 基本的に一回一回にテーマを設定してるオムニバスですが、楽し く基礎知識を得られると思います。ぜひご覧ください

Slide 49

Slide 49 text

最近のMySQL • MySQL 9.7 LTS が出ました(2026年4月: 9.7.0) • これから8年間サポートされるメジャーバージョンです • 2年に1回、メジャーバージョンが出ます • 現在は 8.4.x と 9.7.x が LTSシリーズ • 次のメジャーバージョンに向けて 新たなInnovation Releaseシ リーズが始まる見込みです(2026年7月) • 基本的に 3ヶ月に1回、リリースされています • 最近Oracle社(MySQLの開発元)がユーザコミュニティに力を 入れ始めました。期待

Slide 50

Slide 50 text

おしまい • ブースにもぜひお越しください。

Slide 51

Slide 51 text

No content