SELECT文とは?基本構文と役割をわかりやすく解説
SELECT文は、データベースからデータを取り出すための基本的なSQL文です。
例えば、「会員データベースから東京都在住の顧客を探したい」ときや「商品データベースから価格が1000円以下の商品を一覧表示したい」といった場面で使います。
この文が便利なのは、膨大なデータの中から必要な条件に合う情報だけを効率的に抽出できるという点です。
SELECT文を使ってできることを挙げます。
SELECT文でできること
- データベースに保存されている情報の検索と抽出
- 特定の条件に合致するデータの取得
- 必要な列(項目)を指定した表示
- 他のSQL文(INSERT、UPDATEなど)と組み合わせた高度な操作
前提として、SQL文とはデータベースを操作するための専用の言語のことです。
具体的には、SELECT、INSERT、UPDATE、DELETEなどの命令を使って、データの検索や追加、更新、削除といった処理を行います。
実際の開発では、ユーザー管理、商品管理、売上集計など、さまざまな場面でデータベースからの情報取得が必要になります。
このような場面で活躍するのがSELECT文です。
SELECT文の基本構文と各要素の意味
SELECT文の基本的な形は「SELECT 列名 FROM テーブル名」です。
SELECT句では取得したい列を指定し、FROM句では対象となるテーブルを指定します。
ちなみに、「SELECT 列名 FROM テーブル名 WHERE 条件」のようにWHERE句を追加することで、特定の条件に合致するデータのみを抽出できます。
以降の解説では、次の動物管理データベースを例として使用します。
animalsテーブル
id |
name |
species |
age |
weight |
---|---|---|---|---|
1 |
タロウ |
イヌ |
3 |
15.5 |
2 |
ミケ |
ネコ |
2 |
4.2 |
3 |
ポチ |
イヌ |
5 |
12.8 |
4 |
シロ |
ネコ |
1 |
3.8 |
5 |
ハチ |
イヌ |
7 |
18.2 |
例で使用するデータベースを作成したい方は、次のSQLスクリプトを参考にしてください。
最もシンプルな例として、全ての動物データを取得する場合を見てみましょう。
出力結果
id |
name |
species |
age |
weight |
---|---|---|---|---|
1 |
タロウ |
イヌ |
3 |
15.5 |
2 |
ミケ |
ネコ |
2 |
4.2 |
3 |
ポチ |
イヌ |
5 |
12.8 |
4 |
シロ |
ネコ |
1 |
3.8 |
5 |
ハチ |
イヌ |
7 |
18.2 |
※使用するDBMS(データベース管理システム)によって表示結果が異なる場合があります。以後のコードも同様です
SELECT *で全ての列を、FROM animalsでanimalsテーブルからデータを取得しています。
*(アスタリスク)は「すべての列」という意味です。
「SELECT 列名 FROM テーブル名」というSELECT文の基本的な形になっていることもわかりますね。
SELECT文で使える主な演算子(ANDやASなど)
SELECT文ではさまざまな演算子を使って、データを効率的に抽出できます。
例えば、「犬で、かつ5歳以上の動物を探したい」という場合にAND演算子を使ったり、「結果の列名を日本語で表示したい」という場合にAS演算子を使ったりします。
このような演算子を組み合わせることで、より精密で実用的な検索が実現できます。
出力結果
name |
age |
---|---|
ポチ |
5 |
ハチ |
7 |
name、ageの2つの列だけを取得しています。出力結果を見ると、AS句を使って列名を日本語に変更していることがわかりますね。
詳しくは後述しますが、AS句は列名に別名を付ける機能です。「name AS 動物名」のように書くことで、結果の表示をわかりやすくできます。
WHERE句で、次の2つの条件を指定しているのも確認できます。
- species = 'イヌ'で「イヌ」だけのデータ
- age >= 5で年齢が5歳以上
AND演算子は「両方の条件を満たす」という意味で、この例では「イヌかつ5歳以上」のデータが抽出されます。
OR演算子を使えば「イヌまたは5歳以上」といった検索も可能です。
COUNT関数の使い方と集計の基本
COUNT関数は、条件に合うデータの件数を数える機能です。
例えば、「イヌが何匹いるか知りたい」ときや「全体で何件のデータがあるか確認したい」ときに使います。
COUNT(*)は全てのレコード数を数え、COUNT(列名)は指定した列でNULLでない値を持つレコード数を数えます。
グループごとに分けて集計したい場合は、GROUP BY句と組み合わせて使うこともあわせて覚えておきましょう。
ちなみに、NULLとは「データが入っていない空の状態」のことです。
例えば、動物の体重を測定できなかった場合、その欄は「0」ではなく「NULL(空っぽ)」になります。
0は「体重が0kg」という意味ですが、NULLは「体重がわからない・未入力」ということを示しています。
出力結果
species |
頭数 |
---|---|
イヌ |
3 |
ネコ |
2 |
GROUP BY speciesで動物の種類ごとにグループ分けし、COUNT(*)で各グループの件数を数えています。
AS 頭数でCOUNT関数の結果に「頭数」という名前を付けているのも確認できるはずです。「イヌが3匹、ネコが2匹」という結果が一目でわかる形になっていますね。
INSERT・UPDATEなどと組み合わせて使う方法
SELECT文は、これまで学んだ「データを見る」だけでなく、他のSQL文と組み合わせることで、もっと便利な使い方ができます。
例えば、
- 既にあるデータをコピーして新しいテーブルに追加する(INSERT文と組み合わせ)
- 条件に合うデータをまとめて更新する(UPDATE文と組み合わせ)
- 不要なデータをまとめて削除する(DELETE文と組み合わせ)
手作業で一つずつ処理するのではなく、条件を指定して一気に処理することができるのです。
ここでは、実際にどんなことができるのか、具体例を見ながら学んでいきましょう。
INSERT INTOでデータを追加する方法
INSERT INTO文にSELECT文を組み合わせることで、既存のテーブルからデータを取得して別のテーブルに挿入できます。
例えば、「年齢が5歳以上の動物だけを別のテーブルにバックアップしたい」といった場合です。
SELECT文を使うことで、条件に合う複数のレコードを一度に処理できます。わざわざVALUES句で一つずつデータを指定する必要はありません。
この手法は、バックアップテーブルの作成時や、特定条件のデータを別テーブルに移行する際に便利です。
※事前にbackup_animalsテーブルを作成しておく必要があります。
出力結果
name |
species |
age |
weight |
---|---|---|---|
ポチ |
イヌ |
5 |
NULL |
ハチ |
イヌ |
7 |
NULL |
animalsテーブルから年齢が5歳以上の動物のデータを取得し、backup_animalsテーブルに挿入しています。
WHERE句でage >= 5の条件を指定することで、条件に合う2件のデータ(ポチ、ハチ)が一度にコピーされます。手動で一つずつ入力する必要がないため、大量のデータ処理も効率的です。
UPDATE文とSELECTの連携でデータを一括更新
UPDATE文とSELECT文を組み合わせることで、複雑な条件でもデータ更新を行うことができます。
例えば、「頭数が3匹以上いる動物の種類だけ、体重を10%増加させたい」といった場合です。
単純な条件だけでなく、他のテーブルの情報の参照や集計結果を基にした更新処理も行えます。
出力結果
id |
name |
species |
age |
weight |
---|---|---|---|---|
1 |
タロウ |
イヌ |
3 |
17.05 |
2 |
ミケ |
ネコ |
2 |
4.2 |
3 |
ポチ |
イヌ |
5 |
14.080000000000002 |
4 |
シロ |
ネコ |
1 |
3.8 |
5 |
ハチ |
イヌ |
7 |
20.02 |
SELECT文で「頭数が3匹以上いる動物の種類」を調べています。
サブクエリ(括弧内のSELECT文)でGROUP BY species HAVING COUNT(*) >= 3により、条件に合う種類(この場合は「イヌ」)を特定します。
その結果を使って、UPDATE文で該当する動物の体重を1.1倍(10%増)に更新しています。結果として、イヌの3匹すべて(タロウ、ポチ、ハチ)の体重が更新されました。
ちなみに、ポチの体重の表示がおかしくなっているように見えますが、これは正常な動作です。
小数点の計算では、コンピュータの計算方式により微小な誤差が生じることがあります。
実用上は問題ありませんが、気になる場合はROUND関数で桁数を調整できます。
「ROUND(数値, 桁数)」という形で使うことも、ここで押さえておきましょう。
ROUNDの使用例
SELECT INTOとCREATE TABLEの違いと使い方
SELECT INTOは、既存のテーブルからデータを取得して新しいテーブルを作成する機能です。
出力結果
name |
species |
---|---|
タロウ |
イヌ |
ミケ |
ネコ |
ハチ |
イヌ |
年齢が3歳以下の動物のデータから「young_animals」という新しいテーブルを作成しています。
WHERE句でage <= 3の条件を指定することで、該当する動物(タロウ、ミケ、シロ)のnameとspeciesの情報だけを含む新しいテーブルが自動的に作られます。元のテーブルはそのまま残り、コピーが作成される形になります。
ちなみに、CREATE TABLEは事前にテーブルの構造(どんな列があるか)を決めてから、INSERT文で後からデータを追加する方法です。
SELECT INTOの利点は、データとテーブル構造を一度に作成できることですが、元のテーブルの制約やインデックスなどの設定は引き継がれません。
目的に応じて使い分けることが大切です。
SELECT文を使ったデータ抽出の注意点
SELECT文を使う際は、処理速度やデータの正確性に影響する点を理解しておくことが大切です。
特に大量のデータを扱う場合、適切な書き方をしないと「処理が遅くなる」「意図しない結果が返される」といった問題が起こる可能性があります。
実際の開発現場でよく遭遇する問題と対策について見ていきましょう。
パフォーマンスを意識したSELECT文の書き方
SELECT文の処理速度を向上させるには、「必要な列だけを指定する」「WHERE句で早期にデータを絞り込む」ことが重要です。
SELECT *(全ての列を取得)は便利ですが、大きなテーブルでは処理速度が遅くなります。
また、LIMIT句で取得件数を制限することも効果的です。インデックスが設定された列を条件に使用すれば、さらに高速な検索が可能になります。
システム全体の応答速度を向上させるために、適切な書き方を心がけるようにしましょう。
出力結果
name |
age |
---|---|
タロウ |
3 |
ポチ |
5 |
ハチ |
7 |
次のような最適化を行っています。
- 必要な列(nameとage)だけを指定
- WHERE句でspecies = 'イヌ'に早期に絞り込み
- LIMIT句で取得件数を10件に制限
これにより、無駄なデータ取得を避け、処理速度とメモリ使用量の改善を図っています。
NULL値とCOUNTの扱いに注意
COUNT関数を使う際は、NULL値の扱い方に注意が必要です。
COUNT(*)は全レコード数を数えますが、COUNT(列名)はその列でNULLでない値を持つレコード数だけを数えます。この違いを理解せずに使うと、期待した結果が得られない場合があります。
正確な集計を行うためには、IS NULLやIS NOT NULLを使ってNULL値を明示的に処理することが大切です。
出力結果
全件数 |
体重データ件数 |
---|---|
5 |
5 |
SELECT文を使ったデータ取得のテクニック
SELECT文には基本的な使い方以外にも、データを効率的に取得するためのテクニックがたくさんあります。
例えば、「複数の条件を組み合わせて絞り込みたい」ときや「結果の列名をわかりやすく表示したい」といった場面で有用な方法があります。
このような手法を覚えることで、実際の開発でより使いやすいSQL文が書けるようになるので、ぜひマスターしましょう。
特定条件で絞り込むWHERE句とANDの使い方
WHERE句では、さまざまな演算子を組み合わせて細かい条件指定ができます。
AND演算子は「全ての条件を満たす」、OR演算子は「いずれかの条件に合致する」データを取得します。
IN演算子を使えば「複数の値のいずれかに合致する」データを効率的に検索でき、BETWEEN演算子なら「○○以上△△以下」といった範囲指定も簡単に行えます。
出力結果
name |
species |
age |
---|---|---|
タロウ |
イヌ |
3 |
ポチ |
イヌ |
5 |
ハチ |
イヌ |
7 |
この例では、WHERE句で2つの条件を組み合わせています。
- age >= 3で年齢が3歳以上
- weight BETWEEN 10.0 AND 20.0で体重が10.0kg以上20.0kg以下
AND演算子により、両方の条件を満たす動物(タロウ、ポチ、ハチ)が抽出されます。
ASを使って列名をわかりやすくする方法
AS句を使うと、取得する列に別名(エイリアス)を付けることができます。
例えば、「nameという列名を『動物名』というわかりやすい名前で表示したい」という場合に便利です。特に日本語の別名を付けることで結果が見やすくなり、複雑な計算結果にも意味のある名前を付けられます。
レポートを出力したり、画面に結果を表示したりする際に、ユーザーにとってわかりやすい表示を実現できます。
出力結果
動物名 |
種類 |
年齢 |
体重 |
---|---|---|---|
タロウ |
イヌ |
3 |
15.5 |
ポチ |
イヌ |
5 |
12.8 |
ハチ |
イヌ |
7 |
18.2 |
よくある質問(Q&A)
Q: 大量データを扱う際の注意点は?
A: LIMIT句を使用して取得件数を制限する、適切なインデックスを設定する、WHERE句で事前に条件を絞り込むなどの対策が必要です。また、本番環境では必ずテスト環境で動作確認を行い、実行計画を確認してから実行することが重要です。
Q: *(アスタリスク)を使うデメリットはありますか?
A: *を使うと全ての列が取得されるため、不要なデータも含まれ、処理速度が遅くなる可能性があります。また、テーブル構造が変更された際に予期しない結果になることがあります。本番環境では必要な列のみを指定することが推奨されます。
まとめ
SELECT文は、データベースからデータを取得する最も基本的で重要なSQL文です。
この記事では、SELECT文の基本的な構文から実用的な応用例まで解説しました。SELECT文の活用場面について確認しておきましょう。
SELECT文が活躍する場面
- データベースから必要な情報を検索・抽出したいとき
- 特定の条件に合うデータだけを取得したいとき
- データの件数や統計情報を集計したいとき
- 他のSQL文と組み合わせて高度なデータ操作を行いたいとき
SELECT文を使う上で押さえておきたいポイントは、次の通りです。
重要なポイント
- SELECT句、FROM句、WHERE句という基本構造
- AND演算子やAS句などを使って柔軟なデータ抽出ができること
- INSERT・UPDATE文と組み合わせて高度なデータ操作ができること
- パフォーマンスとNULL値の扱い
初めてSQLを学ぶ方も、この記事で紹介したSELECT文の基本的な使い方と実用例を参考に、実際にSQL文を書いてみてください。
データベースから適切に情報を取得できるようになれば、より実用的なシステムを構築することができるようになります。
これは実際の開発で非常に重要なスキルです。
ぜひSELECT文をマスターすることで、より効率的なデータベース操作ができるようになりましょう。