SELECT・WHERE・ORDER BY:必要な行と列を取り出す|マーケターのためのSQL入門 第2回

田中 磨生

監修田中 磨生株式会社Abin 代表取締役

株式会社Abin代表取締役。AI SaaSの上場企業やHR系ベンチャーのマーケティング責任者を経て、2023年BtoBマーケティング特化のコンサルティング会社株式会社Abinを設立。創業から30社以上のBtoBマーケティングの戦略立案から実行までを行う。2025年には株式会社プロベルの役員に就任。NYマーケティング株式会社の執行役員も務める。

プロフィールを見る →

執筆Abin編集部

SELECT・WHERE・ORDER BY:必要な行と列を取り出す|マーケターのためのSQL入門 第2回

この回で分かること:①SELECTとFROMで、表から必要な列だけを取り出す書き方と、計算した列や別名の付け方、②WHEREで行を絞る条件の組み立て方(比較・AND・OR・IN・BETWEEN・LIKE・NULL)と、ANDとORを混ぜるときの落とし穴、③ORDER BYでの並べ替えと、LIMITで上位だけを出す方法。前回は、データベースが表・行・列・キーでできていること、SQLは「欲しい結果」を書く言語であることを学びました。今回から、実際にSQLを書いていきます。

SELECTで必要な列を縦に選び、WHEREで条件に合う行を横に選ぶと、表の中から欲しい部分だけが取り出されることを、表の上に色を重ねて示した図
図1:SELECTは「列」を選び、WHEREは「行」を選ぶ

