0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

SQLの基礎について学ぶ#05

Last updated at Posted at 2021-01-11

今回は検索結果の加工を用いた操作する行の絞り込みについて、まとめていきたいと思います。

過去の関連投稿

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_NUMBERROWNUMなどがあります。また、これらは使用するDBMSによって利用できる範囲が異なります。

まとめ

 SELECT文ORDER BYを用いることで簡単に並び替えの処理を行うことができました。しかし、この並び替えの処理はDBMSにとって、かなり負担の大きい作業です。便利な機能でもDBMSへの負担を考慮しながら、データベースを扱えるように今後もSQLの学習を進めていきたいと思います!!

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?