mysql> SELECT * FROM t26 WHERE flg1=1
-> INTERSECT
-> SELECT * FROM t26 WHERE flg2=1;
ERROR 1064 (42000): You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax touse near 'INTERSECTSELECT * FROM t26 WHERE flg2=1' at line 2
mysql> SELECT * FROM t26 WHERE flg1=1
-> EXCEPT
-> SELECT * FROM t26 WHERE flg2=1;
ERROR 1064 (42000): You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax touse near 'EXCEPTSELECT * FROM t26 WHERE flg2=1' at line 2
おわりに
新しいバージョンによって、速度が改善したり、安定性が増したり、色々進化するものですが、やっぱり一番ワクワクするのは新しい文が使えるようになった時ですよね(とウワモノ屋を自認する私は思うのです)。マイナーバージョンアップなのに新構文が増えるってどうなのよ、という向きもありますが、そういった所も含めてエキサイティングな MySQL 8.0 であると言えるかと思います(笑)。
mysql> show warnings;
+-------+------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| Level | Code | Message |
+-------+------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| Note | 1003 | /* select#1 */select `test`.`t26`.`id` AS `id`,`test`.`t26`.`name` AS `name`,`test`.`t26`.`flg1` AS `flg1`,`test`.`t26`.`flg2` AS `flg2` from `test`.`t26` where (`test`.`t26`.`flg1` = 1) intersect all/* select#2 */select `test`.`t26`.`id` AS `id`,`test`.`t26`.`name` AS `name`,`test`.`t26`.`flg1` AS `flg1`,`test`.`t26`.`flg2` AS `flg2` from `test`.`t26` where (`test`.`t26`.`flg2` = 1) |
+-------+------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
1rowin set (0.00 sec)
mysql> EXPLAINSELECT * FROM t26 WHERE flg1=1 UNION SELECT * FROM t26 WHERE flg2=1;
+----+--------------+------------+------------+------+---------------+------+---------+------+------+----------+-----------------+
| id | select_type | table | partitions | type | possible_keys | key | key_len | ref | rows | filtered | Extra |
+----+--------------+------------+------------+------+---------------+------+---------+------+------+----------+-----------------+
| 1 | PRIMARY | t26 | NULL | ALL | NULL | NULL | NULL | NULL | 8 | 12.50 | Usingwhere |
| 2 | UNION | t26 | NULL | ALL | NULL | NULL | NULL | NULL | 8 | 12.50 | Usingwhere |
| 3 | UNION RESULT | <union1,2> | NULL | ALL | NULL | NULL | NULL | NULL | NULL | NULL | Usingtemporary |
+----+--------------+------------+------------+------+---------------+------+---------+------+------+----------+-----------------+
3rowsin set, 1 warning (0.00 sec)
mysql> SHOW WARNINGS;
+-------+------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| Level | Code | Message |
+-------+------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| Note | 1003 | /* select#1 */select `test`.`t26`.`id` AS `id`,`test`.`t26`.`name` AS `name`,`test`.`t26`.`flg1` AS `flg1`,`test`.`t26`.`flg2` AS `flg2` from `test`.`t26` where (`test`.`t26`.`flg1` = 1) union /* select#2 */select `test`.`t26`.`id` AS `id`,`test`.`t26`.`name` AS `name`,`test`.`t26`.`flg1` AS `flg1`,`test`.`t26`.`flg2` AS `flg2` from `test`.`t26` where (`test`.`t26`.`flg2` = 1) |
+-------+------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
1rowin set (0.00 sec)
今回は「Club MySQL」という、ひとりのお話をじっくりと聞かせていただこうという趣旨の開催として、梶山さんに「MySQL Shell」と「MySQL Shell を VSC Codeから使える MySQL Shell for VS Code」のお話をたっぷり聞かせてもらいました。時々思惑と異なる動作をしたり、接続先を勘違いして欲しい結果が得られなかったなどの「リアル」を見せてもらい、利用方法のイメージがわいた人も多かったのではないでしょうか。
私自身も、今ひとつ使いどころが分かっていなかった MySQL Shell について、 mysqlコマンドラインクライアントの機能 + こまごまとしたツール集
という認識で一旦、納得して理解することができました。普通に使えばいいんだ。普通に。
そんなわけで、みなさんがおそらく「すごく色々できて便利な MySQL Shell」を推していく中で、私はこれからしばらく「mysqlコマンドラインクライアントの代わりとして普通に使う MySQL Shell」として推していく発信をしていこうかなと思います。普通に使っていたら、実は他にも便利な機能がいろいろあるんじゃん、と少しづつ気づいて行けば良いのではないかと思います。
MyShell for VS Code については、まだ開発初期の段階のため、不足している部分もある(機能のボタンはあるのに押せないとかw)けど、ゆくゆくは「MySQL Workbench の置き換え」を目指す方向性ということで、今から触り始めておくと、ひとつひとつの発展を一緒に楽しめそうですね。
VS Codeはほとんどの方が何らかの形で触れたことがあったのに対して、MySQL Shell は半数近くの人が「今回初めて知った」ということで、これから認知度を上げていくフェーズであることが分かりますね。私自身も「常用に至らず」だったので、しばらく「普通に使う」をキーワードとして常用を目指してみようかと思います。
イベントの模様は YouTube の 日本MySQL ユーザ会チャンネルにて公開しています。MySQL Shell と for VS Code に興味を持った方はぜひご覧ください。セミナー本編も然る事ながら、sli.do を使った質疑にも、MySQL Shell と for VS Code の「リアル」がたくさん含まれていて勉強になりますよ。