SQL道場 基本的な抽出方法(SELECT文)

テーブルからレコードを抽出するための基本的な方法を解説しています。全件数の全ての列を表示する、特定の列をだけを表示する、列名を別名を定義して表示する、テーブル(表)の別名を定義する、行から重複する行を取り除いて表示する方法を記載しています。

環境

使用ツール:Microsoft SQL Server Management Studio MySQL Workbench

テーブル設計図

SQLServer

SQLServerサンプル用のテーブル設計図

MySQL

MySQLサンプル用のテーブル設計図

テーブル内のデータ

IDEMP_NAME(社員名)EMP_NAME_KANA(社員カナ)EMP_DEPTCD(部署コード)EMP_AGE(年齢)EMP_SEX(性別)ENABLE(有効区分)
1すなりん 太郎すなりん たろう1351
2博多 ぴーちはかた ぴーち2201
3田中 工事たなか こうじ2261
4佐々木 花子ささき はなこ1401
5佐藤 じゅんさとう じゅん1231
6佐々木 ゆんささき ゆん1231

すべての列を表示する

対応:SQL Server MySQL Oracle PostgreSQL DB2 SQLite Access ANSI

基本

すべての列を表示する方法は、SELECTの後に*(アスタリスク)を付ける方法と、すべてのカラム(列名)を列挙する方法があります。

*(アスタリスク)で表示される列の順番は表作成時に指定した列の順番に沿って表示されます。

「*」アスタリスクを使用する方法

SELECT * FROM テーブル名;

全カラムを指定する方法。

SELECT カラム名,カラム名・・・ FROM テーブル名;

パフォーマンスを考えると、「」よりは、手間でもカラムを指定する方が好ましいです。ただ、開発時の検証やデータ抽出したいときなど一時的なシーンでは「」のほうが使いやすくよく使用します。カラム指定は主にシステム開発などで使用します。プログラム内部にSQLを記述する場合、*よりはカラム指定のほうが好ましいです。理由は、システム開発をしているとや運用後にカラムがどの機能に影響しているから検索(Grepコマンド)しやすいからです。適材適所で使い分けるのが良いでしょう。

実行結果

「MST_EMPLOYEE(社員マスタ)」テーブルからすべてのレコードを抽出している例になります。

SQL Server

SQLServer実行結果:すべての列を表示する方法

MySQL

MySQL実行結果:すべての列を表示する方法

特定の列を表示する

対応:SQL Server MySQL Oracle PostgreSQL DB2 SQLite Access ANSI

基本

特定の列を取り出したい場合は列名を指定します。列名を複数指定する場合は、列名と列名の間を「,(カンマ)」で区切り指定します。

SELECT カラム名,カラム名・・・FROM テーブル名

カラムをカンマで区切るときは、後方にカンマ(カラム名,)ではなく、前方にカンマ(,カラム名)を付けるほうが好ましいです。

実行結果

次の例では、「MST_EMPLOYEE(社員マスタ)」テーブルから「ID」と「社員名」の列だけを抽出しています。

SQL Server

SQLServerの実行結果:特定のカラムを抽出サンプル例

MySQL

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

SQLServerの実行結果:実行結果の列名を別名で表示するサンプル例

ダブルクォーテーションでくくるタイプ

SQLServerの実行結果:実行結果の列名を別名で表示するサンプル例(ダブルクォーテーション版)

MySQL

MySQLの実行結果:実行結果の列名を別名で表示するサンプル例(AS句あり)
MySQLの実行結果:実行結果の列名を別名で表示するサンプル例(AS句なし)

ダブルクォーテーションでくくるタイプ

MySQLの実行結果:実行結果の列名を別名で表示するサンプル例(AS句あり)(ダブルクォーテーション版)
MySQLの実行結果:実行結果の列名を別名で表示するサンプル例(AS句なし)(ダブルクォーテーション版)

表に別名を定義する

対応: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

SQLServerの実行結果:表に別名を定義するサンプル例(AS句あり、AS句なし)

ダブルクォーテーションでくくるタイプ

SQLServerの実行結果:表に別名を定義するサンプル例(AS句あり、AS句なし)(ダブルクォーテーション版)

MySQL

表名にダブルクォーテーションでくくって別表名にすることは、MySQLは不可

MySQLの実行結果:表に別名を定義するサンプル例(AS句あり)
MySQLの実行結果:表に別名を定義するサンプル例(AS句なし)

重複する行を取り除いて表示する

対応:SQL Server MySQL Oracle PostgreSQL DB2 SQLite Access ANSI

基本

SELECTに続けて「DISTINCT句(ディスティンクト)」を指定すると重複する行を取り除いて表示できます。「Group by」と同様の機能になります。たくさんのデータがあるなかで、どんな種類のデータ(性別、年齢、都道府県など)あるのか調べるときに使用します。

SELECT DISTINCT カラム名 FROM テーブル名;

DISTINCTではNULLも1種類のデータと見なして処理します。このため、指定した列にNULLが複数存在する場合、1つにまとめられて表示されます。

実行結果

次の例では、以下のレコードからどんな性別があるかDISTINCTを使って調べています。男、女、NULLの3パターンが出力されます。

IDEMP_NAME(社員名)EMP_NAME_KANA(社員カナ)EMP_DEPTCD(部署コード)EMP_AGE(年齢)EMP_SEX(性別)ENABLE(有効区分)
1すなりん 太郎すなりん たろう1351
2博多 ぴーちはかた ぴーち2201
3田中 工事たなか こうじ2261
4佐々木 花子ささき はなこ1401
5佐藤 じゅんさとう じゅん123NULL1
6佐々木 ゆんささき ゆん123NULL1

SQL Server

SQLServerの実行結果:重複する行を取り除いて表示する

MySQL

SQLServerの実行結果:重複する行を取り除いて表示する