第２章 SQL による検索（基礎編）

基本的な SELECT 文
条件付き検索比較述語
BETWEEN 述語
IN 述語
LIKE 述語
ESCAPE 指定
NULL 述語
複合条件
算術演算子
集合関数
グループ化
グループの選択
検索結果の並べ替え
この章
この章のねらい
この章では、SQL による基本的な検索方法を紹介します。
基本的な SELECT 文の書き方、WHERE 句を使用した検索条件の指定、GROUP BY 句を使用したグループごとの集計、ORDER BY 句による検索結果の並べ替えを理解します。

第２章 SQL による検索（基礎編）

表のデータを問合せるには、SELECT 文を用います。問合せたい列名を、SELECT の後に指定し、問合せる表名を FROM の後に指定します。

■ 複数列の複数列の問合せ
問合せ
検索の対象となる列が複数ある場合には、列名と列名の間をカンマ（，）で区切って、列名を指定します。

【例題 1】
社員表（employees）から社員番号（emp_no）と社員名（emp_name）を問合せます。

SELECT emp_no, emp_name
FROM employees;
emp_noemp_name

10000

浅田 亮

10010村野 大輔

10020金子 昭彦

・・・・・・

13

第２章 SQL による検索（基礎編）■ 全列の全列の問合せ
問合せ
表のすべての列を問合せたい場合には、すべての列名を SELECT の後に列挙する代わりに、「＊」を指定することができます。

【例題 2】
社員表（employees）からすべての列を問合せます。

SELECT＊FROM

employees;

emp_noemp_name

dept_nosalaryemail

10000 浅田亮

20

300000 asada@sqlnyu.co.jp

10010 村野大輔

30

350000 murano@sqlnyu.co.jp

10020 金子昭彦30

400000 kaneko@sqlnyu.co.jp

10030 水野忠明

40

250000 mizuno@sqlnyu.co.jp

10040 黒田武30280000 kuroda@sqlnyu.co.jp

10050 日浦高志

40

210000 hiura@sqlnyu.co.jp

・・・・・・・・・・・・

14・・・

第２章 SQL による検索（基礎編）■ 重複データの重複データの省略
データの省略重複したデータを表示させたくない場合には、DISTINCT を SELECT の後に指定します。

DISTINCT 指定がない場合には、重複データもそのまま表示されます。また、SELECT の後に ALL を指定しても、重複データをそのまま表示することができます。

【例題 3】
売上表（sales）から売上のあった顧客番号（cust_no）を問合せます。

SELECT cust_no

SELECT DISTINCT cust_no

FROM sales;

FROM sales;cust_nocust_no1

1122334254・・・

55・・・

15

第２章 SQL による検索（基礎編）

表から特定の条件を満たした行だけを問合せる際には WHERE 句を用います。WHERE 句の後に、取り出したいデータの条件（検索条件）を指定します。

検索条件に指定できるものには、次のようなものがあります。

●比較述語

●

BETWEEN 述語●IN 述語●LIKE 述語●

NULL 述語

また、これらの条件を複数個組み合わせて指定することもできます。

16

第２章 SQL による検索（基礎編）「社員番号が 10000」のように、列のデータと値を比較するときは、比較演算子を用いることができます。このような検索をおこなうには、WHERE の後に比較演算子を含んだ検索条件を指定します。

【例題 4】
書籍表（books）から書籍名（book_name）が「Ｃプログラミング大辞典」の売価（price）を問合せます。

SELECT book_name, price
FROM books
WHERE book_name=N'Ｃプログラミング大辞典';

book_nameprice

Ｃプログラミング大辞典

2200

17

第２章 SQL による検索（基礎編）「給与が 250000 以上でかつ 300000 以下」というように、ある範囲のデータを問合せたいときには、BETWEEN 述語を用いることができます。

BETWEEN 述語の中の値式には、検索条件の範囲を指定します。これを指定するには、左側値式に範囲のさいほうの値右側の値式にきいほうの値の値式に範囲の小さいほうの値を、右側の値式に大きいほうの値を指定します。
指定されたされた範囲範囲にまた、BETWEEN の前に NOT をつけると、指定された範囲に含まれないデータが検索されます。

18

第２章 SQL による検索（基礎編）【例題 5】
社員表（employees）から給与（salary）が 250000 以上で 300000 以下の社員の社員番号（emp_no）と社員名（emp_name）、給与（salary）を問合せます。

SELECT emp_no, emp_name, salary
FROM employees
WHERE salary BETWEEN 250000 AND 300000;

emp_noemp_namesalary

10000

浅田 亮

300000

10030

水野 忠明

250000

10040

黒田 武

280000

10060

沢村 隆弘

300000

10100

井村 栄治

290000

10110

田中 俊宏

260000

10140

中村 勝

290000

