SELECT・WHERE・ORDER BY:必要な行と列を取り出す|マーケターのためのSQL入門 第2回
監修田中 磨生株式会社Abin 代表取締役
株式会社Abin代表取締役。AI SaaSの上場企業やHR系ベンチャーのマーケティング責任者を経て、2023年BtoBマーケティング特化のコンサルティング会社株式会社Abinを設立。創業から30社以上のBtoBマーケティングの戦略立案から実行までを行う。2025年には株式会社プロベルの役員に就任。NYマーケティング株式会社の執行役員も務める。
執筆Abin編集部
この回で分かること:①SELECTとFROMで、表から必要な列だけを取り出す書き方と、計算した列や別名の付け方、②WHEREで行を絞る条件の組み立て方(比較・AND・OR・IN・BETWEEN・LIKE・NULL)と、ANDとORを混ぜるときの落とし穴、③ORDER BYでの並べ替えと、LIMITで上位だけを出す方法。前回は、データベースが表・行・列・キーでできていること、SQLは「欲しい結果」を書く言語であることを学びました。今回から、実際にSQLを書いていきます。

この回の例はすべて、架空の通販「ツギノテ雑貨店」のサンプルデータ(顧客の表 customers と注文の表 orders)で実際に実行し、結果を確かめたものです。データは説明のために作った架空のものです。
SELECTとFROM:どの表の、どの列を出すか
SQLの文は、FROMで使う表を、SELECTで出す列を指定するのが基本です。表の列をすべて出したいときは、列の名前の代わりに「*(アスタリスク)」を書きます。
SELECT *
FROM customers;
これで、customers の全部の列・全部の行が出てきます。文の最後の「;(セミコロン)」は文の区切りを表します。1文だけ実行するときは省略できるツールも多いですが、付けておくと安全です。
必要な列だけを出したいときは、SELECTのあとに列の名前をカンマで区切って並べます。
SELECT customer_id, prefecture
FROM customers;
| customer_id | prefecture |
|---|---|
| C001 | 東京都 |
| C002 | 大阪府 |
| C003 | 東京都 |
| C004 | 愛知県 |
| C005 | 福岡県 |
| C006 | 東京都 |
| C007 | 大阪府 |
| C008 | 北海道 |
計算した列と、別名(AS)
SELECTには、列の名前だけでなく計算式も書けます。たとえば、ツギノテ雑貨店では注文金額の5%をポイントとして付けている(架空の設定)とします。顧客C001の注文ごとのポイントは、次のように計算できます。
SELECT order_id, amount, amount * 5 / 100 AS point
FROM orders
WHERE customer_id = 'C001'
ORDER BY order_date;
| order_id | amount | point |
|---|---|---|
| O101 | 3200 | 160 |
| O103 | 8600 | 430 |
| O108 | 1500 | 75 |
| O114 | 4500 | 225 |
ASは、結果の列に別名を付ける書き方です。付けないと、列の名前が「amount * 5 / 100」のような式のまま表示され、読みにくくなります。計算した列には、意味の分かる別名を付ける習慣をつけましょう。
なお、整数どうしの割り算は、データベースによって小数点以下が切り捨てられることがあります(たとえば SQLite で 7 / 2 は 3 になります)。小数の結果が欲しいときは、片方を 100.0 のように小数で書くと確実です。
よくある誤解:「とりあえず SELECT * で全部出せばいい」
表の中身を確かめるとき、SELECT * はとても便利です。ただ、分析のSQLをいつも SELECT * で書くのはおすすめしません。理由は2つあります。
1つ目は、必要な列が分かりにくくなることです。列が数十個ある表で SELECT * を使うと、結果の中から目的の列を探すのに苦労しますし、あとで読み返したときに「何を見たかったのか」が分かりません。
2つ目は、費用と時間がかかることです。BigQueryのように、読み込んだデータの量に応じて料金がかかるデータベースでは、使わない列まで読み込むと、その分だけ費用が増えます。この点は第6回で詳しく扱います。中身を確かめるときだけ SELECT * を使い、分析では必要な列だけを書く、と使い分けましょう。
WHERE:条件に合う行だけを取り出す
WHEREは、条件に合う行だけを残すための句です。たとえば、東京都の顧客だけを出すなら、次のように書きます。
SELECT *
FROM customers
WHERE prefecture = '東京都';
| customer_id | prefecture | signup_date | channel |
|---|---|---|---|
| C001 | 東京都 | 2026-04-03 | 検索広告 |
| C003 | 東京都 | 2026-04-18 | SNS |
| C006 | 東京都 | 2026-05-21 | 検索広告 |
文字の値は「’(シングルクォート)」で囲みます。数は囲まずにそのまま書きます。
比べる記号
WHEREでよく使う比べる記号は、次のとおりです。
| 記号 | 意味 | 例 |
|---|---|---|
| = | 等しい | prefecture = ‘東京都’ |
| <> または != | 等しくない | prefecture <> ‘東京都’ |
| > / >= | より大きい/以上 | amount >= 5000 |
| < / <= | より小さい/以下 | amount < 2000 |
金額が5,000円以上の注文を出すと、次のようになります。
SELECT order_id, customer_id, amount
FROM orders
WHERE amount >= 5000
ORDER BY amount DESC;
| order_id | customer_id | amount |
|---|---|---|
| O107 | C005 | 12800 |
| O111 | C007 | 9800 |
| O103 | C001 | 8600 |
| O113 | C006 | 7400 |
日付も、’2026-05-01′ のような「年-月-日」の形で書けば、>= や < で比べられます。たとえば WHERE signup_date >= ‘2026-05-01’ とすれば、5月1日以降に登録した顧客が取り出せます。
注文の表から、金額が2,000円未満の注文だけを取り出したいとき、WHEREの条件として正しいものはどれでしょう?
- WHERE amount = 2000
- WHERE amount >= 2000
- WHERE amount < 2000
答えと解説
正解は3です。「未満」は、その値を含まない「より小さい」なので < を使います。「以下」なら <= です。「以上」「以下」「未満」「より大きい」の違いは、数え間違いの原因になりやすいので注意しましょう。
AND・OR:条件を組み合わせる
条件を組み合わせるときは、AND(かつ)とOR(または)を使います。食器の注文のうち、金額が4,000円以上のものを出すなら、次のように書きます。
SELECT order_id, category, amount
FROM orders
WHERE category = '食器' AND amount >= 4000;
| order_id | category | amount |
|---|---|---|
| O105 | 食器 | 4100 |
| O114 | 食器 | 4500 |
よくある誤解:ANDとORは「書いた順に」処理される
ANDとORを1つの条件に混ぜるときは、特に注意が必要です。たとえば「食器か雑貨の注文のうち、金額が3,000円以上のもの」を出そうとして、次のように書いたとします。
SELECT order_id, category, amount
FROM orders
WHERE category = '食器' OR category = '雑貨' AND amount >= 3000;
結果は6件で、その中に金額2,900円の食器の注文(O106)が混ざります。SQLでは、ANDがORより先に結びつく決まりがあるため、この条件は「食器の注文すべて」または「雑貨で3,000円以上の注文」と解釈されるからです。掛け算が足し算より先に計算されるのと同じ関係だと考えると覚えやすいでしょう。
意図どおりにするには、ORの部分をかっこで囲みます。
SELECT order_id, category, amount
FROM orders
WHERE (category = '食器' OR category = '雑貨') AND amount >= 3000;
| order_id | category | amount |
|---|---|---|
| O101 | 食器 | 3200 |
| O105 | 食器 | 4100 |
| O109 | 食器 | 3600 |
| O112 | 雑貨 | 3100 |
| O114 | 食器 | 4500 |
結果は5件になり、2,900円の注文は入りません。ANDとORを混ぜるときは、かっこを付けると覚えておきましょう。

