準備
この単元で使用するので、以下のテーブルを作成してください。
「fruits(商品)」表 (※()内は論理名、型)
| code(商品コード、INT) | name(商品名、VARCHAR(20 CHAR)) | price(単価、INT) |
|---|---|---|
| 101 | メロン | 800 |
| 102 | いちご | 150 |
| 103 | りんご | 120 |
| 104 | レモン | 200 |
| 999 | NULL | 100 |
比較演算子
WHERE句には=以外にも以下の比較演算子が使用できます。
| 比較演算子 | 意味 | 例 | 例の意味 |
|---|---|---|---|
| = | 等しい | ID = 10 | IDが10と等しい |
| <> | 等しくない | ID <> 10 | IDが10と等しくない |
| < | より小さい | ID < 10 | IDが10より小さい |
| > | より大きい | ID > 10 | IDが10より大きい |
| <= | 以下 | ID <= 10 | IDが10以下 |
| >= | 以上 | ID >= 10 | IDが10以上 |
例文
SELECT * FROM fruits WHERE price >= 200 ;
(単価が200以上のデータを取得します。)
算術演算子
検索した結果に計算を加えたり、また計算結果を元に検索することができます。
| 比較演算子 | 意味 | 例 | 例の意味 |
|---|---|---|---|
| + | 加算 | ID + 10 | IDに10を足す |
| – | 減算 | ID – 10 | IDから10を引く |
| * | 積算 | ID * 10 | IDに10を掛ける |
| / | 乗算 | ID / 10 | IDを10で割る |
| % | 剰余 | ID % 2 | IDを2で割った余り |
例文
SELECT name, price * 1.08 FROM fruits ;
SELECT * FROM fruits WHERE price * 1.08 > 150 ;
別名(AS)
ASを使って取得結果の列名を別名で置き換えることができます。(ASは省略も可能)
SELECT name, price * 1.08 AS tax_inc FROM fruits ;
SELECT name, price * 1.08 tax_inc FROM fruits ;
論理演算子
SELECT文で取得する条件を複数指定するには、「論理演算子」と呼ばれる記号を使用して条件を作成します。
| 論理演算子 | 意味 | 例 | 例の意味 |
|---|---|---|---|
| AND | AかつB | ID >= 10 AND 年齢 = 20 | IDが10以上でかつ年齢が20である |
| OR | AまたはB | ID >= 10 OR 年齢 = 20 | IDが10以上かまたは年齢が20である |
| NOT | Aではない | NOT 年齢 = 20 | 年齢が20ではない |
例文
SELECT * FROM fruits WHERE price >= 200 AND name <> 'メロン' ;
(単価が200以上かつ名前がメロンではないデータを取得します。)
あいまい検索(部分一致、%)
WHERE句に「LIKE」と「%」や「_ 」という文字(ワイルドカード)を使用して条件を作成すると、曖昧検索(部分一致)を行うことができます。
曖昧な部分をワイルドカードに置き換えて、部分的に指定した文字列と一致する値を検索します。
SELECT * FROM fruits WHERE name LIKE '%ン' ;
ここでは、商品名の末尾に「ン」が付くデータを検索しています。
SQLで使われるワイルドカード
| ワイルドカード | 意味 | パターン例 | マッチする例 |
|---|---|---|---|
| % | 任意の数の文字にマッチする | %ン ブ% %ン% | メロン レモン ブドウ ブルーベリー アンズ マンゴー |
| _ | 1文字にマッチする | ユ_ _モ ス__ | ユズ モモ スモモ |
「NOT LIKE」で不一致のものを検索することもできます。
SELECT * FROM fruits WHERE name NOT LIKE '%ン' ;
データの並び替え(ORDER BY)
SELECT文で「ORDER BY」句を使用すると、指定した条件でのデータの並べ替え(ソート)が可能です。
SELECT * FROM fruits ORDER BY price ASC ;
( SELECT * FROM テーブル名 ORDER BY カラム名 [ASC | DESC] ; )
この例では商品テーブルの全データを単価の昇順で並べ替えて取得します。
「ASC」は昇順(値の小さい順1,2,3)で、「DESC」にすると降順(値の大きい順3,2,1)に並べ替えます。
その他の検索方法
範囲に含まれるデータの取得(BETWEEN、NOT BETWEEN)
BETWEEN演算子を使って「BETWEEN~AND~」という書き方で、値の範囲を指定することが出来ます。
SELECT * FROM fruits WHERE price BETWEEN 150 AND 200 ;
単価が150以上200以下の商品が抽出されます。
SELECT * FROM 商品 WHERE price NOT BETWEEN 150 AND 200 ;
NOTを追加しているので、単価が150以上200以下ではない(150より小さいか200より大きい)商品が抽出されます。
一致するデータの取得(IN、NOT IN)
IN演算子を使用すると、指定した値のいずれかと一致するデータを取得できます。
SELECT * FROM fruits WHERE name IN ('メロン', 'いちご') ;
名前が「いちご」または「メロン」の商品が抽出されます。
SELECT * FROM fruits WHERE name NOT IN ('メロン', 'いちご') ;
名前が「いちご」または「メロン」ではない商品が抽出されます。
NULLのデータを取得(IS NULL、IS NOT NULL)
空値を持つ行を検索する際には、IS NULL という指定を使うことができます。
SELECT * FROM fruits WHERE name IS NULL ;
名前が空値となっている商品が抽出されます。
SELECT * FROM fruits WHERE name IS NOT NULL ;
名前が空値ではない商品が抽出されます。
練習問題
次の表を作成し、様々な条件を使用したSQL文を書いてみましょう。
「輸出先」表 ( 人口の単位は[ 万人 ] )
| 輸出先コード | 輸出先名 | 人口 | 地方 |
|---|---|---|---|
| 12 | ミナンミ王国 | 100 | 南洋 |
| 15 | パローヌ国 | 200 | 中部 |
| 22 | トカンタ国 | 150 | 北洋 |
| 23 | アルファ帝国 | 80 | 北洋 |
| 30 | NULL | 110 | 中部 |
問1: 人口が100万人以上である国を抽出してください。
問2: 人口が100万人未満の国を抽出してください。
問3: 輸出先コードが20未満でかつ人口が150万人より多い国を調べてください。
問4: 輸出先コードが20以上の国と、人口が200万人以上の国を同時に調べてください。
問5: トカンタ国の人口を調べてください。
問6: 国名に「ン」を含む国を調べてください。
問7:輸出先名がNULLでない国を調べてください。
