SELECT文は最も基本的で簡単なSQL文ですが、その機能は多く、使いこなすと様々な用途に活用することができます。今回はMySQLの場合を例にとり、SELECT文を使いこなす方法についてご紹介したいと思います。
目次
2.1 最も単純なSELECT文
2.2 WHERE句で条件を指定する
2.3 ORDER BYでソート順を指定する
3.1 結合とは
3.2 内部結合や外部結合を使って条件を指定する
5.1 GROUP BY句でデータを集計する
5.2 CASE句で条件付き分岐を指定する
5.3 GROUP_CONCATで結果を1行に結合して表示する
1.SELECT文とは?
1.1 SELECT文とは
SELECT文とは、データベースからデータを取り出す(検索する)時に使用するSQL文であり、最も使用頻度の高いと思われるSQL文です。
項目を取り出して直接表示するだけでなく、数を数えたり、データを集計したり、さらにコピーなどを行う際の条件指定代わりにも使用されたりしています。
2.SELECT文の基本文法
2.1 最も単純なSELECT文
ある「データベースA」からある一つの「カラムA」の情報を取得するSELECT文の最も基本的な書式は、次のようになります。
SELECT [カラムA] FROM [データベースA];
カラムはカンマ区切りで複数指定することも可能です。
SELECT [カラムA], [カラムB], [カラムC]... FROM [データベースA];
全てのカラムを対象とする場合は、「*」を使用します。
SELECT * FROM [データベースA];
2.2 WHERE句で条件を指定する
前項では出力対象となる「カラム(列)」を指定しましたが、出力対象となる「テーブル(行)」の条件を指定することもできます。
条件の指定には、「Where句」を使用します。
SELECT [カラム] FROM [データベースA] Where [カラムA] [比較演算子] [条件値];
比較の対象となる[カラムA]が文字列である場合、比較演算子には「=(イコール)」もしくは「<>(ノットイコール)」などを使用することができます。
なお比較対象が文字列の場合、条件値は「''」で囲んで表します。
比較の対象となる[カラムA]が数値である場合、比較演算子には「=(イコール)」や「<>(ノットイコール)」以外に、「>(大なり)」「<(小なり)」や「>=(大なりイコール)」「<=(小なりイコール)」などの不等号も使用することが可能です。
条件は「AND(&&)」や「OR(||)」を使って、複合条件にすることも可能です。
さらにデータベースには、文字列でも数値でもない値として「NULL」が存在します。項目がNULLであるか否かをチェックするためには、「IS NULL(NULLである)」もしくは「IS NOT NULL(NULLでない)」を条件として使用することができます。
2.3 ORDER BYでソート順を指定する
検索結果のレコードが複数行にわたっていた場合、「ORDER BY」で表示する順序を指定する(ソートをかける)ことができます。
SELECT * FROM [データベースA] Where [条件] ORDER BY [カラムA] [ASC|DESC];
ソートのキーとするカラムを指定し、ASC(昇順)またはDESC(降順)を指定します。指定を省略した場合は、自動的に昇順で出力されます。
さらにソートのキーとするカラムは、複数指定することが可能です。
SELECT * FROM [データベースA] Where [条件]
ORDER BY [カラムA] [ASC|DESC], [カラムB] [ASC|DESC],...;
この場合、まず一番左の「カラムA」を基準にソートを行い、次にカラムAが同値だったものの中で「カラムB」を基準にソートを行います。さらに「カラムB」でも同値なものがあれば「カラムC」を…という感じで、順番にソートをかけていきます。
昇順または降順の区分については、それぞれのカラム毎に指定することができます。
3.内部結合と外部結合
3.1 結合とは
結合とは、複数のテーブル(表)を共通の値を持つカラム(列)をキーに連結して、一つの表のように出力することを示します。
3.2 内部結合や外部結合を使って条件を指定する
内部結合、および外部結結合の指定方法など詳しくは、次の記事をご参照下さい。
4.SELECT結果のレコード件数を返す
4.1 COUNT関数を使う
COUNT関数をSELECT文と組み合わせて使用することによって、発行したSELECT文の結果の行数を調査することができます。つまりWhere句に指定した条件を満たすレコードが、何行あるかの調査に使うことができます。
SELECT COUNT(*) FROM [データベースA] Where [条件];
上図のように、結果として件数が表示されました。
5.SELECT文に複雑な条件を指定する
5.1 GROUP BY句でデータを集計する
SQLでデータの集計を行いたい場合も、SELECT文を用います。「カラムA」の値が同じ項目ごとに「カラムB」の値を集計したい場合、次のようにSELECT文に「GROUP BY句」を組み合わせることで実現することが可能です。
なお基準項目、集計項目共に複数指定することができます。また集計対象たる「カラムB」は、数値項目である必要があります。
SELECT [カラムA], SUM[カラムB] FROM [データベースA] GROUP BY [カラムA];
5.2 CASE句で条件付き分岐を指定する
SELECT文の中で条件付き分岐を行いたい場合、CASE句を使用します。
SELECT CASE WHEN [条件A] THEN [式A]
WHEN [条件B] THEN [式B]
ELSE [式C]
END FROM [テーブル名];
この場合、次のような流れで値を返却します。
・「条件A」がTRUEの場合、「式A」を返す。
・「条件A」がFALSE、「条件B」がTRUEの場合、「式B」を返す。
・「条件A」および「条件B」が共にFALSEの場合、「式C」を返す。
例では条件Aと条件Bの2つですが、この分岐はいくつでも(1つでも)OKです。
上図では、前項で登場したGROUP BY句と組み合わせて、金額が400以上のユーザに「GOLD」、100以上のユーザに「SILVER」、それ以外のユーザに「BRONZE」と表示させてみています。
5.3 GROUP_CONCATで結果を1行に結合して表示する
SQLでデータの集計を行いたい場合も、SELECT文を用います。
GROUP_CONCATを使用することで、SELECT結果を1行に連結して表示することが可能です。
SELECT GROUP_CONCAT([カラムA] SEPARATOR '[区切り文字]') FROM [テーブル名];
区切り文字には希望の文字が使用可能であり、不要な場合は空文字を指定することもできます。
GROUP_CONCATと通常のカラムを並列で出力することも可能ですが、そのとき通常指定のカラムが複数ある場合は最初の1つが出力対象になりますので、下図のようにWhere句と組み合わせるなどしてご利用下さい。
6.結果をCSVに出力する
6.1 SELECTの実行結果をCSVファイルに出力する
MySQLには、SELECT文を指定してその実行結果をCSVファイルに出力できる便利な機能があります。しっかりとした帳票を作るまでもない、ちょっとした記録などの用途にでも、ぜひご利用下さい。
CSV出力の詳しい方法については、次の過去記事をご参照下さい。
7.まとめ
SELECT文のいろいろな使い方について、いかがでしたでしょうか。SELECT文にCASEやGROUPを組み合わせることによって、複雑な結果を一発で取り出すことも可能です。SQLを扱っていると使用頻度は高いと思うので、ぜひ覚えてみて下さいね。
関連記事:
無料でも使える高機能データベース「MySQL」とは
関連記事:
MySQLのダウンロード&インストールと初期設定方法
関連記事:
MySQLのデータベースに接続する3つの方法と接続手順
関連記事:
便利な公式ツールMySQL Workbenchの使い方と日本語化方法
関連記事:
MySQLでユーザを作成し、権限を設定する方法
関連記事:
MySQLで新規にデータベースを作成・削除する方法
関連記事:
MySQLでテーブルを作成・削除・変更する方法
関連記事:
MySQLでインデックスの追加・削除を行う方法
関連記事:
MySQLで使える文字列結合方法