こちらの記事では、データベースを操作する際に使うSQLとクエリについて解説します。
クエリとSQLについて
データベースを操作する上で、クエリとSQL(Structure Query Language)という二つの言葉があります。クエリとSQLの違いは簡単に説明すると以下の通りです。
用語 | 説明 |
---|---|
クエリ | データベースに指示を出す命令文 |
SQL | リレーショナルデータベースを操作するための言語 |
例えば「Nice to meet you.」は英語で書かれた英文だというように、SELECT * FROM … ;
はSQLで書かれたクエリというイメージです。
クエリ(Query)とは「問い合わせる」「照会する」という意味を持ち、データベース言語によって書かれたクエリを通してDBMS(データベース管理システム)に対してデータの抽出や更新などの処理要求を問い合わせ=命令します。データベースの中でも特にリレーショナルデータベースを操作するために使われるデータベース言語がSQLです。SQLで書かれた命令文をSQL文と呼びます。SQLでクエリ(SQL文)を書いてRDBMSに対してデータの操作を要求することができます。
SQLを使ってDBを操作する方法
SQLを用いてデータベースを操作する命令を送る方法は二つあります。
-
対話型
ユーザーがコマンドラインなどでSQL文を打ち込んで命令を送ることでデータベースを直接操作する方法は対話型と呼ばれています。SQLは問い合わせ言語という名前の通り、データベースに対して問い合わせを行う=一方的に命令を送るという特徴があります。基本的には一文ごとに結果が表示され、次の処理を行うという形式です。単純な操作であればこのようにデータベースと対話をする形で行います。
-
埋込み型
一方で、連続した操作や複雑な処理を行いたい場合は埋込み型という方法があります。PythonやJavaなど他のプログラミング言語で記述されたプログラムに直接SQL文を埋め込み、動的に操作します。プログラムにSQL文を埋め込むことで、データベース操作をシステムの一部に組み込むことができます。
SQLとDBMS
SQLは ANSI(米国規格協会) や ISO(国際標準化機構) といった標準化団体によって標準規格が定められており、どのDBMS(データベース管理システム)においても基本的にはほぼ同じように使用できます。ただしDBMSの製品によって独自のSQLも存在するため、同様のSQL文を記述していても細かい部分で挙動が変わることがあります。異なるDBMSにデータベースを移行する際も注意が必要です。
またif文の条件分岐やfor文のループといった制御構文とSQLを組み合わせた一連の操作を一つのプログラムとして一つにまとめて保存できる「ストアドプロシージャ」という機能のあるDBMSもあります。
SQLの種類について
SQLはデータベースの操作はもちろん、データベースの作成・構築や機能の制御も行うことができます。SQLは用途ごとに大きく分けて以下の三種類から構成されています。
- DDL(データ定義言語)
- DML(データ操作言語)
- DCL(データ制御言語)
DDL(データ定義言語)
DDL(Data Definition Language)は、主にデータベースの定義や作成に関わる言語群です。代表的なDDLには以下のようなものがあります。
言語 | 説明 |
---|---|
CREATE | 新規データベースやテーブルの作成 |
DROP | データベースやテーブルの削除 |
ALTER | データベースやテーブルの変更 |
JOIN | テーブル同士の結合 |
TRUNCATE | テーブルのデータを削除 |
DML(データ操作言語)
DML(Data Manipulation Language)は、データの取得・登録・更新・削除といったデータの管理・操作を行う言語群です。代表的なDDLには以下のようなものがあります。
言語 | 説明 |
---|---|
SELECT | データの取得 |
UPDATE | データの更新 |
DELETE | データの削除 |
INSERT | データの挿入 |
DCL(データ制御言語)
DCL(Data Control Language)は、トランザクション処理やデータベースへのアクセスを制御する言語群です。代表的なDCLには以下のようなものがあります。
言語 | 説明 |
---|---|
BEGIN | トランザクションの開始 |
COMMIT | 実行した処理の確定 |
ROLLBACK | データの戻し |
GRANT | ユーザーへの権限付与 |
REVOKE | ユーザーの権限剥奪 |
実行してみよう
ここからは実際にSQL文を実行してみましょう。SQL文を実行するための方法は以下の二つがあります。
SQLを実行できるWebサービスを使う
ブラウザ上でSQLを実行できるサービスを利用することで手軽にSQLの練習ができます。環境構築の必要がないため学習中などにSQL文を試したい時に便利です。
- paiza.io https://paiza.io/ja/ ブラウザ上でコードを書いてすぐに実行することができます。様々な言語に対応しており、プログラム学習において非常に便利なサイトです。
- DB Fiddle https://www.db-fiddle.com/ こちらもブラウザ上でSQL文を書いてその場で実行できるサイトです。保存してURLをシェアできるためクエリを共有したい時に便利です。
- Envader https://envader.plus/course/2 インフラ学習サイト「Envader」でもハンズオン形式でSQLを用いたデータベース操作を学習することができます。
ローカル環境にデータベースを作成する
無償で提供されているオープンソースのDBMSをインストールすることで、ローカル環境にデータベースを作成することができます。インストールするDBMSは、MySQLがおすすめです。MySQLは簡単にインストールすることができ、操作が比較的簡単で初心者に最適のDBMEです。世界で最も利用されているオープンソースのDBMSであるため、解説記事やコンテンツが豊富で困った時もネット上で情報を調べやすくなっています。
※MySQL公式サイトはこちら
実際に書いてみる
SQLで書いたクエリをデータベースに送り、操作してみましょう。今回の解説では、以下のようなデータを作成・操作していきます。
ここでは数あるクエリのうち、データベース操作の基本となるCRUDについて解説します。CRUDとは、Create(作成)、Read(読み出し)、Update(更新)、Delete(削除)の頭文字を取った用語です。
処理 | 内容 | SQL |
---|---|---|
Create | 作成・登録 | CREATE, INSERT |
Read | 読み出し | SELECT |
Update | 更新 | UPDATE |
Delete | 削除 | DELETE |
CREATE テーブル作成
CREATE TABLE文を使うことでデータベースに新たなテーブルを定義・作成することができます。テーブルを作成する際は必要なカラムおよびカラムのデータ型を定義します。データ型とは、保存するデータの形式のことでよく使われるものは以下の通りです。
データ型 | 説明 |
---|---|
INT型 | 整数を扱うデータ型 |
DOUBLE型 | 浮動小数点を扱うデータ型 |
TEXT型 | 文章用の長い文字列を扱うデータ型 |
CHAR(n)型 | 固定長の文字列を扱うデータ型。nは指定桁数。 |
VARCHAR(n)型 | 可変長の文字列を扱うデータ型。 nは最大桁数。 |
DATETIME型 | 日付と時刻を扱うデータ型 |
またデータ型だけではなくデータの状態などより詳細な設定も行います。
UNIQUE
UNIQUEを設定することで同じ値を格納できなくなります。
NULL
,NOT NULL
NULLを設定すると空のデータを許容し、NOT NULLを設定すると空のデータを許容せず必ず値を格納する必要があります。どちらも記述しない場合はデフォルトとしてNULLが設定されます。
PRIMARY KEY
テーブルの中でレコードを一意に識別できるカラムを設定する必要があり、そのカラムに対してPRIMARY KEYを設定します。PRIMARY KEYが設定されたカラムにはUNIQUEとNOT NULLが自動で設定されます。
AUTO_INCREMENT
テーブルにデータを追加する際、AUTO_INCREMENTが設定されたカラムには格納されている最大値に1を追加したものを自動が自動で格納されます。
以上を踏まえて、テーブルを作成する際の基本的な構文は次の通りです。SQL文では最後に必ず;
(セミコロン)を付けて実行します。
CREATE TABLE [テーブル名] ([カラム名] [データ型] [詳細設定]...);
実際に書いてみましょう。
CREATE TABLE students(
id int PRIMARY KEY,
name VARCHAR(20) NOT NULL,
club VARCHAR(30)
);
このようなテーブルが作成されます。定義を確認してみましょう。DESC [テーブル名]
で確認できます。
DESC students;
-- 実行結果
+-------+-------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-------+-------------+------+-----+---------+-------+
| id | int | NO | PRI | NULL | |
| name | varchar(20) | NO | | NULL | |
| club | varchar(30) | YES | | NULL | |
+-------+-------------+------+-----+---------+-------+
INSERT データの追加
テーブルにデータを追加する際は、以下の構文を使用します。
INSERT INTO [テーブル名] (列1,[列2…) VALUES(値1,値2…);
実際に書いてみましょう。
INSERT INTO students(id, name, club) VALUES(1, '田中', 'サッカー部');
INSERT INTO students(id, name, club) VALUES(2, '伊藤', '野球部');
INSERT INTO students(id, name, club) VALUES(3, '山田', '吹奏楽部');
INSERT INTO students(id, name, club) VALUES(4, '鈴木', 'バレー部');
SELECT データ取得
データを取得する際はSELECT文を使用します。基本的な構文は以下の通りです。SELECT文は基本の構文を元に、条件を設定したり並び替えたりと様々な形式でデータを取得することもできます。
SELECT [取得する列名] FROM [テーブル名];
まずは上記で作成したテーブルの情報を取得してみます。全ての列名を取得する場合は*
(アスタリスク)を使用します。
SELECT * FROM students;
-- 実行結果
+----+------+------------+
| id | name | club |
+----+------+------------+
| 1 | 田中 | サッカー部 |
| 2 | 伊藤 | 野球部 |
| 3 | 山田 | 吹奏楽部 |
| 4 | 鈴木 | バレー部 |
+----+------+------------+
特定の列だけ取得したい場合は以下のように記述します。,
(カンマ)で区切ることで複数の列を取得できます。ここではidと名前を取得してみます。
SELECT id, name FROM students;
-- 実行結果
+----+------+
| id | name |
+----+------+
| 1 | 田中 |
| 2 | 伊藤 |
| 3 | 山田 |
| 4 | 鈴木 |
+----+------+
*
(アスタリスク)はテーブルの全ての情報を確認することができて便利ですが、実際に規模の大きなデータベースになると取得に時間がかかることがあるため必要に応じた列名を指定したり条件式を付与したりして適切にデータを取得しましょう。
UPDATE データ更新
データの更新を行う際は、UPDATE文を用います。
UPDATE [テーブル名] SET [カラム名] = [値1] WHERE [条件式];
WHERE
を用いた条件の指定はWHERE [カラム名] = [指定の値]
というように記述します。条件を指定しなければ全てのレコードが更新されてしまいます。
UPDATE students SET club='美術部' WHERE name='山田';
SELECT文で更新したデータを確認します。WHERE
を用いて確認したいレコードのみ取得してみます。
SELECT * FROM students WHERE name = '山田';
-- 実行結果
+----+------+--------+
| id | name | club |
+----+------+--------+
| 3 | 山田 | 美術部 |
+----+------+--------+
DELETE データ削除
データを削除する際は、DELETE文を用います。
DELETE FROM [テーブル名] WHERE [条件式];
WHERE
で条件を指定しなければテーブルの全てのデータが削除されてしまいます。DELETE文を実行する前にSELECT文で削除したいデータを確認すしましょう。DELETE文はデータを削除するコマンドですので、安全にデータを操作するために細心の注意を払う必要があります。
-- SELECT文で削除したいデータに問題がないか確認する
SELECT * FROM students WHERE name = '伊藤';
-- 実行結果
+----+------+--------+
| id | name | club |
+----+------+--------+
| 2 | 伊藤 | 野球部 |
+----+------+--------+
-- DELETE文でデータを削除
DELETE FROM students WHERE name = '伊藤';
-- SELECT文でテーブル情報を取得
SELECT * FROM students;
-- 実行結果
+----+------+------------+
| id | name | club |
+----+------+------------+
| 1 | 田中 | サッカー部 |
| 3 | 山田 | 美術部 |
| 4 | 鈴木 | バレー部 |
+----+------+------------+
まとめ
今回はクエリとSQLの違い、そしてSQLの書き方について解説しました。SQLは奥が深く、様々なSQLを組み合わせることで様々な処理ができます。当記事で紹介したSQL文はデータベース操作の基礎となるので確実に押さえましょう。
【番外編】USBも知らなかった私が独学でプログラミングを勉強してGAFAに入社するまでの話
プログラミング塾に半年通えば、一人前になれると思っているあなた。それ、勘違いですよ。「なぜ間違いなの?」「正しい勉強法とは何なの?」ITを学び始める全ての人に知って欲しい。そう思って書きました。是非読んでみてください。
「フリーランスエンジニア」
近年やっと世間に浸透した言葉だ。ひと昔まえ、終身雇用は当たり前で、大企業に就職することは一種のステータスだった。しかし、そんな時代も終わり「優秀な人材は転職する」ことが当たり前の時代となる。フリーランスエンジニアに高価値が付く現在、ネットを見ると「未経験でも年収400万以上」などと書いてある。これに釣られて、多くの人がフリーランスになろうとITの世界に入ってきている。私もその中の1人だ。数年前、USBも知らない状態からITの世界に没入し、そこから約2年間、毎日勉学を行なった。他人の何十倍も努力した。そして、企業研修やIT塾で数多くの受講生の指導経験も得た。そこで私は、伸びるエンジニアとそうでないエンジニアをたくさん見てきた。そして、稼げるエンジニア、稼げないエンジニアを見てきた。
「成功する人とそうでない人の違いは何か?」
私が出した答えは、「量産型エンジニアか否か」である。今のエンジニア市場には、量産型エンジニアが溢れている!!ここでの量産型エンジニアの定義は以下の通りである。
比較的簡単に学習可能なWebフレームワーク(WordPress, Rails)やPython等の知識はあるが、ITの基本概念を理解していないため、単調な作業しかこなすことができないエンジニアのこと。
多くの人がフリーランスエンジニアを目指す時代に中途半端な知識や技術力でこの世界に飛び込むと返って過酷な労働条件で働くことになる。そこで、エンジニアを目指すあなたがどう学習していくべきかを私の経験を交えて書こうと思った。続きはこちらから、、、、
エンベーダー編集部
エンベーダーは、ITスクールRareTECHのインフラ学習教材として誕生しました。 「遊びながらインフラエンジニアへ」をコンセプトに、インフラへの学習ハードルを下げるツールとして運営されています。
関連記事
2020.02.25
完全未経験からエンジニアを目指す爆速勉強法
USBも知らなかった私が独学でプログラミングを勉強してGAFAに入社するまでの話
- キャリア・学習法
- エンジニア
2023.03.27
データベースエンジニア向けの難易度別オススメ資格
今回はデータベース資格について解説します。資格を取ろうと考えている方は、ぜひ参考にしてくださいね。
- データベース
- キャリア・学習法
2024.03.14
Redisとは?
Redisについて、初心者でもわかりやすいように解説しました。
- データベース
2022.12.28
DB分野におけるER図の書き方やツールについて
この記事では10種類ほどあるER図の表記法の中から代表的なIEについて解説します。
- データベース