この回の例はすべて、架空の通販「ツギノテ雑貨店」のサンプルデータ(顧客の表 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の条件として正しいものはどれでしょう?

  1. WHERE amount = 2000
  2. WHERE amount >= 2000
  3. 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を混ぜるときは、かっこを付けると覚えておきましょう。

WHERE category=食器 OR category=雑貨 AND amount 3000以上 をかっこなしで書くと、ANDが先に結びついて「食器すべて」または「雑貨で3000円以上」と解釈され6件になり、ORをかっこで囲むと意図どおり5件になることを並べて比べた図
図2: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円以上のもの」を正しく取り出せる条件はどれでしょう?

  1. WHERE (category = ‘食器’ OR category = ‘雑貨’) AND amount >= 3000
  2. WHERE category = ‘食器’ OR category = ‘雑貨’ AND amount >= 3000
  3. WHERE category = ‘食器’ AND category = ‘雑貨’ AND amount >= 3000
答えと解説

正解は1です。かっこがないと、ANDがORより先に結びつき、「食器すべて」または「雑貨で3,000円以上」と解釈されます。3つ目は「食器であり、かつ雑貨である」という、ありえない条件なので0件になります。

FREE MEMBER

無料会員なら、講座が受け放題・AI比較が1日5回

40以上の講座を最後まで読めて、学びの進み具合も記録できます。登録は30秒・無料です。

無料で会員登録する →

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で並べ替え、LIMIT 3で上から3件だけを残して、トップ3の注文が取り出される流れを示した図
図3:ORDER BYで並べてから、LIMITで上から取り出す

よくある誤解:「ORDER BYを書かなくても、いつも同じ順に出てくる」

ORDER BYを書かないときの行の順番は、決まっていません。いつも同じ順に見えても、データが増えたり、データベースの内部の処理が変わったりすると、順番が変わることがあります。

特に注意したいのが、ORDER BYを付けずにLIMITだけを使う場合です。「LIMIT 10で最新の10件を見たつもり」が、実はたまたま出てきた10件だった、ということが起こります。順番に意味があるときは、必ずORDER BYを書きましょう。

なお、重複を取り除きたいときは、SELECTのあとに DISTINCT を付けます。SELECT DISTINCT category FROM orders とすると、注文に出てくるカテゴリーが「食器」「雑貨」「インテリア」の3つだけ表示されます。この結果の並び順も決まっていないので、順番をそろえたいときはORDER BYを付けます。

金額の大きい注文のトップ5を出したいとき、正しい書き方はどれでしょう?

  1. SELECT order_id, amount FROM orders LIMIT 5;
  2. SELECT order_id, amount FROM orders ORDER BY amount DESC LIMIT 5;
  3. SELECT order_id, amount FROM orders ORDER BY amount LIMIT 5;
答えと解説

正解は2です。1つ目はORDER BYがないので、どの5件が出るかは決まっていません。3つ目はASC(小さい順)になるので、金額の小さい5件が出てしまいます。

実務ではこう使う

SELECT・WHERE・ORDER BYだけでも、次のような確認がすぐにできるようになります。

  • 特定の顧客の注文の履歴を、新しい順に確かめる(問い合わせ対応やクレームの確認)
  • 高額の注文や、特定のキャンペーン期間の注文だけを抜き出して、中身を見る
  • 特定の流入元から来た顧客の一覧を出して、MAツールや広告の配信リストと照合する

実際に書くときは、次の順で少しずつ組み立てると、間違いに気づきやすくなります。

  1. まず FROM と SELECT * と LIMIT 10 で、表の中身と値の形を確かめる
  2. 必要な列だけに SELECT を書き換える
  3. WHERE の条件を1つずつ足し、そのたびに件数が想定どおりかを確かめる
  4. 最後に ORDER BY と LIMIT で、見やすく整える
SQLを少しずつ組み立てる4つの手順、中身を10行確かめる・必要な列に絞る・条件を1つずつ足して件数を確かめる・並べ替えて整える、を順に示した図
図4:SQLは少しずつ組み立てて、そのたびに結果を確かめる

条件を一度に全部書くと、結果がおかしいときにどの条件が原因か分からなくなります。1つ足すごとに「件数が減りすぎていないか」「混ざってはいけない行が入っていないか」を見る習慣をつけましょう。

取り出した結果をグラフや表にして共有したい場合は、BIツールおすすめ比較も参考になります。

FOR BUSINESS

マーケティング・DXの発注先選びに迷ったら

ツギノテを運営する株式会社Abinは、BtoBマーケティングに特化したコンサルティング会社です。創業から30社以上のBtoBマーケティングを支援してきました。

相談無料ツギノテ編集部に相談する

無料会員登録(講座受け放題・AI比較)/セミナーと資料を見る

この回のまとめ

  • SELECTで出す列を、FROMで使う表を指定します。分析では SELECT * ではなく、必要な列だけを書きます。
  • 計算した列にはASで別名を付けます。整数どうしの割り算は切り捨てになることがあるので注意します。
  • WHEREで行を絞ります。比べる記号のほか、IN・BETWEEN(両端を含む)・LIKE(%で部分一致)・IS NULL を使い分けます。
  • ANDはORより先に結びつくので、ANDとORを混ぜるときはかっこを付けます。
  • ORDER BYを書かないと行の順番は決まりません。LIMITで上位を出すときは、必ずORDER BYと組み合わせます。

確認テスト

SELECTで計算した列(amount * 5 / 100 など)に分かりやすい名前を付けるために使う言葉はどれでしょう?

  1. WHERE
  2. AS
  3. LIMIT
答えと解説

正解は2です。ASで別名を付けると、結果の列の名前が「point」のように分かりやすくなります。WHEREは行を絞る句、LIMITは件数を絞る句です。

BETWEEN ‘2026-05-01’ AND ‘2026-05-31’ の説明として正しいものはどれでしょう?

  1. 5月1日と5月31日はどちらも含まない
  2. 5月1日は含むが、5月31日は含まない
  3. 5月1日と5月31日の両方を含む(ただし時刻を含む列では、31日の0時より後の記録が漏れることがある)
答えと解説

正解は3です。BETWEENは両端の値を含みます。ただし、時刻まで入っている列では「’2026-05-31’=31日の0時」と比べることになるため、>= と「翌月の初日より前(<)」で書くほうが安全です。

値が入っていない(NULLの)行を探す条件として正しいものはどれでしょう?

  1. WHERE channel IS NULL
  2. WHERE channel = NULL
  3. WHERE channel = ”
答えと解説

正解は1です。NULLは「値がない」ことを表す特別な状態なので、= では比べられず、IS NULL を使います。空の文字(”)とNULLは別のものです。

ORDER BYを書かずに LIMIT 10 を使ったときの説明として、正しいものはどれでしょう?

  1. 必ず新しい順に10件が出てくる
  2. 必ず表に入れた順に10件が出てくる
  3. どの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

この記事は役に立ちましたか?

いま読まれている記事ランキング

    ランキングをもっと見る →

    この記事の内容について

    掲載している情報の修正や削除をご希望の場合は、こちらからご連絡ください。

    修正・削除の依頼
    この講座は第2回まで無料。無料会員なら全6回、最後まで読めます。講座が受け放題・AI比較が1日5回・学びの記録も残せる → 無料で会員登録

    NEXTあわせて読みたい

    ツギノテの記事一覧へ

    編集方針

    • 各社の公式サイトを、確認日を書いて調べています
    • 掲載企業から報酬は受け取っていません
    • 有償の掲載がある場合は「PR」と明記します

    運営:株式会社Abin

    © Abin Co., Ltd.