0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

データベース、SQL・MySQLの基礎(カラムの別名取得~シーケンス番号)

Last updated at Posted at 2022-01-22

カラムを別名で取得

テーブルを作成したときのカラム名で取得するのではなく、別の名前で取得することも可能。
後述する「表結合」を行う際に必要になる。

SELECT 
  カラム1 AS 別名1,
  カラム2 AS 別名2,
  カラム3 AS 別名3
FROM
  テーブル名

表を結合する

「表結合」を行うことで、複数の表のデータをまとめて参照することが可能ができる。
RDBを説明した際に、「言語データ」と「用途データ」という2つのデータに分けたが、
ここでいうデータというものは「テーブル」の事を指す。つまり、「言語テーブル」と「用途テーブル」そのものをデータとして扱う。
「表結合」を行うと、データの参照がより効率的になる。

表結合を行うには、複数のテーブルが必要。
まず、新しいテーブルを作成。

CREATE TABLE examples(
   id int(10) PRIMARY KEY NOT NULL,
   languages_id int(11),
   example VARCHAR(20)
);

examplesテーブルにデータを登録

INSERT INTO examples(
   id,
   languages_id,
   example
)VALUES(
   1,
   1,
   'Minecraft'
),(
   2,
   2,
   'RDB'
),(
   3,
   3,
   '文字'
),(
   4,
   4,
   '色付け'
),(
   5,
   1,
   'Evernote'
),(
   6,
   1,
   'Android'
),(
   7,
   20,
   'AI'
);

スクリーンショット 2022-01-22 15.30.00.png

表結合には、内部結合(INNER JOIN)と外部結合(OUTER JOIN)の2種類がある。

内部結合(INNER JOIN)

SELECT 
/*参照するテーブルとそのカラム ※ここで定義したものが参照され、表示される*/
    テーブル名1.カラム名1,
    テーブル名1.カラム名2,
    テーブル名2.カラム名1,
    テーブル名2.カラム名2

/*どのテーブルを結合するか*/
FROM
    テーブル名1
INNER JOIN
    テーブル名2
ON

/*結合する条件*/
    2つのテーブルの結合条件

上記をもとに、languagesテーブルとexamplesテーブルを連結してみる。

SELECT 
    languages.id,
    languages.language,
    examples.example
FROM
    languages
INNER JOIN
    examples
ON
    languages.id = books.languages_id;

結果は以下の通り。

スクリーンショット 2022-01-22 15.14.31.png

外部結合(OUTER JOIN)

外部結合は左右それぞれのテーブルの指定したカラムの値が一致するレコードに加えてどちらかのテーブルにしか存在しないデータについても取得する。基本となる構文は次の通り。

外部結合(LEFT JOIN)の基本構文

SELECT 
    テーブル名1.カラム名1,
    テーブル名1.カラム名2,
    テーブル名2.カラム名1,
    テーブル名2.カラム名2
FROM

/*↓こちらにしかないデータも取得する*/
    テーブル名1
LEFT JOIN
    テーブル名2
ON
    2つのテーブルの結合条件

外部結合(RIGHT JOIN)の基本構文

SELECT 
    テーブル名1.カラム名1,
    テーブル名1.カラム名2,
    テーブル名2.カラム名1,
    テーブル名2.カラム名2
FROM
    テーブル名1
RIGHT JOIN

/*↓こちらにしかないデータも取得する*/
    テーブル名2
ON
    2つのテーブルの結合条件

基本的に内部結合の場合と同じだが、外部結合では結合の対象となっているカラムの値が一致しているデータに加え、カラムの値がどちらかのテーブルにしかなかった場合でもデータとして取得する。
この時、LEFT JOINでは、FROMの後に書かれたテーブルのデータだけを取得し、
RIGHT JOINでは、JOINの後に書かれたテーブルのデータだけを取得する。

データベースの状況は以下。
スクリーンショット 2022-01-22 15.39.02.png

LEFT JOINで結合した場合

SELECT 
    languages.id,
    languages.language,
    examples.example
FROM
    languages
LEFT JOIN
    examples
ON
    authors.id = books.author_id;

結果
スクリーンショット 2022-01-22 15.45.17.png

examplesにないところはNULLで表示される。

RIGHT JOINで結合した場合

SELECT 
    languages.id,
    languages.language,
    examples.example
FROM
    languages
RIGHT JOIN
    examples
ON
    authors.id = books.author_id;

結果
スクリーンショット 2022-01-22 15.48.39.png

シーケンス番号の自動生成

指定したカラムに対してMySQLが自動的に一意のシーケンス番号を生成する機能。
利用するにはAUTO_INCREMENTで設定する。構文は以下の通り。

CREATE TABLE authors (
    Id int(11) PRIMARY KEY AUTO_INCREMENT NOT NULL,
    language VARCHAR(10),
    use VARCHAR(20)
);

基本的にAUTO_INCREMENTが設定されたカラムには自動で値が格納されていくように利用するが、
任意の数値、また重複した値を格納する事も可能。

AUTO_INCREMENTをテーブル内で設定する場合は次の点に注意。

・AUTO_INCREMENTを設定するカラムには同時にインデックスを設定する必要がある
・AUTO_INCREMENTはテーブル内の1つのカラムにしか設定できない
・AUTO_INCREMENTを設定したカラムにはDEFAULTは設定できない
・AUTO_INCREMENTには正の値しか格納できない(負の数も可能だが予期しない結果となる)  

<前回の記事>
・データベース、SQL・MySQLの基礎
https://qiita.com/TaikiTkwkbysh/items/8efc5faf8da2062a8a95

・データベース、SQL・MySQLの基礎(テーブルの作成から削除)
https://qiita.com/TaikiTkwkbysh/items/d1d38dda0f5844f7603b

・データベース、SQL・MySQLの基礎(データの登録〜並び替えて参照)
https://qiita.com/TaikiTkwkbysh/items/04b0db468490f0d79b67

<次回の記事>
・データベース、SQL・MySQLの基礎(命名規約)

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?