型・日付・式|テーブル・SELECT・条件抽出
このページはプロモーション(広告)を含みます。
テーブル・SELECT・条件抽出(中級・読む25分+演習35分)
この授業のゴール
- 整数・小数・文字列・NULLの型の違いと、整数どうしの割り算が切り捨てになることを説明し、率を正しく計算できる
- 日付・時刻を文字列として扱う場合の並び順・比較・半開区間の条件を、時刻付きデータでも正しく書ける
- CAST・date()・strftime()・ROUND などの関数で、型変換・日付の切り出し・丸めを行える
- 0による割り算、文字列の数、混在した日付形式など、数字が静かにずれる場面を検査で見抜ける
仕事でどう使うか
SQLは、値の型に従って計算します。同じ「7÷2」でも、整数どうしなら3、小数が混じれば3.5です。日付は、文字列として保存されていると、並び順も範囲指定も文字列の規則に従います。型を意識しないと、エラーにならないまま率が0になり、月末の売上が抜けます。
| 路線 | この授業の使いどころ |
|---|---|
| DS(データサイエンティスト) | 購入率・還元率などの率を正しく計算する。月別集計の期間境界を固定する |
| ML(機械学習エンジニア) | 日付から曜日・月などの特徴量を作る。文字列のまま入った数値を数値に変換する。未来の情報が入らないよう期間を切る |
| DX(DX推進・AI企画) | 日付形式(時刻の有無、タイムゾーン)を業務システムの仕様として確認し、集計期間をKPI定義書に明記する |
| RS(研究者) | 測定日時・単位・桁数の扱いを明記し、丸め誤差と有効数字を意識して再現可能な前処理を書く |
この授業は、モジュール テーブル・SELECT・条件抽出 の統合演習「注文表から対象期間と状態を抽出する」に直結します。
前提
次の言葉を使います。不安があれば先に戻ってください。
- WHERE と半開区間(以上〜未満) → WHEREと条件
- ORDER BY と文字列の並び → ORDER BYとLIMIT
- NULL と COALESCE → NULLと3値論理
- 整数・小数・割合と% → 数値・カテゴリ・日時・欠損、比率・割合・パーセントポイント
この授業は、決済表 payments(7行、1行=決済1件)を使います。paid_at は決済日時を文字列で保存していて、時刻付き('2025-04-30 18:30:00')と日付のみ('2025-04-20'、決済7)が混ざっています。sku_code は商品コードで、数字に見えますが文字列です。
身近な状況:「4月の決済」が月末だけ抜ける、還元率が0%になる
経理から2つの依頼が来ました。
- 「4月の支払済み決済の合計金額を出してください」
- 「ポイント還元率(付与ポイント÷決済金額)を決済ごとに出してください」
担当者は、次のように書いたとします。
-- db: none
CREATE TABLE payments (
pay_id INTEGER PRIMARY KEY,
paid_at TEXT NOT NULL,
status TEXT NOT NULL,
amount INTEGER NOT NULL,
points INTEGER NOT NULL,
sku_code TEXT NOT NULL
);
INSERT INTO payments VALUES
(1,'2025-03-31 23:59:59','paid',3000,30,'10'),
(2,'2025-04-01 00:00:00','paid',1200,12,'20'),
(3,'2025-04-15 12:30:00','refunded',1800,0,'3'),
(4,'2025-04-30 18:30:00','paid',2400,24,'100'),
(5,'2025-04-30 23:59:59','paid',500,5,'7'),
(6,'2025-05-01 00:00:00','paid',4000,40,'15'),
(7,'2025-04-20','paid',700,7,'9');
-- 依頼1:4月の支払済み合計(BETWEEN で書いた例)
SELECT SUM(amount) AS april_total
FROM payments
WHERE status = 'paid'
AND paid_at BETWEEN '2025-04-01' AND '2025-04-30';
-- 依頼2:還元率(整数どうしの割り算)
SELECT pay_id, points / amount AS rate FROM payments ORDER BY pay_id;
依頼1の結果は 1900円(決済2と決済7)ですが、本来の4月の支払済み合計は 4800円(決済2、4、5、7)です。'2025-04-30 18:30:00' は文字列として '2025-04-30' より大きいため、4月30日の決済4と5が条件から漏れました。
依頼2は、すべての行で 0 になります。12 / 1200 は整数どうしの割り算で、小数点以下が切り捨てられ、0.01 が 0 になったためです。
どちらもエラーが出ません。型と日付の規則を知らないと、誰も気づかないまま誤った数字が報告されます。
直感的な説明:値は「入れ物」に入っていて、日付は文字の並び
SQLの値には型(かた)があります。型は、値を入れる入れ物の種類だと考えてください。
| 型 | 例 | 特徴 |
|---|---|---|
| 整数(INTEGER) | 12、1200 | 小数点がない。割り算は切り捨て |
| 小数(REAL) | 0.01、3.5 | 小数点がある。丸め誤差を含みうる |
| 文字列(TEXT) | 'paid'、'100' | 文字の並び。数字に見えても、並び順は辞書順 |
| NULL | NULL | 値がない(NULLと3値論理) |
日付は、SQLiteには専用の型がなく、'2025-04-30 18:30:00' のような文字列で保存するのが一般的です。このため、日付の比較や並べ替えは文字列の比較になります。幸い、年→月→日→時→分→秒と大きい単位から並べる形式(ISO 8601形式)なら、辞書順がそのまま時刻順になります。
ただし、文字列の比較では '2025-04-30 18:30:00' は '2025-04-30' より後ろ(大きい)です。短い文字列は、同じ文字で始まる長い文字列より小さいためです。これが月末が抜ける原因です。
注意:PostgreSQL や MySQL などには DATE/TIMESTAMP 型があり、日付として厳密に扱われます。方言によって関数名や動作が違うため、この授業では SQLite の書き方を示し、違いは本文で注記します。
正確な定義:型・割り算・CAST・日付関数
1. 割り算の規則
SQLiteでは、整数 / 整数 は整数(小数点以下を切り捨て)、片方でも小数なら小数です。
$$\frac{7}{2} = 3\ (\text{整数どうし}),\qquad \frac{7}{2.0} = 3.5\ (\text{小数が混じる})$$
率を求めるときは、分子に 1.0 * を掛けるか、100.0 * を掛けて小数にします。ポイント還元率なら
$$\text{rate}(\%) = \frac{\text{points} \times 100.0}{\text{amount}}$$
ここで points は付与ポイント(点)、amount は決済金額(円)です。決済2なら $12 \times 100.0 \div 1200 = 1.0\%$ です。
2. 0による割り算:SQLiteでは x / 0 は NULL(エラーにならない)。PostgreSQL などはエラーになります。分母が0になりうるときは、NULLIF(分母, 0) で分母をNULLにして、結果をNULLにする方法があります。
3. 型変換 CAST:CAST(値 AS INTEGER)。引数は値、戻り値は指定した型の値。CAST('100' AS INTEGER) は整数の100。数字でない文字列は 0 に変わるため、事前に確認が必要です。
4. 日付関数(SQLite):
| 式 | 戻り値 | 例 |
|---|---|---|
date(文字列) |
日付部分 'YYYY-MM-DD' |
date('2025-04-30 18:30:00') → '2025-04-30' |
date(x, '+1 day') |
日数を加える | date('2025-04-30','+1 day') → '2025-05-01' |
date(x, 'start of month', '+1 month') |
翌月1日 | 半開区間の上端に使う |
strftime('%Y-%m', x) |
書式指定の文字列 | '2025-04'(年月の集計に使う) |
5. その他:|| は文字列の連結('a' || 'b' は 'ab')。ROUND(x, n) は小数 n 桁に丸める。abs(x) は絶対値。
6. 日時の範囲指定:「4月」は、日付のみでも時刻付きでも、次の形が安全です。
$$\text{'2025-04-01'} \le \text{paid\_at} < \text{'2025-05-01'}$$
date(paid_at) で日付だけに直してから BETWEEN で比べる方法も同じ結果になりますが、列に関数を掛けると、大きな表で索引(検索を速くする仕組み)が使えず遅くなる場合があります。
段階付き例題:4月の支払済み決済と、還元率を正しく出す
問題:4月(2025-04-01以上2025-05-01未満)の支払済み決済について、決済ID、金額、還元率(%)を、小数第2位に丸めて出す。あわせて、合計金額を求める。
ステップ1:条件を言葉にする。状態が paid、決済日時が4月。
ステップ2:期間を半開区間で書く。paid_at >= '2025-04-01' AND paid_at < '2025-05-01'。日付のみの決済7('2025-04-20')も、この条件で正しく入る。
ステップ3:還元率を小数で計算する。ROUND(points * 100.0 / amount, 2)。100.0 で小数にする。
-- db: none
CREATE TABLE payments (
pay_id INTEGER PRIMARY KEY,
paid_at TEXT NOT NULL,
status TEXT NOT NULL,
amount INTEGER NOT NULL,
points INTEGER NOT NULL,
sku_code TEXT NOT NULL
);
INSERT INTO payments VALUES
(1,'2025-03-31 23:59:59','paid',3000,30,'10'),
(2,'2025-04-01 00:00:00','paid',1200,12,'20'),
(3,'2025-04-15 12:30:00','refunded',1800,0,'3'),
(4,'2025-04-30 18:30:00','paid',2400,24,'100'),
(5,'2025-04-30 23:59:59','paid',500,5,'7'),
(6,'2025-05-01 00:00:00','paid',4000,40,'15'),
(7,'2025-04-20','paid',700,7,'9');
SELECT pay_id,
amount,
ROUND(points * 100.0 / amount, 2) AS rate_pct
FROM payments
WHERE status = 'paid'
AND paid_at >= '2025-04-01'
AND paid_at < '2025-05-01'
ORDER BY pay_id;
SELECT SUM(amount) AS april_total
FROM payments
WHERE status = 'paid'
AND paid_at >= '2025-04-01'
AND paid_at < '2025-05-01';
ステップ4:結果を読む。決済 2(1200円)、4(2400円)、5(500円)、7(700円)の4行で、還元率はすべて 1.0%(付与ポイントは金額の1%)。合計は $1200 + 2400 + 500 + 700 = 4800$ 円です。
ステップ5:検算する。(1) 元の表を目で見て、4月で paid は決済2、4、5、7の4件。決済3は返金、決済1は3月、決済6は5月で除かれる。(2) 月末の決済4と5(4月30日)が入っている。(3) 日付のみの決済7も入っている。この3点を確認すると、境界の取りこぼしがないと言えます。
ステップ6:率の意味を確認する。1.0 は「1%」であり、「1」ではありません。割合(0.01)とパーセント(1%)を混ぜないように、列名に _pct と書いて単位を示します。
操作して理解する:型・割り算・並び順を実行で確かめる
次のSQLを、実行する前に結果を予想してください。
-- db: none
CREATE TABLE payments (
pay_id INTEGER PRIMARY KEY,
paid_at TEXT NOT NULL,
status TEXT NOT NULL,
amount INTEGER NOT NULL,
points INTEGER NOT NULL,
sku_code TEXT NOT NULL
);
INSERT INTO payments VALUES
(1,'2025-03-31 23:59:59','paid',3000,30,'10'),
(2,'2025-04-01 00:00:00','paid',1200,12,'20'),
(3,'2025-04-15 12:30:00','refunded',1800,0,'3'),
(4,'2025-04-30 18:30:00','paid',2400,24,'100'),
(5,'2025-04-30 23:59:59','paid',500,5,'7'),
(6,'2025-05-01 00:00:00','paid',4000,40,'15'),
(7,'2025-04-20','paid',700,7,'9');CREATE TABLE campaign (
cid INTEGER PRIMARY KEY,
name TEXT NOT NULL,
visits INTEGER NOT NULL,
converts INTEGER NOT NULL
);
INSERT INTO campaign VALUES (1,'A',1000,35),(2,'B',800,64),(3,'C',0,0),(4,'D',250,7);
-- (1) 型の確認と割り算
SELECT typeof(1) AS t1, typeof(1.0) AS t2, typeof('1') AS t3, typeof(NULL) AS t4,
7 / 2 AS int_div, 7 / 2.0 AS real_div, 7 % 2 AS remainder;
-- (2) 文字列の商品コードの並び
SELECT sku_code FROM payments ORDER BY sku_code;
SELECT sku_code FROM payments ORDER BY CAST(sku_code AS INTEGER);
-- (3) 分母が0の行を含む率
SELECT cid, name, visits, converts,
converts * 100 / visits AS wrong_pct,
ROUND(converts * 100.0 / visits, 2) AS right_pct
FROM campaign ORDER BY cid;
-- (4) 日付の切り出しと加算
SELECT date('2025-04-30 18:30:00') AS d1,
date('2025-04-30', '+1 day') AS d2,
date('2025-04-15', 'start of month', '+1 month') AS next_month,
strftime('%Y-%m', '2025-04-30 18:30:00') AS ym;
答えと読み方:
- (1) integer、real、text、null。
7/2=3、7/2.0=3.5、7%2=1(余り)。 - (2) 文字列の並びは
'10'、'100'、'15'、'20'、'3'、'7'、'9'。整数に直すと3、7、9、10、15、20、100。 - (3) 整数どうしでは A=3、B=8、D=2(切り捨て)、小数にすると A=3.5、B=8.0、D=2.8。分母が0のキャンペーンCはNULL。「0%」ではなく「計算できない」を意味します。
- (4)
'2025-04-30'、'2025-05-01'、'2025-05-01'、'2025-04'。
試してみよう:SELECT 0.1 + 0.2 = 0.3; を実行すると 0(偽)になります。小数は二進数で近似されるため、わずかな誤差が出ます。金額は整数(円)で持つか、ABS(a - b) < 1e-9 のように許容誤差で比べます。
発展:方言差・タイムゾーン・金額の持ち方
方言による日付の扱い:
| 目的 | SQLite | PostgreSQL | MySQL |
|---|---|---|---|
| 日付部分 | date(x) |
x::date / CAST(x AS date) |
DATE(x) |
| 月初 | date(x,'start of month') |
DATE_TRUNC('month', x) |
DATE_FORMAT(x,'%Y-%m-01') |
| 年月文字列 | strftime('%Y-%m',x) |
TO_CHAR(x,'YYYY-MM') |
DATE_FORMAT(x,'%Y-%m') |
| 0除算 | NULL | エラー | NULL(設定による) |
タイムゾーン:保存された時刻が、UTC(協定世界時)なのか日本時間なのかで、「4月30日の23時」が別の日になりえます。日本時間はUTCより9時間進んでいます。UTCで保存された '2025-04-30 16:00:00' は日本時間では5月1日1時です。月次集計では、どの時刻基準で月を区切るかを定義書に書きます。
混在した日付形式:本文の paid_at のように、時刻付きと日付のみが混ざるデータは、取込時の不備でよく起きます。さらに '2025/04/30'、'2025-4-30' のような形式が混ざると、文字列の比較が壊れます。使う前に LENGTH(paid_at) の種類数や MIN/MAX で形式を確認します。
金額と小数:金額は浮動小数(REAL)ではなく、整数(円単位や銭単位)または固定小数点型(DECIMAL)で持つのが安全です。REALで合計すると、1円未満の誤差が積み上がります。割合は表示の直前に丸め、計算の途中で丸めないのが原則です。
SQLiteの型の特徴:SQLiteは列の型宣言が「型親和性(affinity)」という緩い規則で、INTEGER列に文字列も入れられます。他のデータベースは厳格です。本番のデータベースでは、typeof() に相当する確認と型の宣言を確認してください。
よくある失敗
失敗1:整数どうしの割り算で、率が0や切り捨てになる
-- db: none
CREATE TABLE campaign (
cid INTEGER PRIMARY KEY,
name TEXT NOT NULL,
visits INTEGER NOT NULL,
converts INTEGER NOT NULL
);
INSERT INTO campaign VALUES (1,'A',1000,35),(2,'B',800,64),(3,'C',0,0),(4,'D',250,7);
-- 誤り:整数どうしの割り算
SELECT cid, converts / visits AS wrong_rate, converts * 100 / visits AS wrong_pct
FROM campaign ORDER BY cid;
-- 正しい:小数にしてから割る
SELECT cid, ROUND(converts * 1.0 / visits, 4) AS rate FROM campaign ORDER BY cid;
誤りの1列目は A・B・D がすべて 0、2列目は 3、8、2 と切り捨てられた値です(真の値は 3.5%、8.0%、2.8%)。直し方:分子に 1.0 *(または 100.0 *)を掛けて小数にしてから割り、ROUND で最後に丸める。率の列名に単位(_rate か _pct)を付ける。
失敗2:時刻付きの日時に BETWEEN や <= 日付 を使う
-- db: none
CREATE TABLE payments (
pay_id INTEGER PRIMARY KEY,
paid_at TEXT NOT NULL,
status TEXT NOT NULL,
amount INTEGER NOT NULL,
points INTEGER NOT NULL,
sku_code TEXT NOT NULL
);
INSERT INTO payments VALUES
(1,'2025-03-31 23:59:59','paid',3000,30,'10'),
(2,'2025-04-01 00:00:00','paid',1200,12,'20'),
(3,'2025-04-15 12:30:00','refunded',1800,0,'3'),
(4,'2025-04-30 18:30:00','paid',2400,24,'100'),
(5,'2025-04-30 23:59:59','paid',500,5,'7'),
(6,'2025-05-01 00:00:00','paid',4000,40,'15'),
(7,'2025-04-20','paid',700,7,'9');
-- 誤り:4月30日の決済が抜ける
SELECT pay_id, paid_at FROM payments
WHERE status = 'paid' AND paid_at BETWEEN '2025-04-01' AND '2025-04-30'
ORDER BY pay_id;
-- 誤り:<= '2025-04-30' でも抜ける(3月31日の決済1が入る問題も起きる)
SELECT pay_id, paid_at FROM payments
WHERE status = 'paid' AND paid_at <= '2025-04-30'
ORDER BY pay_id;
-- 正しい:半開区間
SELECT pay_id, paid_at FROM payments
WHERE status = 'paid' AND paid_at >= '2025-04-01' AND paid_at < '2025-05-01'
ORDER BY pay_id;
BETWEEN は決済2と7の2件、<= は決済1・2・7(開始側の条件がないため3月も入る)、半開区間は決済2・4・5・7の4件です。直し方:時刻の有無によらず、>= 開始 AND < 翌期間の開始 を使う。月初・月末の決済が入っているかを目視で確かめる。
失敗3:数字に見える文字列を、そのまま並べ替えたり比べたりする
-- db: none
CREATE TABLE payments (
pay_id INTEGER PRIMARY KEY,
paid_at TEXT NOT NULL,
status TEXT NOT NULL,
amount INTEGER NOT NULL,
points INTEGER NOT NULL,
sku_code TEXT NOT NULL
);
INSERT INTO payments VALUES
(1,'2025-03-31 23:59:59','paid',3000,30,'10'),
(2,'2025-04-01 00:00:00','paid',1200,12,'20'),
(3,'2025-04-15 12:30:00','refunded',1800,0,'3'),
(4,'2025-04-30 18:30:00','paid',2400,24,'100'),
(5,'2025-04-30 23:59:59','paid',500,5,'7'),
(6,'2025-05-01 00:00:00','paid',4000,40,'15'),
(7,'2025-04-20','paid',700,7,'9');
-- 誤り:'100' が '15' や '20' より前に来る
SELECT sku_code FROM payments ORDER BY sku_code LIMIT 3;
-- 正しい:整数に直す
SELECT sku_code FROM payments ORDER BY CAST(sku_code AS INTEGER) LIMIT 3;
-- 誤解:'10' と '9' の大小を文字列で比べる
SELECT '10' < '9' AS text_cmp, CAST('10' AS INTEGER) < CAST('9' AS INTEGER) AS int_cmp;
誤りの結果は '10'、'100'、'15'。正しくは '3'、'7'、'9' です。文字列の比較では '10' < '9' が真(1)になり、整数に直すと偽(0)です。直し方:数として使う列は数値型で持つ。文字列のままのときは CAST で変換する。ただし、CAST は数字でない文字列を 0 に変えるため、変換前に GLOB '*[^0-9]*' などで数字以外が混ざっていないか確認する。
まとめ
- 整数どうしの割り算は切り捨てになる。率は 1.0 や 100.0 を掛けて小数にしてから割る。
- 0による割り算はSQLiteではNULL。0%と混同せず、計算不能として扱う。
- 日時は文字列で比較される。期間は「>= 開始 AND < 翌期間の開始」で書く。
- 数字に見える文字列は辞書順に並ぶ。CAST で型を変えるか、数値型で持つ。
- date()・strftime()・ROUND・CAST の方言差と、日付形式の混在を事前に確認する。
用語
- 型(data type)
値の種類(整数、小数、文字列など)。型によって計算や比較の規則が変わる。
- CAST(CAST)
値を別の型に変換する関数。CAST(x AS INTEGER) など。
- 整数除算(integer division)
整数どうしの割り算で、小数点以下が切り捨てられる。7/2は3。
- ISO 8601形式(ISO 8601)
日時を年-月-日 時:分:秒の順に書く形式。文字列の辞書順が時刻順になる。
- 半開区間(half-open interval)
開始を含み終了を含まない範囲。期間を安全に指定できる。
よくある質問
日付はなぜ文字列で保存するのですか?
SQLiteに日付専用の型がないためです。ISO 8601形式の文字列なら、辞書順が時刻順になり、比較や並べ替えが期待どおりに動きます。他のデータベースでは DATE/TIMESTAMP 型があり、型が保証されます。
CAST が失敗する(数字でない文字列)場合は?
SQLiteでは 0 に変換されます。気づかずに集計に入るので、変換前に数字だけか確認するか、変換後に件数や合計を元データと照合します。厳格なデータベースではエラーになります。
ROUND は計算のどこで使うべきですか?
最後(表示の直前)です。途中で丸めると誤差が積み上がります。合計や平均を求めるときは、丸める前の値で計算し、結果だけを丸めます。
date() や strftime() を WHERE の列に使ってよいですか?
動作は正しいですが、大きな表では列に関数を掛けると索引が使えず遅くなる場合があります。範囲指定なら col >= … AND col < … の形のほうが速くなりやすいです。まず正しさを優先し、遅ければ見直します。
月ごとの集計をしたいときは?
strftime('%Y-%m', paid_at) で年月を切り出し、GROUP BY で集計します(「GROUP BY」(有料版))。ただし期間の端が欠けていないか、タイムゾーンが揃っているかを先に確認します。
仕事で、期間と状態の定義はどこに書きますか?
KPI定義書や分析依頼書に『集計期間:2025-04-01以上2025-05-01未満(日本時間)』『対象状態:paid』のように書きます。SQLと文書が同じ定義を指すようにしておくと、担当者が変わっても同じ数字が再現できます。
確認問題
問1 SQLiteで SELECT 7 / 2 の結果はどれか。
- ① エラー
- ② 3.5
- ③ 3
- ④ 4
解答と解説
正解:③
整数どうしの割り算は整数になり、小数点以下は切り捨てられます。
問2 paid_at に '2025-04-30 18:30:00' が入っている。paid_at BETWEEN '2025-04-01' AND '2025-04-30' の結果はどうなるか。
- ① 4月30日の18:30の決済は入らない
- ② 構文エラーになる
- ③ 4月1日の決済が入らない
- ④ 4月30日の18:30の決済も入る
解答と解説
正解:①
文字列として '2025-04-30 18:30:00' は '2025-04-30' より大きいため、上限を超えます。
問3 購入率(%)を converts * 100.0 / visits と書く理由として最も適切なものはどれか。
- ① 100 を掛けると必ず整数になるため
- ② visits が0でもエラーにならないため
- ③ ROUND が不要になるため
- ④ 100.0 で小数にして、整数の割り算による切り捨てを避けるため
解答と解説
正解:④
小数が混ざった割り算は小数で計算され、切り捨てを避けられます。
問4 数字に見える文字列 '3'、'10'、'9' を昇順に並べるとどうなるか。
- ① '3'、'9'、'10'
- ② '10'、'3'、'9'
- ③ '9'、'3'、'10'
- ④ '10'、'9'、'3'
解答と解説
正解:②
文字列は左から1文字ずつ比べるので、'1…' が最も小さくなります。
問5 分母が0の 10 / 0 を SQLite で実行するとどうなるか。また、その結果の使い方として適切なものはどれか。
- ① 0になる。そのまま平均に使える
- ② 無限大になる
- ③ エラーで停止する。例外処理が必要
- ④ NULLになる。0%と誤解しないよう、NULLのまま「計算不能」と扱う
解答と解説
正解:④
SQLiteでは0割りはNULLです。方言によってはエラーになるので注意します。
問6 日時の範囲を指定する方法として、時刻の有無や月末日の違いに最も強いものはどれか。
- ① col >= '2025-04-01' AND col < '2025-05-01'
- ② col LIKE '2025-04-3%'
- ③ col BETWEEN '2025-04-01' AND '2025-04-30'
- ④ col >= '2025-04-01' AND col <= '2025-04-30'
解答と解説
正解:①
「開始以上、翌期間の開始未満」の半開区間は、時刻の有無と月の長さに影響されません。
次に学ぶこと
これでモジュール テーブル・SELECT・条件抽出 の6授業が終わりです。次は、総合テストと自力課題で、条件・NULL・日付・順序をまとめて確認します。
その後は 「COUNT・SUM・AVG」(有料版) で COUNT・SUM・AVG による集計に、「GROUP BY」(有料版) で GROUP BY に進みます。集計では、ここで学んだ「NULLの扱い」「率の計算」「期間の境界」がそのまま使われます。
キャリア学習:データサイエンティスト・機械学習エンジニア・DX推進・研究者を目指す人の学習アプリ。164モジュール・984授業を、ブラウザで動くSQLとPythonの演習で。基礎と各分野の最初のモジュールは無料。全部は2,980円の買い切り。
アプリを無料で開く有料版と無料版の違い