プログラミングマガジン

プログラミングを中心にIT技術をできるだけわかりやすくまとめます。

  • ホーム
  • SQL
  • 【SQL】「ON句」の意外と知らない活用法
 
 
     
  • サーバー言語  
    • Python
    • Ruby
    • PHP
    • SQL
  •  
  • インフラ  
       
    • AWS
    •  
    • 基本
    • Git
  • Web
       
    • Web開発
    • JavaScript
    • Vue.js
    • React
  •  
  • 設計  
       
    • 実装設計
    • DB設計
  • 問い合わせ
  

【SQL】「ON句」の意外と知らない活用法

10.24

  • miyabisan2
  • コメントを書く

この記事は1分で読めます

手軽に使えるのですがエンジニアの間でも意外と知られていないSQLの活用法をご紹介します。

通常のJOINのON句の使い方

JOINのON句は以下のように結合条件のために普通は使うと思います。

1
2
3
4
select *
  from A
  LEFT JOIN B
  ON A.カラム1 = B.カラム1

それで結合後に条件を絞りたい場合は、以下のようにするでしょう。

1
2
3
4
5
select *
  from A
  LEFT JOIN B
  ON A.カラム1 = B.カラム1
WHERE B.カラム2 = "XXX"

「結合条件」と「抽出条件」を区別すること

ただ、これはON句で同じことを書けます。

1
2
3
4
5
select *
  from A
  LEFT JOIN B
  ON A.カラム1 = B.カラム1
  AND B.カラム2 = "XXX"

ON句の仕様として片方のテーブルにしか関係ない条件を指定した場合は片方のテーブルの抽出条件になります。

この記述だとAテーブルを必要としないので先にBテーブルの件数を減らす挙動になります。その後、「ON A.カラム1 = B.カラム1」というテーブルAとテーブルBどちらにも関係する結合条件が動作するため処理がテーブルBの対象件数が減るためパフォーマンスが向上します。(SQLのオプティマイザの仕様としては、ON句の後にwhere句が動く仕様になっているため。)

on句ではなくwhere句に抽出条件を書いてしまう書き方だとテーブル同士を結合した後に、where句で絞る動作になるので仮にテーブルBが大きいテーブルだった場合はかなり結合処理が重くなってしまいます。

抽出条件に使うのであれば、できるだけWHERE句ではなくON句を活用するのが良いSQL設計になります。

「ON句には結合条件を書いて、where句で結合結果を抽出する。」みたいな文法の意味だけ考えているとなかなかこの事実には辿り着かないので現場のエンジニアの人でも意外と知らない人が多いある種裏技と言えるかもしれません 笑

また、近年はRailsなどのフレームワークなどをORマッパーを使った開発が一般的になってきておりもしかしたらフレームワークによってはデフォルトでは使えないかもしれませんが、もし劇的にパフォーマンスが改善されるようであればその部分だけ部分的にwhere条件をON句に移動させるようにしても良いかもしれませんね。

スポンサーリンク
  • 2021 10.24
  • miyabisan2
  • コメントを書く
  • SQL
  • Tweets Twitter
  • このエントリーをはてなブックマークに追加
  • LINEで送る

関連記事

  1. 2020 08.15

    【SQL】読みやすいSQLを作るための手法(WITH句)

  2. 2018 04.25

    【SQL】実行計画、実行計画変動リスクなど

  3. 2018 04.30

    【システム開発】チューニングの基礎知識

  4. 2018 05.05

    【SQL】パフォーマンスを考えるに当たり必要な「結合」の知識(Oracle)

  5. 2018 06.22

    【SQL】「制約」の種類と使い方

  6. 2021 11.07

    【SQL】アンチパターン「UNIONを使った条件分岐」

  • コメント ( 0 )
  • トラックバック ( 0 )
  1. この記事へのコメントはありません。

  1. この記事へのトラックバックはありません。

返信をキャンセルする。

【データベース】「JSON型」について

【SQL】INとEXISTS、JOINの違い

RETURN TOP

著者プロフィール

エンジニア歴10年で過去に業務系、Webデザイン、インフラ系なども経験あります。現在はWeb系でフロントエンド開発中心です。

詳細なプロフィールはこちら

スポンサーリンク

カテゴリー

  • Android
  • AngularJS
  • API
  • AWS
  • C++
  • CSS
  • cursor
  • C言語
  • DDD
  • DevOps
  • Django
  • Docker
  • Figma
  • Git
  • GitLab
  • GraphQL
  • gRPC
  • Hasura
  • Java
  • JavaScript
  • Kubernetes
  • Laravel
  • linux
  • MySQL
  • Next.js
  • nginx
  • Node.js
  • NoSQL
  • Nuxt.js
  • Oracle
  • PHP
  • Python
  • React
  • Redux
  • Rspec
  • Ruby
  • Ruby on Rails
  • Sass
  • Spring Framework
  • SQL
  • TypeScript
  • Unity
  • Vue.js
  • Webサービス開発
  • Webデザイン
  • Web技術
  • インフラ
  • オブジェクト指向
  • システム開発
  • セキュリティ
  • その他
  • データベース
  • デザインパターン
  • テスト
  • ネットワーク
  • プログラミング全般
  • マイクロサービス
  • マイクロソフト系技術
  • マルチメディア
  • リファクタリング
  • 副業
  • 未分類
  • 業務知識
  • 生成AI
  • 設計
  • 関数型言語
RETURN TOP

Copyright ©  プログラミングマガジン | プライバシーポリシー