会員IDが重複し、メールアドレスが空のまま登録される。存在しない会員の注文まで入ってしまう。間違ったデータを後から探して直すのは大変です。
制約は、間違ったデータが表へ入る前に止めるルールです。空欄、重複、行の見分け、表どうしの関係、値の範囲、の5つに分けると役割を理解できます。
この記事では、NOT NULL、UNIQUE、PRIMARY KEY、FOREIGN KEY、CHECKを会員表と注文表で試します。Oracle AI Database 26aiの公式資料を基準にし、実行できる例はローカルでも確認しています。
- 制約の役割
- 5項目の構文と例題
- よくある4つの間違い
- 3ステップの練習方法
- 最新研究とFAQ
制約とは?今日のゴール
制約はエラーを増やすためではなく、間違ったデータが入る前に止めるための仕組みです。主キーは行を見分け、外部キーは表どうしのつながりを守ります。

今日は、どこまでできればよいですか?



5項目を同じデータで動かし、違いを一言で説明できれば大丈夫です。



最初から全部覚えますか?



いいえ。まず入力と戻り値を見て、必要になった関数や文を選びます。



試験では暗記だけで足りますか?



例題の結果を予想してから動かすと、名前だけより間違いに気づきやすくなります。
CREATE TABLE members (member_id INTEGER PRIMARY KEY, email TEXT UNIQUE NOT NULL, age INTEGER CHECK(age >= 0));
CREATE TABLE orders (order_id INTEGER PRIMARY KEY, member_id INTEGER, FOREIGN KEY(member_id) REFERENCES members(member_id));


5項目を例題で確認する
5項目を同じ順番で学びます。各例は、何を入力し、何が返るかを確認してください。



コードはそのまま入力してよいですか?



はい。まず小さな表で動かし、その後に値を一つ変えます。



結果を見る前に何をしますか?



返る行や値を予想し、実際の結果と比べます。



Oracle環境がない例はどうしますか?



