【初級編⑥】SQLのSELECT文の基本的な構文

SQLを学ぶ上で一番重要と言っても過言ではないのが「SELECT文」です。どのデータベースにもSELECT文は存在し、書き方もよく似ているので、基本的な書き方をマスターしていれば違うデータベースで開発をする際にもすぐに慣れてくるでしょう。

今回は、SELECT文の基本的な構文を丁寧に解説したいと思います。

SELECT文とは

おさらいになりますが、SELECT文とはデータベースのテーブルからデータを検索し、取得するSQLのことです。データの取得はGUI上の操作でも可能ですが、GUIの操作だと簡単なことしかできませんので、基本的にSELECT文を自分で書いて実行します。

はっきり言って、SQLの中ではSELECT文が最も重要であると言っても過言ではありません。その分、他のSQLと比べて同じ結果を得る為の方法が複数あり、書き方も色々と工夫ができ、書き方一つでパフォーマンスが何十倍、何百倍にも変わったりします。

複雑な問い合わせを、パフォーマンスが良いSELECT文を素早く書けるのが、開発者として力の差が現れるところです。

今回は、こちらで作成したテーブルを使用して説明します。

最も簡単なSELECT文

それでは最も簡単なSELECT文を書いて見ます。[Table_Syain]テーブルの全レコードを取得するSELECTです。

 SELECT * FROM Table_Syain 

<実行結果>

最も簡単なSELECT文

SELECT文の構文はこんな感じです。

 SELECT 列名1, 列名2, ・・・ FROM テーブル名 WHERE 条件 

まず、SELECTからFROMまでの間(ここを「SELECT句」と言います)に取得したい列名を書きます。複数ある場合はカンマで区切ります。そして、FROMからWHEREまでの間(ここを「FROM句」と言います)に対象のテーブル名を書きます。条件を指定する場合はWHEREの後ろ(ここを「WHERE句」と言います)に条件を書きます。(WHERE句は後述します)また、それぞれの単語の間は半角スペースを入れます。

最も簡単な方法では、列名のところに「*」を指定しましたが、「*」はワイルドカード(全て)になりますので、この一文字で「全ての列を取得する」ことを表しています。

列名に*を指定

また、列名の指定と「*」は自由に組み合わせることも可能です。

列名の指定に加えて*も指定した場合

さらに、列は取得したいものだけ記述すればよく、SELECT句に記述した順番通りに取得されます。

列を省略したり順番を変える

列名の指定

SELECT句に記述する列は、テーブルに存在する列である必要はありません。自分で勝手に列を作ることも可能です。

列を自分で作成する

表示される結果の見出しを自分で指定する(変更する)こともできます。その場合は、AS を使用します。

 SELECT 列名 AS 表示する列名 FROM テーブル名 

表示列名を指定

AS の後ろに書いた文字は、あくまでSELECTされた結果の表示列名(見出し)になります。[社員番号]の部分は、[Table_Syain]テーブルから取得する列を指定(社員番号)しています。

昇順/降順の並び替え ~ ORDER BY ~

SELECTした結果を並び替えるには「ORDER BY」句を使用します。ORDER BYの使い方は次のとおりです。

 SELECT 列名 FROM テーブル名 WHERE 条件 ORDER BY キー列1 [ASCまたはDESC] ,キー列2 [ASCまたはDESC] , ・・・ 

給料列で並び替え

WHERE句の後ろから、ORDER BY と続けて、並び替えに指定したいキーとなる列を指定し、続けて[ASC]か[DESC]と書きます。[ASC]の場合は昇順、[DESC]の場合は降順に並べ替えられます。2つ以上のキーで並べ替えたい場合は、カンマで区切って同じように指定します。また、[ASC][DESC]を省略した場合は自動的に[ASC]が指定されます。

性別の降順のあと年齢の昇順

これをエクセルでやった場合、このようになります。

エクセルで並び替え

上位N件の取得 ~ TOP ~

SELECTした結果の中から、上位N件を取得したい場合、「TOP」を使用します。直感で分かると思いますが、TOP 1 と指定すると先頭の1件だけ取得されます。

