【SQL文入門】基本的な使い方まとめ

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
*/