未実行と明記し、26ai公式構文を確認します。
1.NOT NULLで空を禁止する
email TEXT NOT NULL
必ず値が必要な列へ使います。空文字とNULLの違いは製品仕様も確認します。
次に、数値や文字を一つ変えてもう一度実行します。結果が変わる場所を説明できれば、構文と意味がつながっています。
NOT NULLで空を禁止するの結果を読み解く
この例では、構文を写す前に「何行返るか」「どの列が変わるか」「NULLや条件外の値はどうなるか」を予想します。必ず値が必要な列へ使います。空文字とNULLの違いは製品仕様も確認します。予想と実行結果が違ったら、SQL全体を消さず、SELECTする列や条件を一つずつ減らして確認します。
仕事のデータへ置き換えるなら、いきなり本番表を更新せず、NOT NULLで空を禁止するで使う列だけを持つ小さな練習表を作ります。1件、境目の値、条件外の値、NULLの4パターンを置くと、通常の例だけでは気づきにくい動きも確認できます。これは試験問題の選択肢を比べるときにも使える考え方です。
- コードを見ずに、入力する値と返る値を一行で予想する
- 例題の値を一つだけ変え、結果が変わる場所を説明する
- 条件外またはNULLの行を一つ足し、結果をもう一度確かめる
2.UNIQUEで重複を制限する
email TEXT UNIQUE
同じメールアドレスを複数行へ入れない例です。NULLを何件許すかは製品の動作を確認します。
次に、数値や文字を一つ変えてもう一度実行します。結果が変わる場所を説明できれば、構文と意味がつながっています。
UNIQUEで重複を制限するの結果を読み解く
この例では、構文を写す前に「何行返るか」「どの列が変わるか」「NULLや条件外の値はどうなるか」を予想します。同じメールアドレスを複数行へ入れない例です。NULLを何件許すかは製品の動作を確認します。予想と実行結果が違ったら、SQL全体を消さず、SELECTする列や条件を一つずつ減らして確認します。
仕事のデータへ置き換えるなら、いきなり本番表を更新せず、UNIQUEで重複を制限するで使う列だけを持つ小さな練習表を作ります。1件、境目の値、条件外の値、NULLの4パターンを置くと、通常の例だけでは気づきにくい動きも確認できます。これは試験問題の選択肢を比べるときにも使える考え方です。
- コードを見ずに、入力する値と返る値を一行で予想する
- 例題の値を一つだけ変え、結果が変わる場所を説明する
- 条件外またはNULLの行を一つ足し、結果をもう一度確かめる
3.PRIMARY KEYで行を見分ける
member_id INTEGER PRIMARY KEY
NULL不可と重複不可を組み合わせ、各行を一つに特定します。
次に、数値や文字を一つ変えてもう一度実行します。結果が変わる場所を説明できれば、構文と意味がつながっています。
PRIMARY KEYで行を見分けるの結果を読み解く
この例では、構文を写す前に「何行返るか」「どの列が変わるか」「NULLや条件外の値はどうなるか」を予想します。NULL不可と重複不可を組み合わせ、各行を一つに特定します。予想と実行結果が違ったら、SQL全体を消さず、SELECTする列や条件を一つずつ減らして確認します。
仕事のデータへ置き換えるなら、いきなり本番表を更新せず、PRIMARY KEYで行を見分けるで使う列だけを持つ小さな練習表を作ります。1件、境目の値、条件外の値、NULLの4パターンを置くと、通常の例だけでは気づきにくい動きも確認できます。これは試験問題の選択肢を比べるときにも使える考え方です。
- コードを見ずに、入力する値と返る値を一行で予想する
- 例題の値を一つだけ変え、結果が変わる場所を説明する
- 条件外またはNULLの行を一つ足し、結果をもう一度確かめる
4.FOREIGN KEYで表をつなぐ
FOREIGN KEY(member_id) REFERENCES members(member_id)
注文のmember_idが会員表に存在することを求めます。削除時の動きも設計します。
次に、数値や文字を一つ変えてもう一度実行します。結果が変わる場所を説明できれば、構文と意味がつながっています。
FOREIGN KEYで表をつなぐの結果を読み解く
この例では、構文を写す前に「何行返るか」「どの列が変わるか」「NULLや条件外の値はどうなるか」を予想します。注文のmember_idが会員表に存在することを求めます。削除時の動きも設計します。予想と実行結果が違ったら、SQL全体を消さず、SELECTする列や条件を一つずつ減らして確認します。
仕事のデータへ置き換えるなら、いきなり本番表を更新せず、FOREIGN KEYで表をつなぐで使う列だけを持つ小さな練習表を作ります。1件、境目の値、条件外の値、NULLの4パターンを置くと、通常の例だけでは気づきにくい動きも確認できます。これは試験問題の選択肢を比べるときにも使える考え方です。
- コードを見ずに、入力する値と返る値を一行で予想する
- 例題の値を一つだけ変え、結果が変わる場所を説明する
- 条件外またはNULLの行を一つ足し、結果をもう一度確かめる
5.CHECKで条件を決める
age INTEGER CHECK(age >= 0)
年齢が0以上という行内の条件を置きます。複雑な業務ルールを一つへ詰め込みすぎません。
次に、数値や文字を一つ変えてもう一度実行します。結果が変わる場所を説明できれば、構文と意味がつながっています。
CHECKで条件を決めるの結果を読み解く
この例では、構文を写す前に「何行返るか」「どの列が変わるか」「NULLや条件外の値はどうなるか」を予想します。年齢が0以上という行内の条件を置きます。複雑な業務ルールを一つへ詰め込みすぎません。予想と実行結果が違ったら、SQL全体を消さず、SELECTする列や条件を一つずつ減らして確認します。
仕事のデータへ置き換えるなら、いきなり本番表を更新せず、CHECKで条件を決めるで使う列だけを持つ小さな練習表を作ります。1件、境目の値、条件外の値、NULLの4パターンを置くと、通常の例だけでは気づきにくい動きも確認できます。これは試験問題の選択肢を比べるときにも使える考え方です。
- コードを見ずに、入力する値と返る値を一行で予想する
- 例題の値を一つだけ変え、結果が変わる場所を説明する
- 条件外またはNULLの行を一つ足し、結果をもう一度確かめる
仕事のデータへ置き換える前の4つの確認
制約を仕事で使うときは、動くSQLを作ることだけでなく、対象データと結果の範囲を確認します。練習表で正しく動いても、本番表では件数、NULL、文字コード、権限などが違う場合があります。



練習SQLをそのまま本番で動かしてよいですか?



先に参照だけで対象件数を確認し、更新を含む場合は検証環境とバックアップの手順を確認します。



どの値をテストに入れますか?



通常値、境目、条件外、NULLの4つを基本にします。



結果が正しそうなら十分ですか?



行数、列の型、重複、並び順まで要件と合うか確認します。
- 対象行
-
WHERE条件を付ける前後の件数を比べます。
- データ型
-
文字、数値、日付を暗黙に変換していないか確認します。
- 境目の値
-
条件が切り替わる直前と直後を試します。
- 実行権限
-
参照、作成、更新など必要な権限だけで動くか確認します。
たとえば月末の集計なら、月の途中だけでなく月末日、うるう年、時刻つきの値も用意します。文字列なら空白、全角・半角、NULLを分けます。制約やトランザクションなら、正しい値だけでなく意図的に違反する値も入れ、どこで止まるかを確認します。
よくある4つの間違いと直し方
エラーはSQL全体を見直す前に、4つの点へ分けます。一度に書き直さず、入力、型、条件、終わりの順で小さく確認します。



