プログラミングマガジン

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

  • ホーム
  • SQL
  • 【SQL】読みやすいSQLを作るための手法(WITH句)
 
 
     
  • サーバー言語  
    • Python
    • Ruby
    • PHP
    • SQL
  •  
  • インフラ  
       
    • AWS
    •  
    • 基本
    • Git
  • Web
       
    • Web開発
    • JavaScript
    • Vue.js
    • React
  •  
  • 設計  
       
    • 実装設計
    • DB設計
  • 問い合わせ
  

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

08.15

  • miyabisan2
  • コメントを書く

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

基本指針

「複雑なSQL」から逃げないこと

複雑なSQLは避けたがる現場もあるかもしれません。しかし、複雑なSQLを使わないとループからのDB呼び出しの多重ループが発生するため、アプリの性能が遅くなってしまいます。複雑なSQLから逃げないようにしましょう。

読みやすくするには?

ただ、読みづらくなるのは問題です。その場合はサブクエリをWITH句を使うようにしましょう。WITH句を使うことで「クエリ内に新たなテーブル」を作ることができます。(サブクエリに名前をつけることができる機能です。)

また、一度定義すれば何度も使い回すことができます。

MySQLでは?

Web業界などではMySQLを使うことが多いでしょう。ただ、MySQLは8.0以降しかWITH句に対応していないので厳しいです。(RDSのAuroraが5.7にしか対応してないので現状は8.0はあまり使われていない。)

どうしても、5.7以下の場合でもコードの可読性を上げたい場合はVIEWなどを使うのも選択肢の一つです。

WITH句の基本構文

1
2
3
WITH ’新たに作成したテーブル名’as
 (作成したいテーブルを作るクエリ
);

例

1
2
3
4
5
-- WITH句を使ったテーブル定義
WITH aaa as (select * from user where name = "太郎")
 
-- WITH句を使う。
select * from aaa:

RECURSIVEを用いたWITH句

この形をとります。連番のような結果出力にループ処理が必要なものを作る際に便利です。

1
2
3
4
5
6
7
WITH RECURSIVE hoge AS (
    FROM句にhogeを含まないSELECT文(非再帰項)
    UNION ALLまたはUNION
   FROM句にhogeを含むSELECT文(再帰項)
)
 
WITH句を使用したSELECT文

FROM句にhogeを含まないSELECT文

非再帰項と呼びます。

FROM句にhogeを含むSELECT文

再帰項、作業用のテーブルともいえます。

処理の流れ

1
2
3
1.「非再帰項」を計算し、結果を作業テーブルと呼ばれる一時的な表に格納する
2.1.の「再帰項」の計算結果を非再帰項のFROM句に代入してSQLの実行結果が空になるまで再度計算します。
3.2.で計算した結果を全てUNIONまたはUNION ALLで足し合わせます。

実際にやっていることとしては「再帰」というよりは「反復処理」と言えるかもしれません。

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

関連記事

  1. 2018 04.30

    【SQL】内部処理の仕組み(Oracle)

  2. 2018 06.21

    【SQL】「GROUP BY句」、「HAVING句」について

  3. 2018 05.21

    【PL/SQL】繰り返し制御

  4. 2018 05.03

    【SQL】実行計画を調べるEXPLAIN PLANコマンドの使い方(Oracle、MySQL)

  5. 2018 04.30

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

  6. 2018 05.20

    【PL/SQL】「変数」や「固定値」の使い方

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

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

返信をキャンセルする。

【DBスペシャリスト】「トリガ」について

【DBスペシャリスト】データベースのクラスタ構成、「テ…

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 ©  プログラミングマガジン | プライバシーポリシー