IN・BETWEEN・LIKE:よく使う便利な書き方
同じ列に「AまたはBまたはC」という条件を付けるときは、INを使うと短く書けます。先ほどのかっこ付きの条件は、IN を使って WHERE category IN (‘食器’, ‘雑貨’) AND amount >= 3000 と書いても、同じ5件になります。流入元が検索広告かSNSの顧客なら、次のとおりです。
SELECT customer_id, channel
FROM customers
WHERE channel IN ('検索広告', 'SNS');
| customer_id | channel |
|---|---|
| C001 | 検索広告 |
| C003 | SNS |
| C006 | 検索広告 |
| C007 | SNS |
範囲を指定するときはBETWEENが便利です。BETWEEN A AND B は「A以上B以下」で、両端の値を含みます。5月の注文を出してみましょう。
SELECT order_id, order_date, amount
FROM orders
WHERE order_date BETWEEN '2026-05-01' AND '2026-05-31'
ORDER BY order_date;
| order_id | order_date | amount |
|---|---|---|
| O104 | 2026-05-01 | 2400 |
| O105 | 2026-05-03 | 4100 |
| O106 | 2026-05-15 | 2900 |
| O107 | 2026-05-20 | 12800 |
| O108 | 2026-05-30 | 1500 |
ただし、日付に時刻まで入っている列(「2026-05-31 15:00」のような値)にBETWEENを使うと、5月31日の0時より後の記録が漏れることがあります。時刻を含む列では、order_date >= ‘2026-05-01’ AND order_date < ‘2026-06-01’ のように「次の月の初日より前」と書くほうが安全です。
文字の一部が一致するものを探すときはLIKEを使います。「%」は「任意の文字が0文字以上」を表します。流入元に「検索」という言葉を含む顧客を探すと、検索広告と自然検索の両方が取り出せます。
SELECT customer_id, channel
FROM customers
WHERE channel LIKE '%検索%';
| customer_id | channel |
|---|---|
| C001 | 検索広告 |
| C002 | 自然検索 |
| C004 | 自然検索 |
| C006 | 検索広告 |
| C008 | 自然検索 |
NULL:「値がない」ことの扱い
データベースでは、値が入っていない状態をNULL(ヌル)と呼びます。「0」や「空の文字」とは違い、「分からない・存在しない」ことを表す特別な状態です。
NULLを探すときは、= NULL ではなく IS NULL と書きます(NULLでないものは IS NOT NULL)。= NULL と書くと、比べた結果が「真」にならないため、1行も取り出せません。「値が入っていない顧客を探したのに0件だった」というときは、この書き方を疑ってください。NULLは、第4回で表をつなぐときにも登場します。
「食器か雑貨の注文のうち、金額が3,000円以上のもの」を正しく取り出せる条件はどれでしょう?
- WHERE (category = ‘食器’ OR category = ‘雑貨’) AND amount >= 3000
- WHERE category = ‘食器’ OR category = ‘雑貨’ AND amount >= 3000
- WHERE category = ‘食器’ AND category = ‘雑貨’ AND amount >= 3000
答えと解説
正解は1です。かっこがないと、ANDがORより先に結びつき、「食器すべて」または「雑貨で3,000円以上」と解釈されます。3つ目は「食器であり、かつ雑貨である」という、ありえない条件なので0件になります。
ORDER BYとLIMIT:並べ替えて、上から取り出す
ORDER BYは、結果を並べ替える句です。列名のあとに ASC(小さい順、省略可)か DESC(大きい順)を付けます。顧客C001の注文を、新しい順に並べてみましょう。
SELECT order_id, customer_id, order_date, amount
FROM orders
WHERE customer_id = 'C001'
ORDER BY order_date DESC;
| order_id | customer_id | order_date | amount |
|---|---|---|---|
| O114 | C001 | 2026-06-29 | 4500 |
| O108 | C001 | 2026-05-30 | 1500 |
| O103 | C001 | 2026-04-28 | 8600 |
| O101 | C001 | 2026-04-05 | 3200 |
LIMITを付けると、上から決まった件数だけを出せます。金額の大きい注文トップ3なら、次のとおりです。
SELECT order_id, amount
FROM orders
ORDER BY amount DESC
LIMIT 3;
| order_id | amount |
|---|---|
| O107 | 12800 |
| O111 | 9800 |
| O103 | 8600 |

