SQL SELECTの基本と本番DBを触る前の安全確認
「データベースやSQLって、なんだか難しそう…」「黒い画面に文字を打ち込むイメージがあって、とっつきにくい」。Web制作の現場で、そんな風に感じているクリエーターの方は少なくないかもしれません。サーバーサイドの知識が必要そうで、自分には少し縁遠い世界だと感じてしまいますよね。
でも、もし、難しい環境構築なしに、あなたのブラウザ上だけでSQLが実際に動くとしたら、試してみたいと思いませんか?
この記事は、SQLを初めて使うWebクリエーターのあなたに向けた「体験型入門キット」です。目的はたった一つ。「コピペするだけで動くコード」を通じて、SQLの楽しさと便利さを実感してもらうこと。この記事を読み終える頃には、データベースを操作する第一歩を踏み出し、SQLに対する苦手意識がワクワクに変わっているはずです。
確認日とこのページの使い方
確認日: 2026年5月19日。このページは、SQLの中でも「データを読む」ための SELECT を最初に整理する記事です。読むだけのSQLは比較的安全ですが、本番DB、phpMyAdmin、AIが作ったSQL、PHPからのPDO接続で扱う時は、接続先と対象データを先に分けます。
AIやCodexにSQLを相談する時は、DBホスト、ユーザー名、パスワード、本番の個人情報を貼らずに、テーブル構造、見たいデータ、条件、エラー文だけを共有します。更新や削除へ進む前に、まず SELECT と COUNT(*) で対象を確認してください。
このページで整理できること
SELECT * FROM テーブル名の基本形WHEREで対象行を絞る前の考え方COUNT(*)で更新・削除前の件数を確認する流れ- ブラウザ内の練習用SQLと、本番DBの違い
- AIが作ったSQLをそのまま実行しないための確認順
- ロリポップMySQLやPHP/PDOへ進む前に見るページ
最初に分けること
| 状況 | 最初に確認すること | 次に読むページ |
|---|---|---|
| SQLを初めて試す | 練習用データか、本番DBかを分けます。この記事のブラウザ実行環境は学習用です。 | WHERE句の基本 |
| PHPからDBを表示したい | PDO接続、DB接続情報の置き場所、表示時のエスケープを確認します。 | PDO接続の基本 |
| 更新や削除の前に対象を見たい | 同じ WHERE 条件で SELECT と COUNT(*) を先に実行します。 |
DELETEを安全に使う方法 |
| AIがSQLを書いてきた | 目的、対象テーブル、WHERE条件、想定件数、戻し方を整理してから実行判断します。 | AI SQL安全確認メモメーカー |
SQLを初めて触るならこの順番
SQLは一気に全部覚えるよりも、まず「読む」操作から始めるのが安全です。実務でも、更新や削除の前に SELECT で対象データを確認します。
SELECTで表の中身を見るWHEREで必要な行だけに絞るCOUNT()で対象件数を確認するSUM()やAVG()で集計するGROUP BYでカテゴリ別に見る
AIにSQLを書かせた場合も、いきなり実行せず、対象テーブル、WHERE、事前確認用の SELECT を整理してください。実行前の確認には AI SQL安全確認メモメーカー が使えます。
そもそもSQL、データベースって何?
身近なものに例えると…
まずは言葉の整理から始めましょう。専門用語を並べると難しくなるので、身近なものに例えてみます。
- データベース: 「Excelのファイル(ブック)」のようなもの。たくさんのデータを整理して保管しておく大きな箱です。
- テーブル: データベースの中にある、「Excelのシート」のようなもの。例えば「顧客リスト」「商品リスト」のように、特定のテーマに沿ったデータが行と列で整理されています。
- SQL (Structured Query Language): 「データベースと会話するための言語」です。私たちが「このシートから、この条件に合うデータを持ってきて」と日本語でExcelにお願いするように、SQLという決まった言葉でデータベースに命令を出します。
つまり、SQLを覚えるということは、データベースという巨大なデータ倉庫から、自由自在に情報を取り出すための「魔法の呪文」を手に入れるようなものなのです。
まずは準備運動!練習用のテーブルを作ろう
何事も、まずは形から。SQLを試すための練習用のテーブル(表)を用意しましょう。今回は「Users」という名前で、ユーザーのID、名前、年齢、都市の情報を格納するテーブルを作成します。
以下のコードが、そのテーブルを作成し、5人分のサンプルデータを入れるためのSQL文です。今はまだ「ふーん、こんな風に書くんだな」と眺めるだけで大丈夫です。
掲載コード:テーブル作成とデータ挿入
CREATE TABLE Users (
id INT PRIMARY KEY,
name VARCHAR(50),
age INT,
city VARCHAR(50)
);
INSERT INTO Users (id, name, age, city) VALUES
(1, '田中', 25, '東京'),
(2, '佐藤', 32, '大阪'),
(3, '鈴木', 20, '東京'),
(4, '高橋', 40, '福岡'),
(5, '渡辺', 28, '大阪');
基本の「き」!データを取り出すSELECT文
SQLで最も頻繁に使うのが、テーブルからデータを取り出すためのSELECT文です。これがすべての基本となります。
例えば、「Usersテーブルから、すべての列のデータを取得したい」場合、SQLでは以下のように書きます。
掲載コード:全データを取り出す
SELECT * FROM Users;
分解してみましょう。
SELECT *: 「すべての列(*は「すべて」を意味するワイルドカード)を選んでください」FROM Users: 「Usersという名前のテーブルから」
とてもシンプルですよね。「Usersテーブルから、全項目を選んで!」と命令しているわけです。
応用例:欲しいデータだけを狙い撃ち!
テーブルの全データではなく、「特定の条件に合うデータだけ」が欲しい場面は非常に多いです。そんな時に使うのがWHERE句です。
例えば、「東京に住んでいるユーザーだけ見たい」と思ったら、SELECT文にWHERE city = '東京'という条件を追加します。
掲載コード:条件を指定してデータを取り出す
SELECT * FROM Users WHERE city = '東京';
SELECT * FROM Users WHERE age >= 30;
このようにWHERE句の条件を変えるだけで、膨大なデータの中から必要な情報だけをピンポイントで抜き出せるのが、SQLの強力な点です。
更新や削除の前にもSELECTで確認する
SELECT はデータを読むだけの命令なので、練習にも本番確認にも向いています。たとえば削除したいデータがある場合でも、先に同じ条件で SELECT して、対象が本当に合っているかを見てから DELETE に進みます。
-- 先に対象を確認する
SELECT * FROM Users WHERE city = '大阪';
-- 件数も確認する
SELECT COUNT(*) FROM Users WHERE city = '大阪';
削除や更新を学ぶときは、DELETE文を安全に使う手順 と UPDATE文を安全に使う手順 もあわせて確認してください。
【本番】コピペで動く!HTMLだけでSQLを体験しよう
お待たせしました!いよいよ「動く」を体験する時間です。以下のコードは、それ自体が完全に動作するHTMLファイルです。このコードブロックのコピーボタンを押して、内容をすべてコピーしてください。
そして、お使いのテキストエディタ(VSCodeなど)に貼り付け、「sql-practice.html」のような名前で保存します。最後に、保存したHTMLファイルをGoogle Chromeなどのブラウザで開いてみてください。あなた専用のSQL実行環境が目の前に現れます!
左側のテキストエリアに、これまで紹介したSELECT文などを入力して「SQL実行」ボタンを押してみてください。右側に結果が表として表示されるはずです。色々書き換えて試してみましょう!
掲載コード:HTML単体で完全に動作するSQL実行環境
<!DOCTYPE html>
<html lang="ja">
<head>
<meta charset="UTF-8">
<title>SQL実行環境</title>
<style>
body { font-family: sans-serif; display: flex; gap: 20px; padding: 20px; background-color: #f9f9f9; }
.container { flex: 1; display: flex; flex-direction: column; background-color: #fff; padding: 20px; border-radius: 8px; box-shadow: 0 2px 5px rgba(0,0,0,0.1); }
textarea { height: 150px; border: 1px solid #ccc; border-radius: 4px; padding: 10px; font-family: monospace; font-size: 14px; margin-top: 10px;}
button { background-color: #007bff; color: white; border: none; padding: 10px 15px; border-radius: 4px; cursor: pointer; margin-top: 10px; font-size: 16px; }
button:hover { background-color: #0056b3; }
table { border-collapse: collapse; width: 100%; margin-top: 10px; }
th, td { border: 1px solid #ddd; padding: 8px; text-align: left; }
th { background-color: #f2f2f2; }
#error { color: #d9534f; font-weight: bold; margin-top: 10px; }
</style>
<script src="https://cdnjs.cloudflare.com/ajax/libs/sql.js/1.10.3/sql-wasm.js"></script>
</head>
<body>
<div class="container">
<h3>SQL入力</h3>
<textarea id="sql-input">SELECT * FROM Users;</textarea>
<button onclick="executeSql()">SQL実行</button>
<div id="error"></div>
</div>
<div class="container">
<h3>実行結果</h3>
<div id="result-table"></div>
</div>
<script>
let db;
async function initDb() {
try {
const config = { locateFile: filename => `https://cdnjs.cloudflare.com/ajax/libs/sql.js/1.10.3/${filename}` };
const SQL = await initSqlJs(config);
db = new SQL.Database();
const initialSql = `
CREATE TABLE Users (id INT, name VARCHAR(50), age INT, city VARCHAR(50));
INSERT INTO Users (id, name, age, city) VALUES
(1, '田中', 25, '東京'), (2, '佐藤', 32, '大阪'), (3, '鈴木', 20, '東京'),
(4, '高橋', 40, '福岡'), (5, '渡辺', 28, '大阪');
`;
db.run(initialSql);
executeSql();
} catch (e) { document.getElementById('error').textContent = "DB初期化失敗: " + e.message; }
}
function executeSql() {
const sqlInput = document.getElementById('sql-input').value;
const errorEl = document.getElementById('error');
const resultEl = document.getElementById('result-table');
errorEl.textContent = '';
resultEl.innerHTML = '';
try {
const results = db.exec(sqlInput);
if (results.length > 0) { resultEl.appendChild(createTable(results[0])); }
} catch (e) { errorEl.textContent = "エラー: " + e.message; }
}
function createTable(result) {
const table = document.createElement('table');
const thead = document.createElement('thead');
const tbody = document.createElement('tbody');
const headerRow = document.createElement('tr');
result.columns.forEach(col => {
const th = document.createElement('th');
th.textContent = col;
headerRow.appendChild(th);
});
thead.appendChild(headerRow);
result.values.forEach(row => {
const tr = document.createElement('tr');
row.forEach(cell => {
const td = document.createElement('td');
td.textContent = cell;
tr.appendChild(td);
});
tbody.appendChild(tr);
});
table.appendChild(thead);
table.appendChild(tbody);
return table;
}
initDb();
</script>
</body>
</html>
知っておきたい!SQLを使う上での注意点
SQLは非常に強力ですが、Webアプリケーションで使う際には注意すべき点があります。その代表がSQLインジェクションというセキュリティ攻撃です。
これは、Webサイトの入力フォームなどを通じて悪意のあるSQL文を注入され、データベースを不正に操作されたり、情報を盗まれたりする攻撃のことです。例えば、ユーザー名を入れるべき箇所にSQL文の一部を紛れ込ませるような手口があります。
これを防ぐための基本は、「ユーザーからの入力をSQL文に直接結合しない」ことです。実際の開発では、ユーザーが入力した値を安全にSQL文に埋め込むための「プレースホルダ」という仕組みを使います。これは、関連するコードとして非常に重要な考え方なので、ぜひ頭の片隅に置いておいてください。
まとめ:次の一歩へ
「コピペで動く」体験を通して、SQLが思ったより身近に感じられたのではないでしょうか。黒い画面を叩かなくても、正しい「言葉」で命令すれば、データがきちんと応えてくれる。その感覚を掴めたなら、今日の目的は達成です。
今回ご紹介したのはデータの取得(SELECT)だけでしたが、他にもデータを更新するUPDATE、削除するDELETEなど、様々な命令があります。まずは今回使ったHTMLの実行環境で、読むだけのSQLを何度も試してみてください。
本番DBを触る前に止まる場所
| 止まる場所 | 確認すること | 使えるページ |
|---|---|---|
| 接続先 | ローカルDBか本番DBか、ロリポップのMySQLか、テスト用データかを先に分けます。 | MySQLが必要か判断する方法 |
| 秘密情報 | DBホスト、ユーザー名、パスワードをGitHub、公開ファイル、AI相談文へ貼らないようにします。 | DB設定を安全に分ける方法 |
| 対象件数 | 更新・削除の前に、同じ条件で SELECT と COUNT(*) を確認します。 |
COUNTで件数を確認する方法 |
| AIのSQL | AIが出したSQLは、目的、対象テーブル、WHERE、戻し方を整理してから実行します。 | AIコード安全入口 |
SELECT文をAIやCodexに相談する時のメモ
SQLを相談する時は、本番DBの接続情報や個人情報を貼らず、見たいデータと条件だけを整理します。
SQLのSELECT文について相談します。
目的: 必要なデータだけを安全に確認したい
環境: 練習用 / ローカルDB / ロリポップ本番DB / 不明
対象テーブル: 例 users / posts / orders
見たい列: 例 id, name, created_at
条件: 例 city = '東京' / created_at >= '2026-05-01'
困っている症状: 結果が出ない / 件数が多すぎる / エラーになる / PHPから表示できない
確認したこと:
- DB接続情報は伏せています
- 本番データや個人情報は貼っていません
- 更新や削除の前にSELECTとCOUNTで対象を確認したいです
- WHERE条件が広すぎないか見てほしいです
安全に確認する順番を教えてください。
次に確認したいSQLページ
SELECTの基本が分かったら、次は条件、並び替え、件数確認、集計へ進むと実務で使いやすくなります。