MySQL UNIONで、select文ごとにorder byでソート指定するサンプルSQL
  • facebookページ
  • twitterページ
  • 2020.01.22

    MySQL UNIONで、select文ごとにorder byでソート指定するサンプルSQL

    MySQLのunionの使い方について、サンプルSQLを使ってまとめました。

    以下、データベースとして、MySQLのサンプルデータベースEmployeesを使っています。

    サンプルデータベースのインストール方法は、下記を参考にしてください。

    【関連記事】
    MySQLの入門には、GUIツールで慣れ、サンプルDBを使った学習が効果的

    MySQLのUNIONの構文

    参考)MySQL :: MySQL 5.6 リファレンスマニュアル :: 13.2.9.4 UNION 構文

    複数のselect文の結果を1つの結果に統合するためのステートメントです。2つめ以降の結果は、1つめの結果と同じデータ型にする必要があります。データ型さえ合っていれば、異なるテーブルのselect結果でもunionが使用可能です。

    ファイル出力を行うinto outfileは、最後のselect文にのみ使用可能。

    SQL99(SQL3)に準拠したSQL標準のステートメントです。特にMySQL独自の拡張はないようです。

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

    上記SQLは、employeesテーブルから、emp_no<10005の行と、emp_noが10007~10010の行をselectして結合するSQLです。実行結果はこうなります。

    MySQLのunionサンプルSQLコード

    union allの前に、select文ごとにorder byを実行する方法

    複数のselect文ごとにorder byでソートをするには、それぞれのselect文を括弧で囲み、limitを合わせて指定する必要があります。

    上記のSQLは、employees(雇用者テーブル)のうち、emp_noが10010以下の10件をbirth_date(誕生日)でソートし、emp_noが1011~10020の10件をfirst_name(姓名の名)でソートして結合します。

    実行結果はこうなります。

    limitなしでorder byを指定した場合は、ソート条件は無視されます。また、UNION ALLではなくUNIONを使用した場合も強制的にソートされるため、注意しましょう。

    unionで結合したクエリをjoinする方法

    unionで結合したselect文を括弧で囲んでサブクエリにすることでjoin可能です。

    上記のSQLは、emp_noが10010より小さいemployeesのレコードと、emp_no=10100、first_name=’yamada’、last_name=’tarou’というデータをunionで結合し、dept_emp(部署・雇用者紐付けテーブル)と、departments(部署テーブル)をjoinしています。

    実行結果は以下のようになります。

    unionで仮想的な連番テーブルを生成する方法

    fromで指定しているemployeesは、テーブルの件数を擬似的なループのために利用しています。十分なデータ件数があるテーブルであれば何でも構いません。

    実行するとこうなります。

    ただし、件数の少ないdepartmentsテーブル(9件)をfromに指定するとこうなります。

    9回のループで、生成される連番は10までとなります。

    まとめ

    ポテパンダの一言メモ
    • UNIONは、select文の結果を結合できる
    • UNIONは、結果を自動的にソートする。ソートしたくない場合は、UNION ALLを使う。
    • UNION ALLでORDER BYを使う場合は、LIMITを指定する。指定しないと自動ソートされる。
    • UNIONしたクエリをJOINするには、括弧で囲んでサブクエリ化する。
    • UNIONで連番テーブルを生成する場合、fromで指定するテーブルには十分な件数のあるものを選ぶ。


    優良フリーランス案件多数掲載中!
    フリーランスエンジニアの案件をお探しなら
    ポテパンフリーランス

    この記事をシェア

    • Facebookシェア
    • Twitterシェア
    • Hatenaシェア
    • Lineシェア
    pickup









    ABOUT US

    ポテパンはエンジニアと企業の最適なマッチングを追求する企業です。

    READ MORE