エラーが出たら最初に何を見ますか?



主キーはNULLを許さず、表の中心となる識別子です。



全部を書き直した方が早くないですか?



小さく分けた方が、どこで意味がずれたか分かります。



同じ間違いを減らすにはどうしますか?



エラー文と直した1行を短く残し、翌日にもう一度同じ例を動かします。
- 主キーとUNIQUEを同じと思う
-
主キーはNULLを許さず、表の中心となる識別子です。
- 外部キーの親を先に入れない
-
親表の行を作ってから子表へ入れます。
- 制約名を付けない
-
運用では分かる名前を付けるとエラーを追いやすくなります。
- CHECKへ他表の条件を書く
-
行内で確認できる範囲を基本にします。
制約をすべて通る例を作ります。
どのエラーで止まるか確認します。
外部キーがある表の動きを確かめます。
エラー文は、失敗したという評価ではなく、データベースが確認できなかった場所を示す手がかりです。エラー番号、実行したSQL、使った値、直した箇所の4点を残します。同じ番号でも原因が同じとは限らないため、最後に変更した一行から戻って確認します。


最新研究から考えるSQLの練習方法
2024年のSQL学習支援に関する無作為化面接研究を確認しました。SQLの仕様はOracle公式資料を優先し、論文は練習方法の参考にします。



どんな研究ですか?



北米の大学でSQLを学ぶ39人が参加し、ウェブ検索、一般のChatGPT、授業情報を加えたチャットの使い方を比べました。



結果はどうでしたか?



授業情報を加えたチャットではやり取りが2倍以上でしたが、完成したSQLの正しさには有意な差がありませんでした。



この記事へそのまま当てはめられますか?



参加者が39人と少なく、上級学年の情報系学生が対象です。長期の学習効果も調べていません。
| 確認項目 | 内容 |
|---|---|
| 方法・人数 | 北米の大学でSQLを学ぶ39人が参加し、ウェブ検索、一般のChatGPT、授業情報を加えたチャットの使い方を比べました。 |
| 結果 | 授業情報を加えたチャットではやり取りが2倍以上でしたが、完成したSQLの正しさには有意な差がありませんでした。 |
| 限界 | 参加者が39人と少なく、上級学年の情報系学生が対象です。長期の学習効果も調べていません。 |
| 論文 | 研究ページを確認する |
この研究から、会話の回数が増えることと、完成したSQLが正しくなることは同じではないと分かります。AIや検索を使う場合も、答えを貼り付けた回数ではなく、自分が結果を予想できたか、エラーの理由を説明できたかを確認します。利用した製品名、版、表の定義も一緒に残すと、別の環境との違いを追いやすくなります。
SELECTとWHEREの基本を先に復習したい場合は、公開済みの【SQL Silver対策 #1】SELECTとWHEREの基礎ドリル30(抽出・並べ替え・別名)へ進めます。


30分で行う復習メニュー
5項目を一度読んだ後は、読む時間より手を動かす時間を長くします。次の30分は、10分ずつ「再現・変更・説明」に分けます。



最初の10分は何をしますか?



記事を閉じ、セットアップと一つ目の例を見ずに書きます。



次の10分は何を変えますか?



値、条件、NULLのどれか一つを変え、結果を予想します。



最後の10分は何を残しますか?



間違えた一行と理由、直した一行をノートへ残します。
コードを隠し、表と最初の例を見ずに書きます。
値または条件を一つ変え、実行前に結果を予想します。
入力、処理、戻り値を3文で説明します。
翌日は同じコードを写さず、エラーになった例を一つだけ再現します。できた項目へ印を付け、まだ説明できない項目だけ本文へ戻ります。
理解を確かめる5つの追加ドリル
次の問題は、正解のSQLをすぐ見るのではなく、どの項目を使うか決めてから書きます。制約の名前を答えるだけでなく、入力と期待する結果を先に一行で書いてください。



ドリルは全部解きますか?



最初は1と2だけで大丈夫です。翌日に3以降へ進みます。



答えが一つにならない場合はどうしますか?



目的と結果が同じなら複数の書き方があります。読みやすさと公式仕様も比べます。



正解かどうかは何で確かめますか?



