SQL文の基本的な使い方まとめについて紹介します。
【SQL文とは】よく使う構文一覧
| 文 | 機能 | 書式 |
|---|---|---|
| SELECT文 | カラムを取得 | SELECT [カラム名] FROM [テーブル名] |
| INSERT文 | カラムを追加 | INSERT INTO [テーブル名] (カラム名1,カラム名2,‥) VALUES(要素Aに入れるデータ,要素Bに入れるデータ) |
| UPDATE文 | カラムを更新・追加 | UPDATE [テーブル名] SET [更新処理] |
| DELETE文 | カラムを削除 | DELETE FROM [テーブル名] |
| FROM文 | テーブルを指定 | FROM [テーブル名] |
| WEHRE文 | テーブルデータの検索条件を指定 | WHERE [検索条件] |
| ORDER BY | ソート | ORDER BY [ソートする要素名] [昇順・降順の指定] |
| BETWEEN | WHERE文の検索条件で、「A~Bの間」を指定 | WHERE [カラム名] BETWEEN [最小値] AND [最大値] |
| LIKE | WHERE文の検索条件で「ワイルドカード」を指定 | WHERE [カラム名] LIKE [ワイルドカード] |
| GROUP BY | グループ化を行うために使用 | GROUP BY [グループ化する要素名] |
| HAVING | ー | ー |
| DISTINCT | ー | ー |
| AND,OR,NOT | 論理演算子 | ー |
| INNER JOIN | テーブル同士の内部結合 | SELECT [カラム名1, カラム名2, …] FROM [テーブル名1] INNER JOIN [テーブル名2] ON [結合の条件] |
| INNER JOIN | テーブル同士の内部結合 | SELECT [カラム名1, カラム名2, …] FROM [テーブル名1] INNER JOIN [テーブル名2] ON [結合の条件] |
| UNION | SELECT文の結果を和演算で結合(1つの表にする) | SELECT … UNION SELECT … |
| GRANT文 | 指定したユーザに表に関する特定の権限を付与 | GRANT 権限名 ON オブジェクト名 TO { ユーザ名 | ロール名 | PUBLIC } |
情報処理安全確保支援士では、GRANT文の問題がよく出題されている。
| – | ツール |
|---|---|
| 実行環境 | rextester.com |
【基本構文】SELECT文・FROM句とDDL、DML、DCL
SELECT文の基本構文は以下のとおり。
| – | SELECT文の基本構文 |
|---|---|
| SELECT [カラム名] | 検索するカラム名を指定(全列検索の場合は*) |
| FROM [テーブル名] | 検索するカラムを含むテーブル名を指定 |
| WHERE [検索条件] | 検索条件を指定 |
| GROUP BY [カラム名] | データのグループ化を行うためのカラム名を指定 |
| ORDER BY [カラム名] | データの並べ替えを行うためのカラム名を指定 |
SELECT文のFROM句で複数表を指定し、WHERE句で結合するための条件を指定します。
SELECT文およびFROM句の使用は必須、そのほかはオプション(省略可能)です。
SQLは、DDL(Data Definition Language:データ定義言語)、DML(Data Manipulation Language:データ操作言語)、DCL(Data Control Language:データ制御言語)から構成されています。
| – | 分類されるコマンド |
|---|---|
| DML | SELECT(検索)、INSERT(挿入)、UPDATE(更新)、DELETE(削除)など |
| DDL | CREATE(作成)、ALTER(変更)、DROP(削除)など |
| DCL | COMMIT(確定)、ROLLBACK(取り消し)など |
【SELECT、INSERT、FROM】テーブルの作成、データの追加、要素の抽出
SELECT、INSERT、FROMでテーブルの作成、データの追加、要素の抽出をしてみます。
/* テーブルを作成 */
create table student(id int, class varchar(20), point int, rankId int);
/* テーブルにデータを追加 */
insert into student values(1, 'Archer', 90, 1);
insert into student values(2, 'Lancer', 75,2);
insert into student values(3, 'Saber', 60, 1);
insert into student values(4, 'Caster', 75, 2);
insert into student values(5, 'Asassin', 45, 3);
insert into student values(6, 'Berserk', 55, 3);
insert into student values(7, 'Ruler', 70, 1);
/* テーブルから全てのカラムを抽出 */
SELECT * FROM student;
SELECT * FROM rank;
/* 抽出結果
id class point rankId
1 1 Archer 90 1
2 2 Lancer 75 2
3 3 Saber 60 1
4 4 Caster 75 2
5 5 Asassin 45 3
6 6 Berserker 55 3
7 7 Ruler 70 1
*/
/* テーブルstudentからカラム(class)を抽出 */
SELECT class FROM student;
/* 実行結果
class
1 Archer
2 Lancer
3 Saber
4 Caster
5 Asassin
6 Berserker
7 Ruler
*/
/* テーブルstudentから複数のカラム(class、point)を抽出 */
SELECT class,point FROM student;
/*
class point
1 Archer 90
2 Lancer 75
3 Saber 60
4 Caster 75
5 Asassin 45
6 Berserker 55
7 Ruler 70
*/
内部結合は、それぞれのテーブルの指定したカラムの値が一致するものだけを結合します。
例えば「テーブル1からカラム1、カラム2を抽出し、結合の条件に従ってテーブル2から抽出したカラムとくっつけて、1つのテーブルにする」ことができます。
内部結合の場合、ベースとなるテーブルから、条件にマッチするレコードがないものは削除されます。
基本構文
SELECT [カラム名1, カラム名2, ...] FROM [テーブル名1] INNER JOIN [テーブル名2] ON [結合の条件]
サンプルコード
/* テーブルを作成する */
create table student(id int, class varchar(20), point int, rankId int);
create table rank(rankId int, rankName varchar(20));
/* テーブルにデータを追加する */
insert into student values(1, 'Archer', 90, 1);
insert into student values(2, 'Lancer', 75,2);
insert into student values(3, 'Saber', 60, 1);
insert into student values(4, 'Caster', 75, 2);
insert into student values(5, 'Asassin', 45, 3);
insert into student values(6, 'Berserk', 55, 3);
insert into student values(7, 'Ruler', 70, 1);
/* テーブルにデータを追加する */
insert into rank values(1, 'RankA');
insert into rank values(2, 'RankB');
insert into rank values(3, 'RankC');
/* テーブルから全てのデータを抽出 */
SELECT * FROM student;
SELECT * FROM rank;
/* 抽出結果
id class point rankId
1 1 Archer 90 1
2 2 Lancer 75 2
3 3 Saber 60 1
4 4 Caster 75 2
5 5 Asassin 45 3
6 6 Berserk 55 3
7 7 Ruler 70 1
rankId rankName
1 1 RankA
2 2 RankB
3 3 RankC
*/
/* テーブルstudentからclass要素を抽出 */
SELECT * FROM student
INNER JOIN rank ON student.rankId = rank.rankId;
/* 内部結合した結果
id class point rankId rankId rankName
1 1 Archer 90 1 1 RankA
2 2 Lancer 75 2 2 RankB
3 3 Saber 60 1 1 RankA
4 4 Caster 75 2 2 RankB
5 5 Asassin 45 3 3 RankC
6 6 Berserk 55 3 3 RankC
7 7 Ruler 70 1 1 RankA
*/
【LIKE、ORDER BY、HAVING】昇順・降順ソート
LIKE
「LIKE」はワイルドカード文字を使用して複雑な検索を行うことができます。
次のように「WHERE句」の後ろに、条件の一つとして記述します。
SELECT [カラム名] FROM [テーブル名] WHERE [カラム名] LIKE [ワイルドカード文字];
ワイルドカード文字とは、曖昧検索を指示する記号で、二種類の文字(「% 」と「 _ 」)があります。
| パラメータ | 概要 |
|---|---|
| % | 0文字以上の任意の文字列 |
| _ | 任意の1文字 |
HAVING
HAVIINGは「抽出条件を指定」できます。
| 使用例 | 概要 | 適用例 |
|---|---|---|
| ①’_西%’ | 「任意の1文字」+「西」+「0文字以上の任意の文字列」を表す | 「川西市」「山西健二」など |
| ②’%西%’ | 「0文字以上の任意の文字列」+「西」+「0文字以上の任意の文字列」を表す | 「兵庫県西宮市」「山西健二」など |
※”_西%”だと、「川西市」は抽出されますが、「兵庫県西宮市」は抽出されません。
ORDER BY
ORDER BYは指定したカラム列の値で昇順・降順ソートができます。
SELECT [カラム名] FROM [テーブル名] ORDER BY [ソートする要素名] [昇順・降順の指定];
| パラメータ | 概要 |
|---|---|
| [昇順・降順の指定] | ASC・・・昇順(何も指定しないときのデフォルト)、DESC・・・降順 |
/* テーブルを作成する */
create table student(id int, class varchar(20), point int, rankId int);
create table rank(rankId int, rankName varchar(20));
/* テーブルにデータを追加する */
insert into student values(1, 'Archer', 90, 1);
insert into student values(2, 'Lancer', 75,2);
insert into student values(3, 'Saber', 60, 1);
insert into student values(4, 'Caster', 75, 2);
insert into student values(5, 'Asassin', 45, 3);
insert into student values(6, 'Berserk', 55, 3);
insert into student values(7, 'Ruler', 70, 1);
/* テーブルにデータを追加する */
insert into rank values(1, 'RankA');
insert into rank values(2, 'RankB');
insert into rank values(3, 'RankC');
/* テーブルから全てのデータを抽出 */
SELECT * FROM student;
SELECT * FROM rank;
/* 抽出結果
id class point rankId
1 1 Archer 90 1
2 2 Lancer 75 2
3 3 Saber 60 1
4 4 Caster 75 2
5 5 Asassin 45 3
6 6 Berserk 55 3
7 7 Ruler 70 1
rankId rankName
1 1 RankA
2 2 RankB
3 3 RankC
*/
/* テーブルstudentからclassカラムが「任意の1文字+a+任意の0文字以上」のレコードを抽出 */
SELECT * FROM student WHERE class LIKE '_a%';
/* 抽出結果
id class point rankId
1 2 Lancer 75 2
2 3 Saber 60 1
3 4 Caster 75 2
*/
/* idで降順ソート(DESC)して抽出 */
SELECT * FROM student ORDER BY id DESC
/* 抽出結果
id class point rankId
1 7 Ruler 70 1
2 6 Berserk 55 3
3 5 Asassin 45 3
4 4 Caster 75 2
5 3 Saber 60 1
6 2 Lancer 75 2
7 1 Archer 90 1
*/
【CASE文】条件分岐
SQLでは、CASE文を用いることで、「条件分岐」を実装できます。
書式
CASEを使うには「CASE」~「END」の間に条件分岐を記述します。
SELECT
[抽出するカラム名]
CASE
WHEN [条件①] THEN [条件①を満たした場合の表示内容]
WHEN [条件②] THEN [条件②を満たした場合の表示内容]
ELSE [いずれの条件も満たしていない場合の表示内容]
END As [表示内容のカラム名]
FROM [テーブル名];
サンプルコード
/* テーブルを作成 */
create table student(id int, class varchar(20), point int, rankId int);
/* テーブルにデータを追加 */
insert into student values(1, 'Archer', 90, 1);
insert into student values(2, 'Lancer', 75,2);
insert into student values(3, 'Saber', 60, 1);
insert into student values(4, 'Caster', 75, 2);
insert into student values(5, 'Asassin', 45, 3);
insert into student values(6, 'Berserk', 55, 3);
insert into student values(7, 'Ruler', 70, 1);
/* テーブルから全てのカラムを抽出 */
SELECT * FROM student;
/* 抽出結果
id class point rankId
1 1 Archer 90 1
2 2 Lancer 75 2
3 3 Saber 60 1
4 4 Caster 75 2
5 5 Asassin 45 3
6 6 Berserk 55 3
7 7 Ruler 70 1
*/
/* 得点に応じてレベルを決めて抽出 */
SELECT
class, point,
CASE
WHEN 80 <= point THEN 'Lv3'
WHEN 70 <= point THEN 'Lv2'
WHEN 60 <= point THEN 'Lv1'
ELSE 'Lv0'
END As Level
FROM student;
/*
class point Level
1 Archer 90 Lv3
2 Lancer 75 Lv2
3 Saber 60 Lv1
4 Caster 75 Lv2
5 Asassin 45 Lv0
6 Berserk 55 Lv0
7 Ruler 70 Lv2
*/