SQL道場 基本的な抽出方法(SELECT文)
テーブルからレコードを抽出するための基本的な方法を解説しています。全件数の全ての列を表示する、特定の列をだけを表示する、列名を別名を定義して表示する、テーブル(表)の別名を定義する、行から重複する行を取り除いて表示する方法を記載しています。
環境
使用ツール:Microsoft SQL Server Management Studio MySQL Workbench
テーブル設計図
SQLServer
MySQL
テーブル内のデータ
ID | EMP_NAME(社員名) | EMP_NAME_KANA(社員カナ) | EMP_DEPTCD(部署コード) | EMP_AGE(年齢) | EMP_SEX(性別) | ENABLE(有効区分) |
---|---|---|---|---|---|---|
1 | すなりん 太郎 | すなりん たろう | 1 | 35 | 男 | 1 |
2 | 博多 ぴーち | はかた ぴーち | 2 | 20 | 女 | 1 |
3 | 田中 工事 | たなか こうじ | 2 | 26 | 男 | 1 |
4 | 佐々木 花子 | ささき はなこ | 1 | 40 | 女 | 1 |
5 | 佐藤 じゅん | さとう じゅん | 1 | 23 | 1 | |
6 | 佐々木 ゆん | ささき ゆん | 1 | 23 | 1 |
すべての列を表示する
対応:SQL Server MySQL Oracle PostgreSQL DB2 SQLite Access ANSI
基本
すべての列を表示する方法は、SELECTの後に*(アスタリスク)を付ける方法と、すべてのカラム(列名)を列挙する方法があります。
*(アスタリスク)で表示される列の順番は表作成時に指定した列の順番に沿って表示されます。
「*」アスタリスクを使用する方法
SELECT * FROM テーブル名;
全カラムを指定する方法。
SELECT カラム名,カラム名・・・ FROM テーブル名;
パフォーマンスを考えると、「」よりは、手間でもカラムを指定する方が好ましいです。ただ、開発時の検証やデータ抽出したいときなど一時的なシーンでは「」のほうが使いやすくよく使用します。カラム指定は主にシステム開発などで使用します。プログラム内部にSQLを記述する場合、*よりはカラム指定のほうが好ましいです。理由は、システム開発をしているとや運用後にカラムがどの機能に影響しているから検索(Grepコマンド)しやすいからです。適材適所で使い分けるのが良いでしょう。
実行結果
「MST_EMPLOYEE(社員マスタ)」テーブルからすべてのレコードを抽出している例になります。
SQL Server
MySQL
特定の列を表示する
対応:SQL Server MySQL Oracle PostgreSQL DB2 SQLite Access ANSI
基本
特定の列を取り出したい場合は列名を指定します。列名を複数指定する場合は、列名と列名の間を「,(カンマ)」で区切り指定します。
SELECT カラム名,カラム名・・・FROM テーブル名
カラムをカンマで区切るときは、後方にカンマ(カラム名,)ではなく、前方にカンマ(,カラム名)を付けるほうが好ましいです。
実行結果
次の例では、「MST_EMPLOYEE(社員マスタ)」テーブルから「ID」と「社員名」の列だけを抽出しています。
SQL Server
MySQL
実行結果の列名を別名で表示する
対応:SQL Server MySQL Oracle PostgreSQL DB2 SQLite Access ANSI
基本
SELECT命令で列名を指定する際にAS句を指定すると、特定の列名に別名(エイリアス)を付けることができます。他のテーブルと結合したときに、同名のカラム名があった場合エラーとなることがあるので、別名を付けることで解消できます。また、プログラムで別名で取得したいときやエクセルなどのヘッダー名を任意に変更したい時に役に立ちます。
ほかにもカラム名に関数(現在のDB日時取得など)を使用した時に列名が定義されていないため、任意の列名をAS句で設定することができます。
ASあり
SELECT カラム名 AS 列別名,カラム名 ・・・FROM テーブル名;
ASなし
AS句は省略して記述することもできます。
SELECT カラム名 AS 列別名,カラム名 ・・・FROM テーブル名;
ダブルコーテーションで囲う
列名に大文字/小文字/空白などを指定する場合は、別名をダブルクォーテーションでくくります。
SELECT カラム名 AS "列別名",カラム名 ・・・FROM テーブル名;
SQLServerでは、大文字小文字はダブルクォーテーションは不要です。
実行結果
次の例では、「MST_EMPLOYEE(社員マスタ)」テーブルから「ID」に対して、別名「社員番号」をつけています。
SQL Server
ダブルクォーテーションでくくるタイプ
MySQL
ダブルクォーテーションでくくるタイプ
表に別名を定義する
対応:SQL Server MySQL Oracle PostgreSQL DB2 SQLite Access ANSI
基本
表名が長い場合や表名からどのようなデータが格納されているかわかりにくい場合に使用します。また、実務ではサブクエリにもっともよく使用します。サブクエリは、カッコ内にselect文をいれることができますが、参照する倍に表名がないため、AS句などで別の表名を設定します。RIGHT JOIN、LEFT JOIN、INNER JOIN等の結合時にもよく使用します。
ASあり
SELECT * FROM テーブル名 AS 別表名;
ASなし
AS句は省略して記述することもできます。
SELECT * FROM テーブル名 別表名;
ダブルコーテーションで囲う
列名に大文字/小文字/空白などを指定する場合は、別名をダブルクォーテーションでくくります。
SELECT * FROM テーブル名 AS "別表名";
AS句を指定したほうがよいか、省略したほうがよいかという点ですが、可読性があるという点ではAS句を省略しないほうが良いと考えいます。開発現場や保守では、他人のSQLを解読する場面が多々あります。その時にAS句があると別名だと一目で理解しやすいので、なるべく定義するようにしています。
実行結果
次の例では、「MST_EMPLOYEE(社員マスタ)」テーブルから「ID」に対して、別名「社員番号」をつけています。
SQL Server
ダブルクォーテーションでくくるタイプ
MySQL
表名にダブルクォーテーションでくくって別表名にすることは、MySQLは不可
重複する行を取り除いて表示する
対応:SQL Server MySQL Oracle PostgreSQL DB2 SQLite Access ANSI
基本
SELECTに続けて「DISTINCT句(ディスティンクト)」を指定すると重複する行を取り除いて表示できます。「Group by」と同様の機能になります。たくさんのデータがあるなかで、どんな種類のデータ(性別、年齢、都道府県など)あるのか調べるときに使用します。
SELECT DISTINCT カラム名 FROM テーブル名;
DISTINCTではNULLも1種類のデータと見なして処理します。このため、指定した列にNULLが複数存在する場合、1つにまとめられて表示されます。
実行結果
次の例では、以下のレコードからどんな性別があるかDISTINCTを使って調べています。男、女、NULLの3パターンが出力されます。
ID | EMP_NAME(社員名) | EMP_NAME_KANA(社員カナ) | EMP_DEPTCD(部署コード) | EMP_AGE(年齢) | EMP_SEX(性別) | ENABLE(有効区分) |
---|---|---|---|---|---|---|
1 | すなりん 太郎 | すなりん たろう | 1 | 35 | 男 | 1 |
2 | 博多 ぴーち | はかた ぴーち | 2 | 20 | 女 | 1 |
3 | 田中 工事 | たなか こうじ | 2 | 26 | 男 | 1 |
4 | 佐々木 花子 | ささき はなこ | 1 | 40 | 女 | 1 |
5 | 佐藤 じゅん | さとう じゅん | 1 | 23 | NULL | 1 |
6 | 佐々木 ゆん | ささき ゆん | 1 | 23 | NULL | 1 |