10150

遠藤 真一

290000【例題 6】
社員表（employees）から給与（salary）が 250000 より少ないか、または 300000 より多い社
員の社員番号（emp_no）と社員名（emp_name）、給与（salary）を問合せます。

SELECT emp_no, emp_name, salary
FROM employees
WHERE salary NOT BETWEEN 250000 AND 300000;

emp_noemp_namesalary

10010

村野 大輔

350000

10020

金子 昭彦

400000

10050

日浦 高志

210000

10070

中田 光弘

24000010080

上久保 初美21000010090

末吉 真奈美200000・・・・・・・・・

19

第２章 SQL による検索（基礎編）「部門番号が 10 または 20」のように、複数の値のうち、いずれかに等しいという検索条件を指定する際には、IN 述語を用いることができます。

IN 述語の後の（）の中に、複数の値をカンマカンマ（，）（，）で区切ってって指定（，）
で区切って指定します。

【例題 7】
社員表（employees）から部門番号（dept_no）が 10 または 20 の社員の社員番号（emp_no）と社員名（emp_name）、部門番号（dept_no）を問合せます。

SELECT emp_no, emp_name, dept_noFROM employees
WHERE dept_no IN (10, 20);20

emp_noemp_namedept_no10000

浅田 亮

2010070

中田 光弘

1010090

末吉 真奈美

20

10110

田中 俊宏

2010130

高瀬 尚子

1010160

田辺 誠

1010170

鈴木 克彦

20

第２章 SQL による検索（基礎編）

文字列による検索条件を指定する場合には、比較演算子などを用いて条件を指定できますが、これでは、指定した文字列に等しいか、または等しくないか、といった条件でしか問合せることができません。

LIKE 述語を用いることにより、「社員名に”中”が含まれる社員を問合せる」といった、文字列一部が一致するデータをするデータを問合問合せることができますの一部が一致するデータを問合せることができます。

■ パターン指定
パターン指定LIKE 述語の後のパターン部分に、検索条件となるパターンを指定します。この際に、特殊記号である%（パーセント）と_（下線文字）を組合せることにより、文字列の一部が一致する検索条件を作成することができます。

21

第２章 SQL による検索（基礎編）【例題 8】
社 員 表 （ employees ） か ら 社員 名 （ emp_name ） に 「 中」 が含 ま れ る 社 員 の 社 員 番 号（emp_no）と社員名（emp_name）を問合せます。

SELECT emp_no, emp_name
FROM employees
WHERE emp_name LIKE N'%中%';

emp_noemp_name

10070

中田 光弘

10110

田中 俊宏

10120

田中 弘明

10140

中村 勝

【例題 9】
社員表（ employees） から 社員名（ emp_name） が｢ 中｣ で始ま る ５ 文字 の社員の社 員番号（emp_no）と社員名（emp_name）を問合せます。
（姓と名の間に１文字分の空白が含まれています）

SELECT emp_no, emp_name
FROM employees
WHERE emp_name LIKE N'中_ _ _ _';emp_noemp_name

10070

中田 光弘

22

第２章 SQL による検索（基礎編）

LIKE 述語のパターン指定の際に、％や下線文字下線文字（＿）（＿）をんだデータを問合問合せる
せる場合
場合にはには、（＿）
を含んだデータを問合せる
場合には、エスケープ文字文字の指定をおこなう
エスケープ文字の指定をおこなう必要があります。
ESCAPE の後に文字を指定すると、その SQL 文中では、それがエスケープ文字という特殊記号になります。

LIKE 述語のパターン指定をおこなう際、エスケープ文字の後に指定された１文字は、％や＿などの特殊記号であっても、文字として扱われます。

【例題 10】社員表（employees）から EMAIL に_（下線文字）を含む社員の社員名と EMAIL を問合せます。

SELECT

emp_name, email

FROMemployees

emp_name

email

WHERE

email

田中 俊宏

t_tanaka@sqlnyu.co.jp

ESCAPE'\';田中 弘明

h_tanaka@sqlnyu.co.jp

LIKE '%\_%'

23

第２章 SQL による検索（基礎編）

NULL とは、値が不定であることを表す特殊な値です。この NULL と等しいしい値はなく、値はなく、NULL にして大小比較大小比較をおこなうこともできません
対して大小比較をおこなうこともできません。
したがって、次のような検索条件では、NULL を含んだ行を問合せることができません。

WHERE 列名 ＝ NULL

NULL を含む行を問合せるときには、NULL 述語を用います。

【例題 11】
社員表（employees）から部門番号（dept_no）が NULL の社員の社員番号（emp_no）と社員名（emp_name）を問合せます。

SELECT emp_no, emp_name
FROM employees
WHERE dept_no IS NULL;

emp_noemp_name

10190

宮田 正人

24