TOPを使用した構文は次のとおりです。

 SELECT TOP N * FROM テーブル名 

先頭N件だけを取得

SELECTした結果に対して、先頭から[N]で指定した件数だけを取得します。「TOP N」はあくまで先頭から○件分という意味でしか無いので、列名の指定(画像では*)は必ず必要です。

また、先頭から○件というのは、3.のORDER BY で並び替えた結果に対してなので注意が必要です。

並び替えた結果の先頭から取得

四則演算 ~ + – * / ~

SELECT文の中で、加算や減算などの四則演算が行えます。普通に「+」や「-」を書けばOKです。

四則演算が可能

文字列連結 ~ + ~

文字列を連結(繋ぎ合わせる)場合は、「+」を使用します。加算と同じですので、間違えないように気をつけましょう。

 SELECT 文字列1 + 文字列2 FROM テーブル名 

文字列の連結

数字の文字列連結

文字列連結で気をつけないといけないのは数字です。文字列連結の際に使用する「+」は、加算の意味も兼ねていますので、数値なのか数字なのかは明確に取り扱わないと痛い目に遭います。

基本的に数値か数字かは、SQL Server が自動的に判断します。シングルクォート「’」で囲まれている場合は文字列で、そうじゃない場合は数値型の値と判断されるのですが、混在している場合「’」で囲んでいても数値と見なされることもあります。

数値と文字列の連結1

数値と文字列の連結1

重複データ取り除き ~ DISTINCT ~

テーブル内に重複するデータがある場合「DISTINCT」を使用すれば重複を取り除けます。

 SELECT DISTINCT * FROM テーブル名 

重複の取り除き






条件指定による絞り込み ~ WHERE ~

SELECTで取得するデータに条件を指定して絞り込む場合、WHERE句を使用します。WHERE句もSQLを使用する上で非常に重要です。

WHERE句は、書き方が非常に多いので一つずつ順番に説明していきます。

基本的な条件指定

最も基本的な条件の指定方法は、「ある値と一致するデータのみ抽出」するやり方です。WHERE句には「列 = 値」の形で記述します。

 SELECT * FROM テーブル名 WHERE 列 = 値 

条件の指定

比較演算子

「ある値と一致する」もそうですが、列の値を何かと比較して条件に合うデータのみ抽出する場合は、比較演算子を使います。使用できる演算子は次のとおりです。

<比較演算子の種類>
種類 意味
a = b aとbが等しい
a < b aはbより小さい
a > b aはbより大きい
a <= b aはb以下(b含む)
a >= b aはb以上(b含む)
a <> b aとbは等しくない

給料が25万円以上の人だけを抽出するには次のように条件を指定します。

 SELECT * FROM Table_Syain WHERE 給料 >= 250000 

給料が25万円以上の社員を抽出

逆に、給料が25万円未満の人だけを抽出するには次のように条件を指定します。

 SELECT * FROM Table_Syain WHERE 給料
< 250000 

給料が25万円未満の社員を抽出

次は、給料が25万円ではない人を抽出してみます。

 SELECT * FROM Table_Syain WHERE 給料
    <> 250000 

給料が25万円ではない社員を抽出

複数の条件を組み合わせる場合

「性別が男で、かつ給料が25万円以上」や「性別が女、または給料が40万円以上」のように、条件を複数している場合は論理演算子を使います。

論理演算子
種類 意味
a AND b aかつbの場合
a OR b aまたはbの場合

「性別が男で、かつ給料が25万円以上」は次のように条件を指定します。

 SELECT * FROM Table_Syain WHERE 性別 = '男' AND 給料 >= 250000 

性別が男で給料が25万円以上のデータを抽出

「性別が女、または給料が40万円以上」は次のように条件を指定します。

 SELECT * FROM Table_Syain WHERE 性別 = '女' OR 給料 >= 400000 

性別が女、または給料が40万円以上のデータを抽出

「a = b」と「a AND b」を混同しない

