【初心者必見】MySQLで色々な関数を試してみた
公開日: 2022/6/15
更新日: 2022/6/10
6月から参画するプロジェクトで、SQLServer を使用するため、SQLの操作に慣れておくために今回この記事を書くことにした。
SQLは基本的に操作に慣れて覚えていくことが一番大事だと考えているため、 色々なパターンで操作していこうと思う。
その中でも今回は、「集計関数」について、実際に色々試して操作に慣れていく。 (集計関数以外の色々な関数も操作してみた)
”https://style.potepan.com/articles/26945.html
SQL Server 集計関数一覧
”https://johobase.com/sqlserver-aggregate-function/
SQL GROUP BYで自在に集計! 集計関数やHAVINGと合わせて使おう
”https://www.sejuku.net/blog/72923
SQLの文字列関数とは?よく利用される関数とその使い方について解説
”https://products.sint.co.jp/topsic/blog/sql-bootcamp-01
SQLで文字列を結合するにはconcat関数 引数の数やNULLの扱い等、仕様に差異あり
”https://style.potepan.com/articles/30406.html
SQLのREPLACE関数を用いた置換機能 使用方法を徹底的に解説
”https://style.potepan.com/articles/17824.html
1分でわかる SQLで四捨五入するにはROUND関数を使う!
”https://style.potepan.com/articles/26450.html
SQL FLOOR関数の使い方(切り下げ)
”https://ichilv.com/sql-floor/
SQLでランダム順にレコード取得するサンプル rand関数を使用
”https://style.potepan.com/articles/25326.html
日付型をフォーマット! MySQLのDATE_FORMAT関数を活用
”https://style.potepan.com/articles/19541.html
SQLは基本的に操作に慣れて覚えていくことが一番大事だと考えているため、 色々なパターンで操作していこうと思う。
その中でも今回は、「集計関数」について、実際に色々試して操作に慣れていく。 (集計関数以外の色々な関数も操作してみた)
参考サイト
SQL GROUP BY句と集計関数の使い方を確認しよう!”https://style.potepan.com/articles/26945.html
SQL Server 集計関数一覧
”https://johobase.com/sqlserver-aggregate-function/
SQL GROUP BYで自在に集計! 集計関数やHAVINGと合わせて使おう
”https://www.sejuku.net/blog/72923
SQLの文字列関数とは?よく利用される関数とその使い方について解説
”https://products.sint.co.jp/topsic/blog/sql-bootcamp-01
SQLで文字列を結合するにはconcat関数 引数の数やNULLの扱い等、仕様に差異あり
”https://style.potepan.com/articles/30406.html
SQLのREPLACE関数を用いた置換機能 使用方法を徹底的に解説
”https://style.potepan.com/articles/17824.html
1分でわかる SQLで四捨五入するにはROUND関数を使う!
”https://style.potepan.com/articles/26450.html
SQL FLOOR関数の使い方(切り下げ)
”https://ichilv.com/sql-floor/
SQLでランダム順にレコード取得するサンプル rand関数を使用
”https://style.potepan.com/articles/25326.html
日付型をフォーマット! MySQLのDATE_FORMAT関数を活用
”https://style.potepan.com/articles/19541.html
1. 集計関数とは?
集計関数は、1つの列に対して操作することができる演算機能をいう。
主な集計関数は以下の通り
・AVG関数
→ グループごとの値の平均を返す関数
・SUM関数
→ グループごとの合計の値を返す関数
・MAX関数
→ グループごとの最大の値を返す関数
・MIN関数
→ グループごとの最小の値を返す関数
・COUNT関数
→ グループごとの項目数を返す関数
よく使う関数としたは、上記の関数である。
主な集計関数は以下の通り
・AVG関数
→ グループごとの値の平均を返す関数
・SUM関数
→ グループごとの合計の値を返す関数
・MAX関数
→ グループごとの最大の値を返す関数
・MIN関数
→ グループごとの最小の値を返す関数
・COUNT関数
→ グループごとの項目数を返す関数
よく使う関数としたは、上記の関数である。
2. SQLを使って操作をしてみよう
では早速SQLを操作して集計関数を使って色々試してみる
まずは新しいデータベースを作成する
今回は新しく shukei_testデータベースを作成する。
以下のコマンドを実行
create database shukei_test;
このように表示されたらデータベースが正常に作成されている。
作成したデータベース(shuke_test)があるか確認する。
show databases;
shukei_testデータベースがあることを確認できた。
では新しく作成した shuke_testデータベースを使う
下記コマンドを実行
use shukei_test;
これで shukei_test データベースを使うことができる
ではここから新しいテーブルを作成する
今回は productテーブルを作成する
下記コマンドを実行する
create table product (id int(10), name varchar(20), count int(10), type varchar(20));
今回は、idカラム、nameカラム、countカラム、typeカラムを作成
これでテーブル自体の作成をしたので、次に実際にデータを追加する。
insert into product (id, name, count, type) values (1, '作業机', 10, '家具'), (2, '作業用椅子', 13, '家具'), (3, '炊飯器', 15, '家電'), (4, '電子レンジ', 17, '家電'), (5, '布団', 15, '家具');
これで productテーブルが完成した。
ではここから集計関数の操作をしていく
集計関数を使うときは、GROUP BY句と一緒に使う
まずは新しいデータベースを作成する
今回は新しく shukei_testデータベースを作成する。
以下のコマンドを実行
create database shukei_test;
このように表示されたらデータベースが正常に作成されている。
作成したデータベース(shuke_test)があるか確認する。
show databases;
shukei_testデータベースがあることを確認できた。
では新しく作成した shuke_testデータベースを使う
下記コマンドを実行
use shukei_test;
これで shukei_test データベースを使うことができる
ではここから新しいテーブルを作成する
今回は productテーブルを作成する
下記コマンドを実行する
create table product (id int(10), name varchar(20), count int(10), type varchar(20));
今回は、idカラム、nameカラム、countカラム、typeカラムを作成
これでテーブル自体の作成をしたので、次に実際にデータを追加する。
insert into product (id, name, count, type) values (1, '作業机', 10, '家具'), (2, '作業用椅子', 13, '家具'), (3, '炊飯器', 15, '家電'), (4, '電子レンジ', 17, '家電'), (5, '布団', 15, '家具');
これで productテーブルが完成した。
ではここから集計関数の操作をしていく
集計関数を使うときは、GROUP BY句と一緒に使う
2-1. 1 AVG関数を使い、 typeごとのcountカラムの平均値を取得する
select type, avg(count) from product group by type;
このように グループ化して集計関数を使うことで、家具と家電に分類して countカラムの平均値を取得することができた。
このように グループ化して集計関数を使うことで、家具と家電に分類して countカラムの平均値を取得することができた。
2-2. 2 SUM関数を使い、 typeごとの総数を取得する
select type, sum(count) from product group by type;
それぞれ typeごとにグループ化して総数を取得することができた。
それぞれ typeごとにグループ化して総数を取得することができた。
2-3. 3 MAX関数を使い、 typeごとの一番多い count を取得する
select type, max(count) from product group by type;
それぞれをグループ化して、typeごとの最大のcount数を取得することができた。
それぞれをグループ化して、typeごとの最大のcount数を取得することができた。
2-4. 4 MIN関数を使い、typeごとの最小数を取得する
select type, min(count) from product group by type;
それぞれグループ化して、typeごとの最小のcount数を取得することができた
それぞれグループ化して、typeごとの最小のcount数を取得することができた
2-5. 5 SUM関数を使い、 typeごとの合計を取得する
select type, sum(count) from product group by type;
それぞれグループ化して、typeごとの合計を取得することができた。
それぞれグループ化して、typeごとの合計を取得することができた。
2-6. 6 HAVING句を使い、条件を絞って集計関数を使用する
HAVING句を使うことで、グループ化が実行された後に条件を絞り込むことができる。
実際に操作をしてみる
select type, count(count) as count_stock from product group by type having count > 10;
上記のSQL文を実行した時にエラーが生じてしまった。
エラーの内容
ERROR 1054 (42S22): Unknown column 'count' in 'having clause'
countカラムが重複していることが原因
countカラムを別の名前のカラムに変更する
カラム名を変更するには、ALTER TABLE 文を使う
カラム名の変更の構文
ALTER TABLE テーブル名
RENAME COLUMN 古いカラム名 TO 新しいカラム名
それでは、 countカラムを stockカラムに変更する
alter table product rename column count to stock;
productテーブルを確認すると、 countカラムがstockカラムに変更されていることを確認できた。
再度having句で条件を指定して、集計関数を利用する
select type, count(stock) as count_stock from product group by type having count_stock > 1;
stockカラムを AS句で count_stockカラムに変更、
typeカラムをグループ化した後に、 HAVING句で count_stockカラムが1以上を取得している。
実際に操作をしてみる
select type, count(count) as count_stock from product group by type having count > 10;
上記のSQL文を実行した時にエラーが生じてしまった。
エラーの内容
ERROR 1054 (42S22): Unknown column 'count' in 'having clause'
countカラムが重複していることが原因
countカラムを別の名前のカラムに変更する
カラム名を変更するには、ALTER TABLE 文を使う
カラム名の変更の構文
ALTER TABLE テーブル名
RENAME COLUMN 古いカラム名 TO 新しいカラム名
それでは、 countカラムを stockカラムに変更する
alter table product rename column count to stock;
productテーブルを確認すると、 countカラムがstockカラムに変更されていることを確認できた。
再度having句で条件を指定して、集計関数を利用する
select type, count(stock) as count_stock from product group by type having count_stock > 1;
stockカラムを AS句で count_stockカラムに変更、
typeカラムをグループ化した後に、 HAVING句で count_stockカラムが1以上を取得している。
2-7. 7 グループ化した後に ORDER BY句を使い、それぞれ昇順、降順で並べてみる
昇順(デフォルト) ASC
降順 DESC
select type, count(stock) as count_stock from product group by type order by count_stock asc;
それぞれ typeごとにグループ化して、カラム名をAS句で count_stock に変更して、 count_stockを昇順にして取得することができた。
降順の場合
降順 DESC
select type, count(stock) as count_stock from product group by type order by count_stock asc;
それぞれ typeごとにグループ化して、カラム名をAS句で count_stock に変更して、 count_stockを昇順にして取得することができた。
降順の場合
3. そのほかの関数について
今までは、集計関数を使用したSQL操作をしたが、SQLには他にも色々な関数があるので、ここでは代表的なSQL関数をいくつか操作していく。
4. 文字列関数
文字列関数は、文字列の項目に対して操作を行う関数になる
例として、文字列の文字数を取得したり、文字列を連結したりする
では代表的な文字列関数を操作していく
例として、文字列の文字数を取得したり、文字列を連結したりする
では代表的な文字列関数を操作していく
4-1. 1 LENGTH関数
LENGTH関数は、引数に指定した文字列の長さを取得する関数
select length("HelloWorld!!");
length関数を使うことで、HelloWorld!! の文字列を取得することができた。
先程作成した productテーブルを使用して、length関数を使ってみる。
productテーブルからnameカラムを取得して、nameカラムの文字数を取得してみる。
select length(name) from product;
それぞれのnameカラムの文字列を取得することができた。
これだと何の商品が何文字かがわからないため、nameカラムの文字数の隣に、 商品名を表示する。
select name, length(name) from product;
これで商品名と、各商品ごとの文字数を取得することができた。
次にWHERE句を使用して条件を抽出してから、文字列を取得するように操作してみる。
今回は、文字列が10文字以上の商品 (nameカラム)を取得する
select name, length(name) from product where length(name) > 10;
このように where句を使い条件を絞り、10文字以上の商品名を取得することができた。
select length("HelloWorld!!");
length関数を使うことで、HelloWorld!! の文字列を取得することができた。
先程作成した productテーブルを使用して、length関数を使ってみる。
productテーブルからnameカラムを取得して、nameカラムの文字数を取得してみる。
select length(name) from product;
それぞれのnameカラムの文字列を取得することができた。
これだと何の商品が何文字かがわからないため、nameカラムの文字数の隣に、 商品名を表示する。
select name, length(name) from product;
これで商品名と、各商品ごとの文字数を取得することができた。
次にWHERE句を使用して条件を抽出してから、文字列を取得するように操作してみる。
今回は、文字列が10文字以上の商品 (nameカラム)を取得する
select name, length(name) from product where length(name) > 10;
このように where句を使い条件を絞り、10文字以上の商品名を取得することができた。
4-2. 2 CONCAT関数
CONCAT関数は、引数に指定した文字列を連結した文字列として取得することができる。
文字列を結合するための関数
実際に操作してみよう
まずは新しくテーブルを作成する。
humanテーブルを作成する
create table human (id int(10), last_name varchar(20), first_name varchar(20), area varchar(10));
今回は、idカラム、 last_nameカラム、 first_nameカラム、 areaカラムを作成
実際にデータを追加する
insert into human (id, last_name, first_name, area) values (1, '鈴木', '一郎', '愛知県'), (2, '佐藤', '花子', '北海道'), (3, '平山', '吾郎', '香川県'), (4, '山田', '朋子', '静岡県'), (5, '田沢', '英二', '東京都');
humanテーブルを作成
では実際にCONCAT関数を使用して、last_name と first_nameを結合していく
select concat(last_name,'',first_name)from human;
このようにCONCAT関数を使用することで、 last_name と first_name の文字列を結合することができた
文字列を結合するための関数
実際に操作してみよう
まずは新しくテーブルを作成する。
humanテーブルを作成する
create table human (id int(10), last_name varchar(20), first_name varchar(20), area varchar(10));
今回は、idカラム、 last_nameカラム、 first_nameカラム、 areaカラムを作成
実際にデータを追加する
insert into human (id, last_name, first_name, area) values (1, '鈴木', '一郎', '愛知県'), (2, '佐藤', '花子', '北海道'), (3, '平山', '吾郎', '香川県'), (4, '山田', '朋子', '静岡県'), (5, '田沢', '英二', '東京都');
humanテーブルを作成
では実際にCONCAT関数を使用して、last_name と first_nameを結合していく
select concat(last_name,'',first_name)from human;
このようにCONCAT関数を使用することで、 last_name と first_name の文字列を結合することができた
4-3. 3 REPLACE関数
REPLACE関数を使用すると、文字と文字を置き換えることができる
(引数に指定した文字列のなかに含まれる指定の文字列を新しい文字列に置き換えることができる)
構文
REPLACE (指定の文字列, 置き換える文字列, 置き換え後の文字列)
では実際に新しいテーブルを作成するところから始める。
create table staff (id int(10), name varchar(20), department varchar(20));
今回は、idカラム、 nameカラム、 departmentカラムを作成
データを追加する
insert into staff (id, name, department) values (1, '佐藤吾郎', '営業部'), (2, '鈴木一郎', '営業部'), (3, '佐藤花子', '総務部'), (4, '小泉京子', '経理部'), (5, '平山一雄', '開発部'), (6, '大石正明', '開発部'), (7, '田沢英二', '営業部');
staffテーブルを作成できた
この中の「開発部」を「システム開発部」に変更するとする。
select id, name, replace(department, '開発部', 'システム開発部') from staff;
このようにREPLACE関数を使用することで、「開発部」の項目を全て「システム開発部」に置き換えることができた。
(引数に指定した文字列のなかに含まれる指定の文字列を新しい文字列に置き換えることができる)
構文
REPLACE (指定の文字列, 置き換える文字列, 置き換え後の文字列)
では実際に新しいテーブルを作成するところから始める。
create table staff (id int(10), name varchar(20), department varchar(20));
今回は、idカラム、 nameカラム、 departmentカラムを作成
データを追加する
insert into staff (id, name, department) values (1, '佐藤吾郎', '営業部'), (2, '鈴木一郎', '営業部'), (3, '佐藤花子', '総務部'), (4, '小泉京子', '経理部'), (5, '平山一雄', '開発部'), (6, '大石正明', '開発部'), (7, '田沢英二', '営業部');
staffテーブルを作成できた
この中の「開発部」を「システム開発部」に変更するとする。
select id, name, replace(department, '開発部', 'システム開発部') from staff;
このようにREPLACE関数を使用することで、「開発部」の項目を全て「システム開発部」に置き換えることができた。
4-4. 4 INSERT関数
INSERT関数を使用すると、引数に指定した文字列の中の指定した位置から指定した長さの部分を別の文字列に置き換えることができる
実際に新しいテーブルを作成する
create table user (name varchar(20), area varchar(20));
nameカラムと、 areaカラムを作成
データを追加する
insert into user (name, area) values ('鈴木次郎', '静岡県静岡市葵区'), ('佐藤花子', '東京都文京区御徒町'), ('平山悟', '埼玉県さいたま市 南区'), ('大石正明', '大阪府堺市');
userテーブルを作成
ではここで areaカラムの 東京都文京区御徒町を変更する
変更後
東京都台東区御徒町
今回変更するのは、4文字目から3文字分(文京区)を新しい文字列(台東区)に置き換えて取得する
select insert('東京都文京区御徒町', 4, 3, '台東区');
指定の文字列を変更することができた
実際に新しいテーブルを作成する
create table user (name varchar(20), area varchar(20));
nameカラムと、 areaカラムを作成
データを追加する
insert into user (name, area) values ('鈴木次郎', '静岡県静岡市葵区'), ('佐藤花子', '東京都文京区御徒町'), ('平山悟', '埼玉県さいたま市 南区'), ('大石正明', '大阪府堺市');
userテーブルを作成
ではここで areaカラムの 東京都文京区御徒町を変更する
変更後
東京都台東区御徒町
今回変更するのは、4文字目から3文字分(文京区)を新しい文字列(台東区)に置き換えて取得する
select insert('東京都文京区御徒町', 4, 3, '台東区');
指定の文字列を変更することができた
5. 数値に関する関数
ここからは数値に関する代表的な関数を操作していく
5-1. 1 ROUND関数
ROUND関数を使用すると、引数に指定した値を四捨五入、切り捨て、切り上げ、または偶数の丸めを行った値を取得できる。
実際にROUND関数を操作していく。
select round(5.7), round(5.1);
四捨五入をした値を取得することができた。
今度は丸めを行う小数点の位置を変更して操作してみる。
select round(8.357, 0), round(8.357, 1), round(8.357, 2);
丸めの桁数が1の時は、 小数第一を四捨五入。
丸めの桁数が2の時は、小数第2位を四捨五入。
このように四捨五入したい桁数を指定するには、第二引数を使用する
四捨五入で整数を指定する場合は、第二引数にマイナスを指定する。
select round(178.77, -1);
このように第二引数にマイナスを指定することで整数にすることができた
実際にROUND関数を操作していく。
select round(5.7), round(5.1);
四捨五入をした値を取得することができた。
今度は丸めを行う小数点の位置を変更して操作してみる。
select round(8.357, 0), round(8.357, 1), round(8.357, 2);
丸めの桁数が1の時は、 小数第一を四捨五入。
丸めの桁数が2の時は、小数第2位を四捨五入。
このように四捨五入したい桁数を指定するには、第二引数を使用する
四捨五入で整数を指定する場合は、第二引数にマイナスを指定する。
select round(178.77, -1);
このように第二引数にマイナスを指定することで整数にすることができた
5-2. 2 FLOOR関数
FLOOR関数は、引数で指定した数値を切り下げて整数を求める関数。
実際に操作してみる
select floor(7.9), floor(-5.3), floor(6.7), floor(-8.3);
このようにFLOOR関数を使用することで、引数で指定した数値を切り下げて整数を求めることができた
実際に操作してみる
select floor(7.9), floor(-5.3), floor(6.7), floor(-8.3);
このようにFLOOR関数を使用することで、引数で指定した数値を切り下げて整数を求めることができた
5-3. 3 RAND関数
RAND関数を使用すると、0以上1.0未満の範囲でランダムな浮動小数点を生成することができる
select rand();
10以上15未満の乱数を生成する場合
select floor(10 + rand() * 5);
このように何回か実行すると、ランダムに生成されていることがわかる
select rand();
10以上15未満の乱数を生成する場合
select floor(10 + rand() * 5);
このように何回か実行すると、ランダムに生成されていることがわかる
6. 日付と時刻に関する関数
6-1. 1 DATE_FORMAT関数
MySQLでDATE_FORMAT関数を使用すると引数に指定した日付を表す値を指定のフォーマットで整形した文字列を取得できる。
→ 日付部分の値だけを取得
・DATETIME型
→ 日付と時間の両方の部分を含む値を取得
・TIMESTAMP型
→ 現在の日付および時間の更新を取得
→ 年、数字、4桁
%y
→ 年、数字、2桁
%M
→ 月名 (January..December)
%m
→ 月、数字(00…12)
→ 日にち、数字(00….31)
%W
→ 曜日名 (Sunday…..Saturday)
%w
→ 曜日 (0=Sunday….6=Saturday)
→ 時間(01….12)
%i
→ 分、数字(00….59)
%s
→ 秒 (00…59)
select date_format('2022-06-03', '%Y年%m月%d日');
DATE_FORMAT関数を使用することで、2022-06-03 を 2022年6月3日に変換することができた。
%Y(年、数字、4桁) %M(月名(January…December) %d(日、数字(00…31))に整形する
select date_format('2022-06-03', '%Y %M %d');
このようにDATE_FORMAT関数を使用することで、元になる日付と時刻の値からフォーマットにしたがって、値を取得することができる
日付型データには3種類ある。
・DATE型→ 日付部分の値だけを取得
・DATETIME型
→ 日付と時間の両方の部分を含む値を取得
・TIMESTAMP型
→ 現在の日付および時間の更新を取得
日付に関するフォーマット (よく使うフォーマットのみ紹介)
%Y→ 年、数字、4桁
%y
→ 年、数字、2桁
%M
→ 月名 (January..December)
%m
→ 月、数字(00…12)
日付に関するフォーマットの続き
%d→ 日にち、数字(00….31)
%W
→ 曜日名 (Sunday…..Saturday)
%w
→ 曜日 (0=Sunday….6=Saturday)
時刻に関して指定できるフォーマット(よく使うフォーマットのみ紹介)
%h→ 時間(01….12)
%i
→ 分、数字(00….59)
%s
→ 秒 (00…59)
実際に日付を取得してみる
%Y(年、数字、4桁) %m(月名) %d(00….31)select date_format('2022-06-03', '%Y年%m月%d日');
DATE_FORMAT関数を使用することで、2022-06-03 を 2022年6月3日に変換することができた。
%Y(年、数字、4桁) %M(月名(January…December) %d(日、数字(00…31))に整形する
select date_format('2022-06-03', '%Y %M %d');
このようにDATE_FORMAT関数を使用することで、元になる日付と時刻の値からフォーマットにしたがって、値を取得することができる
7. まとめ
ここまで集計関数や日付関数など実際に操作してみた。
SQLには今回紹介した関数以外にもまだ色々な関数があるので、後日紹介していこうと思う。
集計関数は、実際の開発現場でよく利用するので、操作に慣れておこう。
SQLの操作は、何回も反復して操作をしながら手で覚えていくことが大事なので、今後も繰り返し色々なSQL文を書いて練習してSQLのスキルを上げていこう
SQLには今回紹介した関数以外にもまだ色々な関数があるので、後日紹介していこうと思う。
集計関数は、実際の開発現場でよく利用するので、操作に慣れておこう。
SQLの操作は、何回も反復して操作をしながら手で覚えていくことが大事なので、今後も繰り返し色々なSQL文を書いて練習してSQLのスキルを上げていこう