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 列名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 テーブル名
SELECTした結果に対して、先頭から[N]で指定した件数だけを取得します。「TOP N」はあくまで先頭から○件分という意味でしか無いので、列名の指定(画像では*)は必ず必要です。
また、先頭から○件というのは、3.のORDER BY で並び替えた結果に対してなので注意が必要です。
四則演算 ~ + – * / ~
SELECT文の中で、加算や減算などの四則演算が行えます。普通に「+」や「-」を書けばOKです。
文字列連結 ~ + ~
文字列を連結(繋ぎ合わせる)場合は、「+」を使用します。加算と同じですので、間違えないように気をつけましょう。
SELECT 文字列1 + 文字列2 FROM テーブル名
文字列連結で気をつけないといけないのは数字です。文字列連結の際に使用する「+」は、加算の意味も兼ねていますので、数値なのか数字なのかは明確に取り扱わないと痛い目に遭います。
基本的に数値か数字かは、SQL Server が自動的に判断します。シングルクォート「’」で囲まれている場合は文字列で、そうじゃない場合は数値型の値と判断されるのですが、混在している場合「’」で囲んでいても数値と見なされることもあります。
重複データ取り除き ~ 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万円未満の人だけを抽出するには次のように条件を指定します。
SELECT * FROM Table_Syain WHERE 給料 < 250000
次は、給料が25万円ではない人を抽出してみます。
SELECT * FROM Table_Syain WHERE 給料 <> 250000
複数の条件を組み合わせる場合
「性別が男で、かつ給料が25万円以上」や「性別が女、または給料が40万円以上」のように、条件を複数している場合は論理演算子を使います。
種類 | 意味 |
---|---|
a AND b | aかつbの場合 |
a OR b | aまたはbの場合 |
「性別が男で、かつ給料が25万円以上」は次のように条件を指定します。
SELECT * FROM Table_Syain WHERE 性別 = '男' AND 給料 >= 250000
「性別が女、または給料が40万円以上」は次のように条件を指定します。
SELECT * FROM Table_Syain WHERE 性別 = '女' OR 給料 >= 400000
「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」は「偽」になります。文章で説明すると難しいので図にしてみました。
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
もちろん、次のように書いても同じ結果です。
IN
ある列が、複数の値の中からどれか一つに該当するかどうか、という条件を指定する場合は、「IN」を使います。
例えば、社員番号が「00001」か「00002」か「00003」のどれかに該当するデータを抽出するには、次のように記述します。
SELECT * FROM Table_Syain WHERE 社員番号 IN ('00001', '00002', '00003')
これは次のように書いても同じ結果になりますが、「IN」を使った方が簡単なことが分かります。
SELECT * FROM Table_Syain WHERE 社員番号 = '00001' OR 社員番号 = '00002' OR 社員番号 = '00003'
IS NULL
NULLを含むデータがある場合、NULLを検索条件で指定する場合は「IS NULL」を使用します。「= NULL」ではないので注意が必要です。また、NULLとブランクは全く違うのでその点も注意が必要です。
上のようなテーブルがある場合、Address列を条件指定して、一行目を抽出するには次のように記述します。
SELECT * FROM Table_NULL WHERE Address = ''
では、AddressがNULLのデータを抽出してみましょう。まずは「= NULL」を指定した場合
SELECT * FROM Table_NULL WHERE Address = NULL
「Address IS NULL」とした場合、NULLのデータだけが抽出されていることが分かります。ブランクのデータは抽出されていません。
SELECT * FROM Table_NULL WHERE Address IS NULL
「NULLではないデータ」を抽出するには、「Address IS NOT NULL」とします。
SELECT * FROM Table_NULL WHERE Address IS NOT NULL
LIKE
文字列であいまい検索する場合は、「LIKE」を使います。ワイルドカード検索なんて言い方もしますが、「%」は0文字以上の任意の文字列を表し、「_」は任意の1文字を表すことができます。これを組み合わせることで、「長谷川から始まる」などの前方一致検索や、「一夫で終わる」などの後方一致検索も可能です。
社員テーブルで「山田で始まる」社員を検索するには次のように記述します。
SELECT * FROM Table_Syain WHERE 社員名
完全なあいまい検索をする場合は、検索対象の文字を「%」で囲みます。例えば「%山田%」とすると、山田の前には何かしらの文字があっても無くてもいいし、山田の後ろにも何かしらの文字があっても無くてもいい、ということになり、文字列中のどこかに「山田」という文字が出現すrばOKということになります。
SELECT * FROM Table_Syain WHERE 名前 LIKE '%山田%'
SQL文を専門学校で学び、10年経った今の今までAccessを使用することのない仕事をしていきまして、かなりのブランクがありました。
それから転職することになり、Accessをちょっぴりするよという会社に勤めまして、Accessの復習をしたいなーと思い、探しましてコチラのページを見つけました。
大変わかりやすく、この1ページでかなりためになる復習ができました。ありがとうございます。