なんでこの記事を書いたの?
プログラミングを勉強し始めたはいいけどSQLにまで手が回っていない初学者の方、意外と多いんじゃないでしょうか?SQLはほぼ全ての現場で使われているのにも関わらず、スクール等ではあまり教えられている印象がありません。
タイトルの通り、この記事ではそんな初学者の方に向けて面倒な環境構築を一切なしでSQLの基礎をさらっと解説していきます。具体的にはブラウザ上で簡単にSQLを実行できるsqlfiddleというサービスを使用します。
この記事の対象読者
- SQLの学習が後回しになっている
- SQLが全くわからない
- 基本だけさらっと抑えたい
基本的な用語解説
SQLの解説をメインにしたいのでDB関連の基礎的な用語は最初に軽くまとめます。もしわからなかったら別の記事やサイトを参照してください。(投げやり)
-
SQL
- DBを操作するための言語
-
DB(データベース)
- データの集まり、エクセルでいうファイル
-
テーブル
-
データが実際に入ってる二次元表、エクセルでいうシート
-
一つのDBの中に複数のテーブルが入ってる。
-
-
レコード
- 二次元表の行、一件分のデータを表す。(画像の赤枠)
-
カラム
- 二次元表の縦列(画像の青枠)
学習の途中で難しく感じてしまうこともあるかもしれませんが、結局はこの単純な二次元表のデータをいじくり回してるだけなのです。分からなくなったら常にこの二次元表を頭に浮かべ、瞑想をしましょう。
SQLの基礎
ここからは先ほど紹介したsqlfiddleを使って実際に手を動かしながら学んでいきます。できるだけコピペをせずに自分で手を動かしてみてください!
テーブルの作成
さて、まずはテーブル(二次元表)から作っていきましょう。先ほどDBが複数のテーブルを持つといったように、本当はテーブルが属するDBから作らなければいけないのですが、sqlfiddleではすでにデフォルトで作られたDBの中にいます。ということで最初はテーブルの作成から入ります。
CREATE TABLE文
CREATE TABLE <テーブル名> (カラム名 カラムの型,・・・);
CREATE TABLE users (id INT, name VARCHAR(10), age INT);
型はどのDBMS(MySQLやOracleなどのDBを扱うシステム)を使うかによって異なるので、お使いのDBMSのマニュアル等を参考にしてください(今回はMySQL)。
例にあるINT, VARCHARはそれぞれ整数、可変長文字列の型です。全部合わせると
「usersという名前のテーブルを作ってね。カラムは数値型のidとage、可変長文字列型のnameだよ。」となります。
ということでsqlfiddleの画面左の入力欄に入力、ページ下部の「Build Schema」を押してテーブルを作成しましょう。
TypoしていなければSchema Readyと表示されて正常にテーブルが作成されます。
次は作ったテーブルにさっそくデータ(レコード)を入れていきましょう!
レコードの作成
INSERT文
INSERT INTO <テーブル名> (カラム1, カラム2 ・・・) VALUES(カラム1に入れる値, カラム2に入れる値・・・);
INSERT INTO users (id, name) VALUES(1, "安倍晋三");
データの作成にはINSERT文を使います。INSERTという名前の通り"挿入する"という表現のほうが一般的ですね。
今回の例では
「usersテーブルにidが1, nameが安倍晋三のレコードを作ってね!」 になります。
ちなみに全てのカラムに値を入れる場合は以下のようにカラム名の指定を省略できます。
INSERT INTO users VALUES (2, "ドナルド・トランプ", 74);
INSERT INTO users VALUES (3, "習近平", 67);
さっそく左の入力欄に上の3つのINSERT文を追加して再度Build Schemaを押してみましょう。(さっきのCREATE TABLE文も消さないでね!)
こちらも問題なければSchema Readyと表示されると思います。でもせっかく作ったデータが見れませんね。次はデータを取得してみましょう。
データの取得
SELECT文
さあ、ここからが本番です。SELECT文を使いこなせば自分の欲しいデータを自由自在に取り出すことができます。
SELECT カラム1, カラム2 ・・・ FROM <テーブル名>;
SELECT id, name FROM users;
usersテーブルからidとnameを取り出してねという指示です。これは画面右の入力欄に書くので注意!
「RUN SQL」を押してページ下部にデータが表示されれば成功です!
ちなみに全てのカラムを見たいときはいちいちカラム名を指定せずに
SELECT * FROM users;
のように書けば良いです。この*はワイルドカードと呼ばれます。
(null)? なんか入れた覚えのないデータが入ってますね。そういえばidが1のレコードのageカラムの値は入力を忘れていたような気がします。
NULLってなんぞ?
SQLではデータが存在しない部分は何もないことを表すNULLという値になります。数値の0とか文字列の空文字とか、そういうことではなくデータそのものが存在しないという意味です。
この値の扱いはなかなか厄介なのでとりあえずこういうものがあるんだな、程度で大丈夫です。とりあえずNULLが入っているとなんとなく気持ち悪いのでちゃんとデータを入れましょう。
データの更新
UPDATE文
すでに作ったレコードのカラムを更新するにはUPDATE文を使います。
UPDATE <テーブル名> SET カラム名1 = カラム1に入れる値, カラム名2 = カラム2に入れる値2 ・・・ WHERE 条件式;
UPDATE users SET age = 65 WHERE id = 1;
WHEREの後に条件式を指定することでその条件にマッチしたレコードの値を全て更新します。
ここではidが1のレコード1件だけを更新の対象にしています。
usersテーブルのidが1のレコードのageカラムの値を65にしてねという指示です。
これを左の入力欄に追加してBuild Schema、再び右の入力欄で**SELECT * FROM users;**を実行してみましょう。
NULLになっていた箇所に無事に値が入りましたね!やった!
値がスッキリと全部入ったところでSELECT文についてもう少し掘り下げましょう!
高度なSELECT文
さて、先ほどは値をそのまま表示するだけのシンプルなSELECT文を使いました。今度は"句"を組み合わせることでもう少し高度な操作を行ってみましょう。実はもう既にこの句を使っています。
WHERE句 - 条件を絞る
先ほどのUPDATEで出てきた句ですね!WHERE句の後に条件式を書くことで、その条件に合ったレコードのみを取得することができます。条件式の中では色々な演算子が使えます。
SELECT * FROM users WHERE age >= 70;
このように書けばageが70以上のレコードのみを取得することができます。
UPDATE句と組み合わせればその条件を満たす全てのレコードの値を一括で更新できるので非常に強力です。
ORDER BY句 - データをソートする
データを何らかの基準でソートすることもできます。例えば年齢の昇順でソートをするには
SELECT * FROM users ORDER BY age ASC;
ように書きます。降順の場合はASC→DESC。
ちなみに句は組み合わせることも可能なので
SELECT * FROM users WHERE age <= 70 ORDER BY age DESC;
のように指定すれば
年齢が70以下のレコードを年齢の降順で表示する命令になります。簡単ですね!
※SQLには評価の順序というものがあります。WHERE句のほうがORDER BY句より先に評価されるのでこの順番を逆にするとエラーになります。
データの削除
DELETE文
さて、色々と学ぶことができたので最後にデータを削除しましょう。
データの削除にはDELETE文を使います。
DELETE FROM users WHERE 条件式;
WHERE句で削除するレコードの条件を指定することもできますが、今回は全て消したいので何もつけません。
DELETE FROM users;
入力欄の左にこれを入力してから、右の入力欄で全件表示(SELECT * FROM users;)のクエリを実行してみましょう。
何も表示されませんね、
世界が平和になりました!
参考
【用語解説】わかりにくいSQLの句・文・式の違い
MySQL 5.6 リファレンスマニュアル :: 11 データ型 - MySQL