よくある誤解:「ORDER BYを書かなくても、いつも同じ順に出てくる」
ORDER BYを書かないときの行の順番は、決まっていません。いつも同じ順に見えても、データが増えたり、データベースの内部の処理が変わったりすると、順番が変わることがあります。
特に注意したいのが、ORDER BYを付けずにLIMITだけを使う場合です。「LIMIT 10で最新の10件を見たつもり」が、実はたまたま出てきた10件だった、ということが起こります。順番に意味があるときは、必ずORDER BYを書きましょう。
なお、重複を取り除きたいときは、SELECTのあとに DISTINCT を付けます。SELECT DISTINCT category FROM orders とすると、注文に出てくるカテゴリーが「食器」「雑貨」「インテリア」の3つだけ表示されます。この結果の並び順も決まっていないので、順番をそろえたいときはORDER BYを付けます。
金額の大きい注文のトップ5を出したいとき、正しい書き方はどれでしょう?
- SELECT order_id, amount FROM orders LIMIT 5;
- SELECT order_id, amount FROM orders ORDER BY amount DESC LIMIT 5;
- SELECT order_id, amount FROM orders ORDER BY amount LIMIT 5;
答えと解説
正解は2です。1つ目はORDER BYがないので、どの5件が出るかは決まっていません。3つ目はASC(小さい順)になるので、金額の小さい5件が出てしまいます。
実務ではこう使う
SELECT・WHERE・ORDER BYだけでも、次のような確認がすぐにできるようになります。
- 特定の顧客の注文の履歴を、新しい順に確かめる(問い合わせ対応やクレームの確認)
- 高額の注文や、特定のキャンペーン期間の注文だけを抜き出して、中身を見る
- 特定の流入元から来た顧客の一覧を出して、MAツールや広告の配信リストと照合する
実際に書くときは、次の順で少しずつ組み立てると、間違いに気づきやすくなります。
- まず FROM と SELECT * と LIMIT 10 で、表の中身と値の形を確かめる
- 必要な列だけに SELECT を書き換える
- WHERE の条件を1つずつ足し、そのたびに件数が想定どおりかを確かめる
- 最後に ORDER BY と LIMIT で、見やすく整える