「a = b」と「a AND b」は似ているように見えますが、全く意味が違うのではっきりと違いを理解しましょう。

「a = b」は値を比較する条件式であり、aとbが等しいか、そうでないか、ということを表しています。aとbが等しいという条件に合致する場合、結果は「真である」と言います。反対に条件に合致しない場合、結果は「偽である」と言います。真偽を確かめるの真偽ですね。

これと比べて「a AND b」は、条件式aと条件式bがどちらも「真」の場合、「a AND b」は「真」になりますが、aとbのどちらかでも(両方でも)「偽」の場合、「a AND b」は「偽」になります。文章で説明すると難しいので図にしてみました。

「a = b」の場合

「a AND b」の場合

BETWEEN

数値や日付をFrom~Toで範囲指定する場合は「BETWEEN」を使用します。From~Toは、a以上b以下という意味になり、「WHERE 列 BETWEEN a AND b」と記述します。「WHERE 列 >= a AND 列
<=b 」と同じ結果になります。

年齢が25才以上35歳以下のデータを抽出するには次のように記述します。

 SELECT * FROM Table_Syain WHERE 年齢 BETWEEN 25 AND 35 

25才以上35才以下

もちろん、次のように書いても同じ結果です。

25才以上35才以下

IN

ある列が、複数の値の中からどれか一つに該当するかどうか、という条件を指定する場合は、「IN」を使います。

例えば、社員番号が「00001」か「00002」か「00003」のどれかに該当するデータを抽出するには、次のように記述します。

 SELECT * FROM Table_Syain WHERE 社員番号 IN ('00001', '00002', '00003') 

社員番号が「00001」か「00002」か「00003」のどれか

これは次のように書いても同じ結果になりますが、「IN」を使った方が簡単なことが分かります。

 SELECT * FROM Table_Syain WHERE 社員番号 = '00001' OR 社員番号 = '00002' OR 社員番号 = '00003' 

社員番号が「00001」か「00002」か「00003」のどれか

IS NULL

NULLを含むデータがある場合、NULLを検索条件で指定する場合は「IS NULL」を使用します。「= NULL」ではないので注意が必要です。また、NULLとブランクは全く違うのでその点も注意が必要です。

NULLを含むデータ

上のようなテーブルがある場合、Address列を条件指定して、一行目を抽出するには次のように記述します。

 SELECT * FROM Table_NULL WHERE Address = '' 

ブランクを抽出

では、AddressがNULLのデータを抽出してみましょう。まずは「= NULL」を指定した場合

 SELECT * FROM Table_NULL WHERE Address = NULL 

「Address = NULL」では一件も抽出されない

「Address IS NULL」とした場合、NULLのデータだけが抽出されていることが分かります。ブランクのデータは抽出されていません。

 SELECT * FROM Table_NULL WHERE Address IS NULL 

「Address IS NULL」だと抽出される

「NULLではないデータ」を抽出するには、「Address IS NOT NULL」とします。

 SELECT * FROM Table_NULL WHERE Address IS NOT NULL 

「Address IS NOT NULL」

LIKE

文字列であいまい検索する場合は、「LIKE」を使います。ワイルドカード検索なんて言い方もしますが、「%」は0文字以上の任意の文字列を表し、「_」は任意の1文字を表すことができます。これを組み合わせることで、「長谷川から始まる」などの前方一致検索や、「一夫で終わる」などの後方一致検索も可能です。

社員テーブルで「山田で始まる」社員を検索するには次のように記述します。

 SELECT * FROM Table_Syain WHERE 社員名 

名前が山田から始まるデータを抽出

完全なあいまい検索をする場合は、検索対象の文字を「%」で囲みます。例えば「%山田%」とすると、山田の前には何かしらの文字があっても無くてもいいし、山田の後ろにも何かしらの文字があっても無くてもいい、ということになり、文字列中のどこかに「山田」という文字が出現すrばOKということになります。

 SELECT * FROM Table_Syain WHERE 名前 LIKE '%山田%' 

名前に山田を含むデータを抽出

この記事と関連性の高い記事