小さな入力データと期待結果を作り、実行結果または公式仕様と比べます。
ドリル1|通常の値を一つ変える
最初の例題から文字または数値を一つ変えます。変更前と同じ構文で動くか、戻る値のどこが変わるかを予想します。必ず値が必要な列へ使います。空文字とNULLの違いは製品仕様も確認します。という説明を、自分の変更後の値へ置き換えて言えるか確認します。
ドリル2|境目の値を入れる
条件が切り替わる直前、切り替わる値、その直後を用意します。日付なら月末や時刻、数値なら比較記号の境目、文字なら検索位置や長さの端を試します。境目を含むか含まないかをSQLの記号と結果の両方で説明します。
ドリル3|NULLを一つ加える
使う列へNULLを持つ行を一つ加え、結果がNULLになるのか、行が除かれるのか、制約で止まるのかを予想します。NULLは空文字や0と同じではありません。関数や条件ごとの動きはOracle 26ai公式資料で確認します。
ドリル4|わざと間違えて直す
よくある間違いの「主キーとUNIQUEを同じと思う」を再現し、出たエラーまたは意図と違う結果を記録します。次に一か所だけ直します。直す前後のSQLを並べると、エラー文と原因がつながります。
ドリル5|仕事の言葉で説明する
最後にSQL用語を使いすぎず、「この処理は何を受け取り、何を返し、どの値に注意するか」を3文で説明します。説明できない部分があれば、その部分だけ公式資料へ戻ります。これで5項目のうち、まだ曖昧な場所を見つけられます。
- □ 実行前に結果を予想した
- □ 通常値と境目を試した
- □ NULLまたは条件外の値を試した
- □ エラー文と直した一行を残した
- □ 入力・処理・戻り値を3文で説明した
5日間の学習計画へ入れる
制約を一日で覚え切ろうとせず、5日へ分けて「読む・動かす・変える・説明する・解き直す」を行います。毎日長時間続けるより、同じ小さな例へ何度か戻り、自分で再現できるかを確かめます。



毎日何時間も必要ですか?



最初は15〜30分でかまいません。時間より、結果を予想して確認する流れを守ります。



前日の内容を忘れたらどうしますか?



最初の5分で一問だけ解き直し、思い出せない部分だけ本文へ戻ります。



試験直前はどう使いますか?



間違えた例と境目の値を優先し、新しい問題を増やしすぎません。
| 日 | 行うこと | できたかの確認 |
|---|---|---|
| 1日目 | 5項目の役割を読み、例を一度動かす | 入力と戻り値を一言で言える |
| 2日目 | コードを隠して最初の2例を再現する | 構文を見ずに実行または記述できる |
| 3日目 | 値、境目、NULLを変えて試す | 結果が変わる理由を説明できる |
| 4日目 | エラー例を一つ作って直す | エラー文と直した箇所を残せる |
| 5日目 | 5つの追加ドリルから2問を解く | 公式資料で根拠を確認できる |


学習記録は、できた問題数だけでなく「どこで迷ったか」を残します。関数名が出なかった、引数の順番を迷った、NULLの結果を間違えた、条件の境目を見落とした、というように原因を短く分けます。翌日は同じ原因の問題を一つ選ぶと、何となく全体を読み直すより復習する場所がはっきりします。
仕事で使う人の追加確認
本番へつながるSQLでは、個人情報や機密データを練習用の外部サービスへ貼り付けません。列名や値を架空のものへ置き換え、件数を小さくします。更新や削除を含む場合は、組織の手順、検証環境、権限、バックアップ、レビューの方法を先に確認してください。
「今日は【項目】を【値】で試しました。予想は【結果】、実際は【結果】でした。違いの理由は【仕様・条件】で、次回は【境目・NULL・エラー例】を確認します。」
制約についてよくある質問
試験勉強と実行時に迷いやすい点をまとめます。



FAQはどの順で読みますか?



今困っている質問からで大丈夫です。



答えだけ覚えてよいですか?



小さなSQLとセットで確認すると、別の問題にも使いやすくなります。



仕様が変わる場合はありますか?



はい。受験時の試験範囲と利用中のOracle公式資料を確認します。
まとめ|5項目を同じデータで動かす
制約はエラーを増やすためではなく、間違ったデータが入る前に止めるための仕組みです。主キーは行を見分け、外部キーは表どうしのつながりを守ります。



次の30分は何をしますか?



記事のセットアップを作り、最初の例を値違いで3回動かします。



理解できたかはどう確かめますか?



コードを隠し、入力と結果を一言で説明します。



次の記事へ進む目安は何ですか?



5項目の違いを見ずに言えれば、次へ進んで大丈夫です。
この記事では5項目を別々の暗記にせず、同じ小さなデータで比べました。最初は構文を見ながら動かしてかまいません。次に値を一つ変え、最後にコードを隠して結果を説明します。この順番を繰り返すと、選択肢の見た目が変わっても、入力と戻り値から考えやすくなります。
仕事で使う場合は、公式資料の版、実行環境、権限、対象件数を追加で確認します。試験勉強では受験する試験の出題範囲を優先し、この記事の例題は理解を確かめる練習として使ってください。
- SQLite 3.51.0で5制約と違反例を実行。Oracle 26aiのREF制約や宣言方法は公式資料で確認。
- 公式資料と研究ページを2026年7月22日に確認
- 記事作成と構造確認にAIを使用し、構文・出典・保存結果は個別に確認


コメント