条件を一度に全部書くと、結果がおかしいときにどの条件が原因か分からなくなります。1つ足すごとに「件数が減りすぎていないか」「混ざってはいけない行が入っていないか」を見る習慣をつけましょう。
取り出した結果をグラフや表にして共有したい場合は、BIツールおすすめ比較も参考になります。
FOR BUSINESS
マーケティング・DXの発注先選びに迷ったら
ツギノテを運営する株式会社Abinは、BtoBマーケティングに特化したコンサルティング会社です。創業から30社以上のBtoBマーケティングを支援してきました。
相談無料ツギノテ編集部に相談する→この回のまとめ
- SELECTで出す列を、FROMで使う表を指定します。分析では SELECT * ではなく、必要な列だけを書きます。
- 計算した列にはASで別名を付けます。整数どうしの割り算は切り捨てになることがあるので注意します。
- WHEREで行を絞ります。比べる記号のほか、IN・BETWEEN(両端を含む)・LIKE(%で部分一致)・IS NULL を使い分けます。
- ANDはORより先に結びつくので、ANDとORを混ぜるときはかっこを付けます。
- ORDER BYを書かないと行の順番は決まりません。LIMITで上位を出すときは、必ずORDER BYと組み合わせます。
確認テスト
SELECTで計算した列(amount * 5 / 100 など)に分かりやすい名前を付けるために使う言葉はどれでしょう?
- WHERE
- AS
- LIMIT
答えと解説
正解は2です。ASで別名を付けると、結果の列の名前が「point」のように分かりやすくなります。WHEREは行を絞る句、LIMITは件数を絞る句です。
BETWEEN ‘2026-05-01’ AND ‘2026-05-31’ の説明として正しいものはどれでしょう?
- 5月1日と5月31日はどちらも含まない
- 5月1日は含むが、5月31日は含まない
- 5月1日と5月31日の両方を含む(ただし時刻を含む列では、31日の0時より後の記録が漏れることがある)
答えと解説
正解は3です。BETWEENは両端の値を含みます。ただし、時刻まで入っている列では「’2026-05-31’=31日の0時」と比べることになるため、>= と「翌月の初日より前(<)」で書くほうが安全です。
値が入っていない(NULLの)行を探す条件として正しいものはどれでしょう?
- WHERE channel IS NULL
- WHERE channel = NULL
- WHERE channel = ”
答えと解説
正解は1です。NULLは「値がない」ことを表す特別な状態なので、= では比べられず、IS NULL を使います。空の文字(”)とNULLは別のものです。
ORDER BYを書かずに LIMIT 10 を使ったときの説明として、正しいものはどれでしょう?
- 必ず新しい順に10件が出てくる
- 必ず表に入れた順に10件が出てくる
- どの10件が出てくるかは決まっておらず、実行のたびに変わることもある
答えと解説
正解は3です。ORDER BYがないときの行の順番は保証されていません。「最新の10件」のように順番に意味があるときは、必ずORDER BYを書きます。
次回予告
次回は、取り出した行を「まとめる」方法を学びます。COUNT・SUM・AVGといった集計関数と、GROUP BYで月別・カテゴリー別に数字をまとめる書き方、まとめた結果をHAVINGで絞る方法を、ツギノテ雑貨店のデータで確かめます。
NEXT|第3回集計の基本:GROUP BYと集計関数で数字をまとめる次の回へ進む →参考資料
- SQLite「SQL As Understood By SQLite:Expression(演算子の優先順位)」(確認日:2026年11月12日)https://www2.sqlite.org/lang_expr.html
- Google Cloud「GoogleSQL:Query syntax(ORDER BYがない場合の結果の順序など)」(確認日:2026年11月12日)https://docs.cloud.google.com/bigquery/docs/reference/standard-sql/query-syntax
この記事は役に立ちましたか?
NEXTあわせて読みたい
-
BPOサービス(業務アウトソーシング)おすすめ7選|コンタクトセンター・バックオフィスの外注先を規模・料金・事例で比較
-
Shopify制作会社おすすめ7選|Shopify Plus・越境EC・運用まで、認定・実績・事例で比較
-
マーケティング研修おすすめ7選|法人向けの基礎・実践・BtoB研修を料金・形式・実績で比較
-
ECコンサル会社おすすめ5選|楽天・Amazon・自社ECの売上を伸ばす支援会社を範囲・料金・事例で比較
-
広報・PR代行(PR会社)おすすめ7選|ベクトル・プラップジャパン・共同ピーアールなどを支援範囲・料金・事例で比較
-
企業データベースおすすめ6選|Speeda・帝国データバンク・東京商工リサーチ・ユーソナーなどを料金・収録数で比較
