今回は検索結果の加工を用いた操作する行の絞り込みについて、まとめていきたいと思います。
過去の関連投稿
「SQLの基礎について学ぶ#01」
「SQLの基礎について学ぶ#02」
「SQLの基礎について学ぶ#03」
「SQLの基礎について学ぶ#04」
1. 検索結果の加工
4大命令の復習
命令 | 各命令の固有部分 | 対象行の絞り込み | 検索結果の加工 |
---|---|---|---|
SELECT | 列名 FROM テーブル名 | WEHERE~ | その他の修飾 |
UPDATE | テーブル名 SET 列名 = 値 | WEHERE~ | |
DELETE | FROM テーブル名 | WEHERE~ | |
INSERT | INTO テーブル名(列名) VALUES(値) | ||
上の表で示したように検索結果の加工はSELECT文に用います。 | |||
今回は3つの検索結果を加工するキワードを見ていきます。 |
検索結果を加工するキーワード
キーワード | 説 明 |
---|---|
DISTINCT | 検索結果から重複する行を除外する |
ORDER BY | 検索結果の順序を並び替える |
OFFSET-FETCH | 検索結果から件数を限定して取得する |
2. DISTINCT 重複行を除外する
DISTINCTをSELECT文に付けることで、検索結果表の中で重複する行があれば、重複している行を取り除きます。
次のテーブルを用いて説明していきます。
accountテーブル
price(金額) |
---|
100 |
2000 |
1000 |
2000 |
100 |
1000 |
SELECT DISTINCT price FROM account
検索結果
price(金額) |
---|
100 |
2000 |
1000 |
このように、重複している金額が除外されました。 |
これだけだとイメージしにくいので、これを2段階に分けて説明します。まず |
SELECT /* DISTINCT */ price FROM account
によって、検索結果①が取得できます。
検索結果①
price(金額) |
---|
100 |
2000 |
1000 |
2000 |
100 |
1000 |
そして、DISTINCTによって、検索結果①から重複している金額を除外して、検索結果②が取得できます。 |
検索結果②
price(金額) |
---|
100 |
2000 |
1000 |
このように、検索結果の加工は2段階でイメージすると分かりやすいかなと私は感じました。 |
2. ORDER BY 結果を並べ替える
SELECT文にORDER BYを付けることで、指定した列を基準として、検索結果を並び替えて取得することができます。
それでは、次のテーブルを使用して説明していきます。
accountテーブル
date(日付) | name(項目名) | price(金額) |
---|---|---|
2020-12-14 | お茶 | 1000 |
2020-12-03 | お弁当 | 3000 |
2021-01-11 | 電車代 | 2500 |
2020-12-16 | ラーメン | 100 |
2021-01-04 | 日用品 | 2000 |
まず金額で降順(大きいもの順)になるように並べ替えます。
SELECT * FROM account
ORDER BY price DESC /* DESCで降順指定*/
結果
date(日付) | name(項目名) | price(金額) |
---|---|---|
2020-12-03 | お弁当 | 3000 |
2021-01-11 | 電車代 | 2500 |
2021-01-04 | 日用品 | 2000 |
2020-12-16 | ラーメン | 600 |
2020-12-14 | お茶 | 100 |
次に金額で昇順(小さいもの順)になるように並べ替えます。
SELECT * FROM account
ORDER BY price ASC /* ASCで昇順指定*/
結果
date(日付) | name(項目名) | price(金額) |
---|---|---|
2020-12-14 | お茶 | 100 |
2020-12-16 | ラーメン | 600 |
2021-01-04 | 日用品 | 2000 |
2021-01-11 | 電車代 | 2500 |
2020-12-03 | お弁当 | 3000 |
3. OFFSET-FETCH 先頭から指定した行数だけを取得する
検索結果の全ての行だけでなく、例えば「金額が高い項目トップ3」など一部の行だけ取得したい場合にOFFSET-FETCHを用います。
/* 先頭の数件だけを取得する */
SELECT 列名 FROM テーブル名
ORDER BY 列名
OFFSET 先頭から除外する行数 ROWS
FETCH NEXT 取得する行数 ROWS ONLY
/* MySQL, MariaDB, SQLiteではサポートされていないため、この場合、LIMITを使用する */
それでは、次のテーブルを使用して説明していきます。
accountテーブル
date(日付) | name(項目名) | price(金額) |
---|---|---|
2020-12-14 | お茶 | 1000 |
2020-12-03 | お弁当 | 3000 |
2021-01-11 | 電車代 | 2500 |
2020-12-16 | ラーメン | 100 |
2021-01-04 | 日用品 | 2000 |
/* 金額の高い順に3件取得する */
SELECT name, price FROM account
ORDER BY price DESC
OFFSET 0 ROWS
FETCH NEXT 3 ROWS ONLY
結果
name(項目名) | price(金額) |
---|---|
お弁当 | 3000 |
電車代 | 2500 |
日用品 | 2000 |
/* 3番目に高い金額を取得する */
SELECT name, price FROM account
ORDER BY price DESC
OFFSET 2 ROWS
FETCH NEXT 3 ROWS ONLY
結果
name(項目名) | price(金額) |
---|---|
日用品 | 2000 |
取得行を限定するその他の方法
LIMITの使用
/* MySQL, MariaDB, SQLite, PostgreSQL, H2などで使用 */
/* 金額の高い順に3件取得する */
SELECT name, price FROM account
ORDER BY price DESC LIMIT 3
この投稿では紹介しませんが、その他ROW_NUMBERやROWNUMなどがあります。また、これらは使用するDBMSによって利用できる範囲が異なります。
まとめ
SELECT文にORDER BYを用いることで簡単に並び替えの処理を行うことができました。しかし、この並び替えの処理はDBMSにとって、かなり負担の大きい作業です。便利な機能でもDBMSへの負担を考慮しながら、データベースを扱えるように今後もSQLの学習を進めていきたいと思います!!