まず初めに
みなさん、こんにちは。はねすけと申します。
今回の記事ではエンジニアらしく少し技術的なことについて書いていこうと思います。
テーマは「ちょっとひねったSQL文の書き方」です。
DB操作には欠かせないSQL文。
初心者の方から玄人の方まで、エンジニアであればきっと避けて通れない言語のはずです。
そんなSQL文について、かつて自分が驚いた記載方法を今回はご紹介したいと思います。
それでは早速行ってみましょう!
・SQLの書き方をもっと上達させたい方
・今よりもっと効率的なデータ分析を行いたい方
やりたいことの整理
まずは今回実現したいことを整理していきましょう。今回取り扱うテーブルデータは以下の通りです。
No(主キー) | Name |
---|---|
1 | Tama |
2 | Mike |
3 | Pochi |
4 | Taro |
5 | Shiro |
DataNo(主キー) | Date |
---|---|
1 | 2023/01/01 |
3 | 2023/05/01 |
4 | 2022/03/01 |
具体的なイメージをしやすいよう、簡単ではありますが2つのテーブルデータを用意しました。
同一のデータを意味するキー項目として、テーブルAの「No」・テーブルBの「DataNo」があります。あとはそれぞれ「Name」と「Date」という項目を持つだけのテーブル構成です。(どんなデータなのやら)
今回はこのデータを使用して「テーブルAとBの両方に存在する項目の場合、テーブルAのNameを更新する」といったことをやっていこうと思います。皆さんならどういう風に実行するでしょうか。これから一緒に考えていきましょう。
まずは堅実に順をおって実行
考え方の整理
さてどのように考えていけばよいでしょうか。まず登場しそうな要素について順をおってを考えていきましょう。
ひとまず、「テーブルAのNameを更新する」との記載があるのでUPDATE文は使いそうですね。
基礎の振り返りになりますが、UPDATEのSQL文は以下のようになります。
UPDATE テーブルA
SET Name= 'UpdateName'
次に「テーブルAとBの両方に存在する項目の」とあるので、該当の要素を抜き出す必要もありそうです。
これはSELECT文+INNER JOINで行けそうです。
INNER JOINを使用すれば、双方に共通して存在する要素だけを抽出することができますね。SELECT文に付随して使用することでそのまま条件のようにして双方に共通するものだけを表示できます。
SELECT *
FROM テーブルA
INNER JOIN テーブルB ON テーブルA.No = テーブルB.DataNo
だんだん整理できてきましたね。あとは抜き出した要素をなんやかんや一時テーブルに入れるなりして更新すればできそう、そんなことをかつて私も考えていました。
確かに上記のような複数のSQL文でも目的のデータ更新は可能です。次の章で実際にどうなるか実行してみます。
実際に実行
実際に実行するにあたり、SQL ServerをGUIベースで簡単に操作するためにSQL Server Management Studio(SSMS)というソフトウェアを使用していきます。
SQL Serverを使用している方であれば基本的に使用したことがあると思いますが、まだ使ってみたことがない方はぜひダウンロード・インストールして試してみることをお勧めします。
非常に使いやすく簡単にデータベース操作ができるため、面白い体験ができることでしょう。
以下の記事において、簡単ではありますがSSMSのダウンロード・インストールについて触れていますので参考にしてください。
【python】DjangoでSQLServerへ接続する手順を図解で初心者にもわかりやすく解説【ライブラリ】上記のように、想定通り目的のデータを更新することができました。
しかし実はこの処理、もっと簡単に単純な1つのSQL文で実現できてしまうのです。
まとめてシンプルに表現
それ、まとめてできちゃいます。
いきなり結論にはなりますが、最終的なSQL文を書くと以下のようになります。
UPDATE arias1
SET Name = 'UpdateName'
FROM テーブルA as arias1
INNER JOIN テーブルB ON arias1.No = テーブルB.DataNo
ここでの1番のポイントは、UPDATE文+SELECT文といった書き方ができることです。
更新するテーブル1とSELECTしたテーブル1の内容が何で勝手に紐づくんだ?といったことをかつての私は考えていたのですが、要はDB側で同じテーブル名のものをうまいこと判断して使ってくれるからなんですね。
それをわかりやすくするために、ここでは「UPDATE エイリアス1」のような書き方をしています。
実際に実行してみる
こちらについても以下のように実際にSSMS上で実行してみます。
実行内容については上記に掲載しているUPDATE文+SELECT文そのままですね。
無事にエラー無く実行されました。
順をおって実行したときと同様の結果が得られることが確認できますね。
まとめて記載することの意義
前章までで、①対象行のSELECT⇒②UPDATE文で更新という2段階の作業を①UPDATE文+SELECT文でまとめてかけることを確認してきました。
どちらでやっても同じ結果を得られるのなら、別にどっちでも良いのでは?と思う方もいるかもしれませんね。
この章ではまとめることでどのようなメリットがあるか、その意義について記載していきたいと思います。
結論からお伝えしますと、意義は大きく以下の2つが挙げられます。以下の章でそれぞれ詳しく見ていきましょう。
- 開発効率の向上
- 可読性の向上
開発効率の向上
まずは「開発効率の向上」についてです。これについては比較的イメージしやすいかもしれませんね。
実務においては1つや2つではなく処理のために大量のSQL文を書くことになります。そのたびに必要なSQL文をまとめてスッキリとかけるとどうでしょうか。長い目で見るとちりも積もって非常に大きな時間効率の向上になるはずです。
可能な限り色んな効率の良い書き方を知っておくことができれば、それだけ必要な労力・時間も短縮することができます。
可読性の向上
次に「可読性の向上」についてです。
実務では非常に長いSQL文を扱うことになるのは先ほど述べたとおりです。膨大な処理が記載されているSQL文を読み解くというのは非常に大変な作業です。
誰が読んでもわかりやすく、理解に時間を掛けなくて済むようなまとまりある構成にしておくというのは、チームでの開発においては非常に重要な事柄です。
応用編
最後に応用編として、そのほかの便利なSQL文の書き方にも触れたいと思います。
わかりやすいところでいうと、今回の内容と同じような書き方でDELETE文+SELECT文などもできちゃいます。
2つのテーブルに共通して存在する項目の行を削除する際に使用することができる書き方です。
書き方としてはほとんどUPDATE文+SELECT文と同じなのですが、以下のような感じになります。
DELETE FROM arias1
FROM テーブルA as arias1
INNER JOIN テーブルB ON arias1.No = テーブルB.DataNo
初めのころにはDELETE文+WHERE句のような基本的な書き方しか習わないと思いますが、このように便利な書き方もできることを知っておくと、開発効率や思考の幅が広がります。
皆さんもたくさんSQL文を書いて、いろんな発見をしてみてくださいね。
まとめ
いかがだったでしょうか?
本日お伝えしたかった内容を簡単にまとめると以下のようになります。
ぜひ何らかの形でお役に立てれば幸いです。
それでは次の記事でまたお会いしましょう♪
UPDATE文+SELECT文といった書き方を活用して、すっきりとした書き方ができちゃいます!
SQL文の効率的な書き方は無数にあるので、たくさん習得して開発効率を向上させましょう