別列名と連結演算子とdistinctを使ったSELECT文

少し応用的に使うSELECT文です。書き方を変えればSELECT対象は思いのまま取得できます。書き方を覚えればデータは取得したい形式でSELECTできるようになるのでシステム開発の質が上がりますよ。

覚えるべきキーワード
・SELECT 列名 別列名 FROM 表名
・SELECT 列名 AS 別列名 FROM 表名
・”(二重引用符)
・||(連結演算子)
・’(一重引用符)
・文字リテラル
・日付リテラル
・q’引用符デリミタ・・引用符デリミタ
・SELECT DISTINCT 列名 FROM 表名

このサンプルテーブル1を使って以下のSQLを解説します。

サンプルテーブル1

(テーブル名:employee)

ID NAME AGE
10 SASAKI 29
11 SASAKI 29
12 SASAKI 32
13 KATOU 35
14 KATOU 40

SELECT 列名 別列名 FROM 表名

SELECT文でデータを取得する時はデータと共に列名も取得しますが、この列名を別の名前に指定して取得ができます。EMPLOYEEテーブルだと列名はID、NAME、AGEが列名ですが、これらの列名が変えられます。別の列名を別列名と呼ぶのでこれは覚えておいてください。

このSELECT文を使うときは列名の後に1つ以上のスペースを入れて別列名を指定します。例文です。

SELECT 列名 別列名 FROM 表名
SELECT name onamae FROM employee;

(テーブル名:employee)

ONAMAE
SASAKI
SASAKI
SASAKI
KATOU
KATOU

結果はこのようになります。NAME列のデータを取得していますが、列名は別列名のONAMAEを表示しています。ちなみにデータを取得する際の列名は小文字で記載(nameなど)しても大文字で記載しても(NAMEなど)列名は大文字で表示します。同じく別列名も同じで小文字でも大文字の列名で表示します。
ですが、指定方法によっては小文字を使うこともできます。(下に記載してある”(二重引用符)の項目を参考ください)

SELECT 列名 AS 別列名 FROM 表名

別列名の指定はASを使う方法もあります。これは先ほど紹介した別列名と結果は同じでASを追加するだけ。わざわざASを追加するのはSQL文を見やすくするためです。さきほどの、SELECT 列名 別列名 FROM 表名の例ではnameの別列名がonamaeと判断しづらいですが、ASを入れることで視認性が高まります。

SELECT 列名 AS 別列名 FROM 表名
SELECT name AS onamae FROM employee;

結果は先ほどと同じですが、SQL文は見やすくなっていますね。

”(二重引用符)

別列名をそのまま指定すると別列名は大文字で表示されます。しかし、別列名を”(二重引用符)で囲めば、小文字や特殊文字、スペースを使った別列名を指定できるようになります。

”(二重引用符)
SELECT name “Onamae Info” FROM employee;

(テーブル名:employee)

Onamae Info
SASAKI
SASAKI
SASAKI
KATOU
KATOU

これで細かい別列名の指定ができるようになります。

||(連結演算子)、’(一重引用符)、文字リテラル、日付リテラル

次は列名を連結して表示させたいときのSELECT文です。||(連結演算子)を使えば、列名同士をくっつけて表示したり、任意の文字リテラルや日付リテラルをくっつけて表示できたりします。

||(連結演算子)、’(一重引用符)、文字リテラル
SELECT name ||’の年齢は’|| age||’です。’ FROM employee;

これはemployeeテーブルのname列とage列、任意の文字列を用いたSELECTの方法です。情報を連結して1つの文章のように表示することができます。

(テーブル名:employee)

name ||’の年齢は’|| age||’です。’
SASAKIの年齢は29です。
SASAKIの年齢は29です。
SASAKIの年齢は32です。
KATOUの年齢は35です。
KATOUの年齢は40です。

日付リテラルを連結することもできます。

||(連結演算子)、’(一重引用符)、日付リテラル
SELECT name||’は、2020-02-10に’||name||’の母と同じ年になります。’ FROM employee;
name||’は、2020-02-10に’||name||’の母と同じ年になります。’ SASAKIは、は、2020-02-10にSASAKIの母と同じ年になります。 SASAKIは、は、2020-02-10にSASAKIの母と同じ年になります。 SASAKIは、は、2020-02-10にSASAKIの母と同じ年になります。 KATOUは、は、2020-02-10にKATOUの母と同じ年になります。 KATOUは、は、2020-02-10にKATOUの母と同じ年になります。

q’引用符デリミタ・・引用符デリミタ

今まで書いてきたように、文字リテラルや日付リテラルを用いる場合は’(一重引用符)で囲む必要がありますが、文字リテラルで’を使いたい場合はどうしましょうか。

その場合も問題御無用です。’を使う方法が準備されています。それがq’引用符デリミタ・・引用符デリミタです。q’の後に引用符デリミタを指定すれば文字リテラルに’が使えるようになります。まず引用符デリミタとは区切り文字のことを言います。そして引用符デリミタ(区切り文字)には任意のシングルバイト文字、ダブルバイト文字、もしくは[ ]、{ }、( )、< >を使うことができます。引用符デリミタで囲った範囲の’(一重引用符)はすべて’として使えますので、範囲内では複数個の指定も可能です。

q’引用符デリミタ・・引用符デリミタ
SELECT name || q’ ? ’s age:? ||age from employee;

(テーブル名:employee)

name || q’ ? ’s age:? ||age
SASAKI’age:29
SASAKI’age:29
SASAKI’age:32
KATOU’age:35
KATOU’age:40

SELECT DISTINCT 列名 FROM 表名

DISTINCTは、重複するレコードを排除する時に使うキーワードです。重複するデータは1つだけで良い時にDISTINCTを指定します。

SELECT DISTINCT 列名 FROM 表名
SELECT DISTINCT name FROM employee;

(テーブル名:employee)

NAME
SASAKI
KATOU

ここではnameで重複するレコードを排除しています。NAME列にはSASAKIが3つ、KATOUが2つあるので、重複する部分が排除されて、SASAKIとKATOUの2つを取得します。
なお、DISTINCTは複数の列名に対しても指定可能なので、このような書き方もできます。

SELECT DISTINCT 列名,列名,(列名)FROM 表名
SELECT DISTINCT name,age FROM employee;

このように書けば、nameとageで重複するレコードを排除します。DISTINCTは1つのSELECT文に1つしか使用しませんので、SELECT DISTINCT name,DISTINCT age FROM employee;のような書き方はできません。
結果はこのようになります。

(テーブル名:employee)

NAME AGE
SASAKI 29
SASAKI 32
KATOU 35
KATOU 40

NAMEがSASAKIで重複しているレコードの中でAGEも重複しているデータがあります。NAMEがSASAKI、AGEが29のレコードですね。そのため、この重複行は削除されます。一方、その他3つのレコードはNAMEとAGEで重複していないためそれぞれ一意に表示されます。重複行を無視してレコードを取得したいときはDISTINCTがポイントです。

以上のようにSELECT文はキーワードを活用すればあらゆるパターンでデータが取得できます。

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です