Webサイト制作コースのお申し込みはこちら Webサイト制作コースのお申し込みはこちら

SQLでループ処理を使ったサンプルについてまとめています。

SQLループ処理のサンプル

SQLのループ制御は、SQL標準になっていません。しかし、主要データベースではLOOP、WHILE、FORを使ったループ制御に対応しています。

【関連記事】
SQLとはどういうもの? 独自拡張と標準SQLの大きな違いって、何?

SQLでLOOP文を使ったサンプル

MySQLでは、ストアドプロシジャ内でLOOPを使った制御が使用可能です。

LOOPは、単純な繰り返しをおこなう制御で、IF文の条件分岐でループを抜ける処理を行います。MySQLの場合はLEAVE文で指定したラベル名のループを抜け出します。

DELIMITER //
CREATE PROCEDURE curdemo()
BEGIN
  DECLARE done INT DEFAULT FALSE;
  DECLARE a CHAR(16);
  DECLARE b, c INT;
  DECLARE cur1 CURSOR FOR SELECT id,data FROM test.t1;
  DECLARE cur2 CURSOR FOR SELECT i FROM test.t2;
  DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = TRUE;
 
  OPEN cur1;
  OPEN cur2;
 
  read_loop: LOOP
    FETCH cur1 INTO a, b;
    FETCH cur2 INTO c;
    IF done THEN
      LEAVE read_loop;
    END IF;
    IF b < c THEN
      INSERT INTO test.t3 VALUES (a,b);
    ELSE
      INSERT INTO test.t3 VALUES (a,c);
    END IF;
  END LOOP;
 
  CLOSE cur1;
  CLOSE cur2;
END;
//
 
DELIMITER ;

【関連記事】
SQLのfetchは、select結果を1件づつ取り出す NOT FOUND判定はDB差あり 

postgreSQLでも同様に、LOOPによる繰り返しを、以下のようにIFの条件分岐で抜けます。EXITはLOOPを抜け出すほか、BEGIN ENDブロックを抜けるときにも使われます。

LOOP
    -- 何らかの演算
    IF count > 0 THEN
        EXIT;  -- ループを抜け出す
    END IF;
END LOOP;

関連)postgreSQL:制御構造

SQLでFORを使ったサンプル

FORは、指定した回数を繰り返しおこなうための制御文です。

以下は、OracleのPL/SQL内でFORを使ったサンプルです。よくあるスクリプト言語のように、繰り返し回数を指定でき、現在の繰り返し回数を変数として扱うことが可能です。

BEGIN
  DBMS_OUTPUT.PUT_LINE ('lower_bound < upper_bound');
 
  FOR i IN 1..3 LOOP
    DBMS_OUTPUT.PUT_LINE (i);
  END LOOP;
 
  DBMS_OUTPUT.PUT_LINE ('lower_bound = upper_bound');
 
  FOR i IN 2..2 LOOP
    DBMS_OUTPUT.PUT_LINE (i);
  END LOOP;
 
  DBMS_OUTPUT.PUT_LINE ('lower_bound > upper_bound');
 
  FOR i IN 3..1 LOOP
    DBMS_OUTPUT.PUT_LINE (i);
  END LOOP;
END;
/
結果:

lower_bound < upper_bound
1
2
3
lower_bound = upper_bound
2
lower_bound > upper_bound

Oracle公式:PL/SQLの制御文

SQLでWHILEを使ったサンプル

WHILEは指定した変数(以下のサンプルではdone)が真(TRUE)の間だけループ内の処理を実行します。

以下は、OracleのPL/SQLでWHILEを使ったサンプルです。

最初のWHILE done LOOPは、変数doneがFALSEのため実行されません。

DECLARE
  done  BOOLEAN := FALSE;
BEGIN
  WHILE done LOOP
    DBMS_OUTPUT.PUT_LINE ('This line does not print.');
    done := TRUE;  -- This assignment is not made.
  END LOOP;

  WHILE NOT done LOOP
    DBMS_OUTPUT.PUT_LINE ('Hello, world!');
    done := TRUE;
  END LOOP;
END;
/
結果:

Hello, world!

参考)Oracle公式:PL/SQLの制御文

以下は、SQL ServerでWHILEを使うサンプルです。WHILE条件が真の間ループするのは変わらないのですが、条件部分にselectを記述することができます。

USE AdventureWorks2012;  
GO  
WHILE (SELECT AVG(ListPrice) FROM Production.Product) < $300  
BEGIN  
   UPDATE Production.Product  
      SET ListPrice = ListPrice * 2  
   SELECT MAX(ListPrice) FROM Production.Product  
   IF (SELECT MAX(ListPrice) FROM Production.Product) > $500  
      BREAK  
   ELSE  
      CONTINUE  
END  
PRINT 'Too much for the market to bear';  

関連)WHILE (Transact-SQL) – SQL Server | Microsoft Docs

postgreSQLもWHILEに対応しています。WHILEの条件文が真の場合はLOOPを行います。条件文はANDやORで接続して複数の条件を記述することが可能です。

WHILE amount_owed > 0 AND gift_certificate_balance > 0 LOOP
    -- ここで演算をいくつか行います。
END LOOP;

WHILE NOT boolean_expression LOOP
    -- ここで演算をいくつか行います。
END LOOP;

関連)postgreSQL公式:制御構造

まとめ

ポテパンダの一言メモ
  • SQLのループ制御はSQL標準ではないが、主要データベースでは対応している
  • LOOP、WHILE、FORなどのループ制御に対応
  • 標準化されていないため、記述方法はデータベースごとにばらつきがある

エンジニアになりたい人に選ばれるプログラミングスクール「ポテパンキャンプ 」

ポテパンキャンプは卒業生の多くがWebエンジニアとして活躍している実践型プログラミングスクールです。 1000名以上が受講しており、その多くが上場企業、ベンチャー企業のWebエンジニアとして活躍しています。

基礎的な学習だけで満足せず、実際にプログラミングを覚えて実践で使えるレベルまで学習したいという方に人気です。 プログラミングを学習し実践で使うには様々な要素が必要です。

それがマルっと詰まっているポテパンキャンプでプログラミングを学習してみませんか?

卒業生の多くがWebエンジニアとして活躍

卒業生の多くがWeb企業で活躍しております。
実践的なカリキュラムをこなしているからこそ現場でも戦力となっております。
活躍する卒業生のインタビューもございますので是非御覧ください。

経験豊富なエンジニア陣が直接指導

実践的なカリキュラムと経験豊富なエンジニアが直接指導にあたります。
有名企業のエンジニアも多数在籍し品質高いWebアプリケーションを作れるようサポートします。

満足度高くコスパの高いプログラミングスクール「ポテパンキャンプ」

運営する株式会社ポテパンは10,000人以上のエンジニアのキャリアサポートを行ってきております。
そのノウハウを活かして実践的なカリキュラムを随時アップデートしております。

代表の宮崎もプログラミングを覚えサイトを作りポテパンを創業しました。
本気でプログラミングを身につけたいという方にコスパ良く受講していただきたいと思っておりますので、気になる方はぜひスクール詳細をのぞいてくださいませ。