【コード・出力結果付き】よく使うMySQLの関数をわかりやすく説明【16選】

<br>
`MySQL`の学習を進める中で、知識のストックができてきたので、アウトプットがてら**使用頻度が高そうな関数クエリ**について、まとめて行きたいと思います。
<br>
<br>

## 用語解説
テーブル名：nameList

| id  | name | age | 
| :-: | :--: | :-: | 
| 1   | Abe  | 42  | 
| 2   | Ide  | 31  | 
| 3   | Hide | 24  | 
| 4   | Ide  | 39  | 

#### テーブル
表の事。(上記なら nameList というテーブル名。)

#### レコード
表の行の事。(上記なら4つのレコードが存在する。)

#### カラム
表の列の事。(上記なら3つのカラムが存在する。)
<br>
<br>

## 数値の表示に関する関数
### 絶対値 - ABS()
```sql
SELECT ABS(-10);
SELECT ABS(10);
```
`ABS()`は括弧の中の値の、**絶対値**を求める事ができます。
出力結果はこちら。

```
10
10
```
<br>
<br>

### 四捨五入 - ROUND()
```sql
SELECT ROUND(2.4);
SELECT ROUND(2.5);
```
`ROUND()`は括弧の中の値を、**四捨五入した結果**を求めます。
出力結果はこちら。

```
2
3
```
<br>
<br>

### 小数点以下を切り上げ - CELL()
```sql
SELECT CEIL(2.4);
SELECT CEIL(2.5);
```
`CEIL()`は括弧の中の小数点以下の値を、**切り上げした結果**を求めます。
出力結果はこちら。

```
3
3
```
<br>
<br>

### 小数点以下を切り下げ - FLOOR()
```sql
SELECT FLOOR(2.4);
SELECT FLOOR(2.5);
```
`FLOOR()`は括弧の中の小数点以下の値を、**切り下げした結果**を求めます。
出力結果はこちら。

```
2
2
```
<br>
<br>

### 少数の桁数を指定 - TRUNCATE()
```sql
SELECT TRUNCATE(1.7589012, 4);
SELECT TRUNCATE(1.75, 4);
```
`TRUNCATE()`は第一引数の**小数点以下の表示桁数**を、**第二引数で指定**する事ができます。
出力結果はこちら。

```
1.7589
1.7500
```
<br>
<br>
<br>

## 数値の計算を行う関数
使用するテーブル名：nameList

| id  | name | age | 
| :-: | :--: | :-: | 
| 1   | Abe  | 42  | 
| 2   | Ide  | 31  | 
| 3   | Hide | 24  | 
| 4   | Ide  | 39  | 
<br>

### レコード数を取得 - COUNT()
```sql
SELECT COUNT(id) FROM nameList;
SELECT COUNT(id) FROM nameList WHERE name = "Ide";
```
`COUNT()`は**レコードの数を取得**する事ができます。条件を指定すれば、その条件に当てはまるレコード数が取得できます。

>*利用例：注文数の集計、会員者数の集計　...etc*

上記の２行目なら、`nameListテーブル`で`nameカラムがIde`のレコード数を取得する事ができます。(引数はどのカラム名でも同じ結果。)
出力結果はこちら。

```
4
2
```
<br>
<br>



### 合計値を取得 - SUM()
```sql
SELECT SUM(age) FROM nameList;
SELECT SUM(age) FROM nameList WHERE name = "Ide";
```
`SUM()`は**合計値を取得**する事ができます。また条件を指定すれば、その条件に当てはまるレコードで、合計値が取得できます。

>*利用例：注文した商品の合計金額を求める、月間の売り上げ金額を求める　...etc*

上記の２行目なら、`nameListテーブル`で`nameカラムがIde`のレコードで、`ageカラムの合計値`が取得できます。
出力結果はこちら。

```
136
70
```
<br>
<br>



### 平均値を取得 - AVG()
```sql
SELECT AVG(age) FROM nameList;
SELECT AVG(age) FROM nameList WHERE name = "Ide";
```
`AVG()`は**平均値を取得**する事ができます。また条件を指定すれば、その条件に当てはまるレコードで、平均値が取得できます。

>*利用例：利用者の平均注文金額を求める、月別で平均売り上げを求める　...etc*

上記の２行目なら、`nameListテーブル`で`nameカラムがIde`のレコードで、`ageカラムの平均値`が取得できます。
出力結果はこちら。

```
34
35
```
Ideさんの平均年齢は35歳のようです。
<br>
<br>



### 最大値を取得 - MAX()
```sql
SELECT MAX(age) FROM nameList;
SELECT MAX(age) FROM nameList WHERE name = "Ide";
```
`MAX()`は**最大値を取得**する事ができます。また条件を指定すれば、その条件に当てはまるレコードで、最大値が取得できます。

>*利用例：最も値段の高い商品を求める、最も売り上げた月の金額を求める　...etc*

上記の２行目なら、`nameListテーブル`で`nameカラムがIde`のレコードで、`ageカラムの最大値`が取得できます。
出力結果はこちら。

```
42
39
```
Ideさんの中で一番上の年齢は、39歳のようですね。
<br>
<br>



### 最小値を取得 - MIN()
```sql
SELECT MIN(age) FROM nameList;
SELECT MIN(age) FROM nameList WHERE name = "Ide";
```
`MIN()`は選択された範囲内の**最小値を取得**する事ができます。また条件を指定すれば、その条件に当てはまるレコードで、最小値が取得できます。

>*利用例：最も値段の高い商品を求める、最も売り上げた月の金額を求める　...etc*

上記の２行目なら、`nameListテーブル`で`nameカラムがIde`のレコードで、`ageカラムの最小値`が取得できます。
出力結果はこちら。

```
24
31
```
Ideさんの中で一番下の年齢は、31歳のようです。
<br>
<br>
<br>

## 文字に関する関数

使用するテーブル名：nameList

| id  | name | age | 
| :-: | :--: | :-: | 
| 1   | Abe  | 42  | 
| 2   | Ide  | 31  | 
| 3   | Hide | 24  | 
| 4   | Ide  | 39  | 
<br>

### 文字列の連結 - CONCAT()
```sql
SELECT CONCAT("これは", "見本です。");
SELECT CONCAT(name, "は", age, "歳です。") FROM nameList;
```
`CONCAT()`は**文字列の<font color=red>連結</font>した結果**を取得する事ができます。また数値の連結や、数値と文字列の連結、カラムから取得した数値や文字列の連結にも使用できます。

>*使用例：利用者の名前と注文した商品名を任意の文字列で連結して出力　...etc*

上記の２行目なら、`nameListテーブル`から取得した`nameカラムの値`と`ageカラムの値`を、文字列として取得する事ができます。
出力結果はこちら。

```
これは見本です。
Abeは32歳です。
Ideは31歳です。
Hideは24歳です。
Ideは39歳です。
```
<br>
<br>



### 文字列の小文字化 - LOWER()
```sql
SELECT LOWER("ABC abc");
SELECT LOWER(name) FROM nameList;
```
`LOWER()`は**括弧内の文字列を<font color=red>小文字化</font>した結果**を取得する事ができます。

>*使用例：入力された値を小文字化してデータベースに保存(INSERT)、データベースに保存されている値を小文字化して取得(SELECT)　...etc*

上記の２行目なら、`nameListテーブル`の`nameカラム`を小文字化して取得する事ができます。
出力結果はこちら。

```
abc abc
abe
ide
hide
ide
```
<br>
<br>



### 文字列の大文字化 - UPPER()
```sql
SELECT UPPER("ABC abc");
SELECT UPPER(name) FROM nameList;
```
`UPPER()`は**括弧内の文字列を<font color=red>大文字化</font>した結果**を取得する事ができます。

>*使用例：入力された値を大文字化してデータベースに保存(INSERT)、データベースに保存されている値を大文字化して取得(SELECT)　...etc*

上記の２行目なら、`nameListテーブル`の`nameカラム`を大文字化して取得する事ができます。
出力結果はこちら。

```
ABC ABC
ABE
IDE
HIDE
IDE
```
<br>
<br>



### 文字列の文字数 - CHAR_LENGTH()
```sql
SELECT CHAR_LENGTH("abcd");
SELECT CHAR_LENGTH("日本語");

SELECT CHAR_LENGTH(name) FROM nameList;
```
`CHAR_LENGTH()`は**括弧内の文字列の<font color=red>文字数を計算</font>した結果**を取得する事ができます。(日本語も使用可能)

>*使用例：パスワードなどの入力された値が８文字以上か判断する材料　...etc*

上記の３行目なら、`nameListテーブル`の`nameカラム`の文字数を取得する事ができます。
出力結果はこちら。

```
4
3

3
3
4
3
```
※わかりやすくする為に、改行を挟んでいます。
<br>
<br>
<br>

## 日付に関する関数

### 現在の年月日と時刻 - CURRENT()
```sql
SELECT CURRENT_DATE();
SELECT CURRENT_TIME();
SELECT CURRENT_TIMESTAMP()
```
`CURRENT_DATE()`は現在の**年月日**を取得。
`CURRENT_TIME()`は現在の**時刻**を取得。
`CURRENT_TIMESTAMP()`は現在の**年月日と時刻**を取得。

仮に2020年1月1日、10時20分30秒の時の出力結果はこちら。

```
2020-01-01
10:20:30
2020-01-01 10:20:30
```
因みにデフォルトの設定のままで、これを取得しようとすると、<font color=red>日本のタイムゾーンとは異なる</font>ので、日本のタイムゾーンで取得したい場合は、**別途設定が必要**になります。(これは日付に関する関数全般に関わります。)
<br>
<br>



### 曜日の取得 - DAYNAME()
```sql
SELECT DAYNAME("2020-01-01");
```
`DAYNAME()`は**括弧内の曜日**を取得する事ができます。
出力結果はこちら。

```
Wednesday
```
2020年1月1日の曜日は、Wednesday(水曜日)のようです。

<br>
<br>
<br>

## まとめ
ここで紹介した以外にも関数はありますが、個人的に使用頻度が低そうだったので、除外しております。もし他にも知りたい場合は、MySQLの公式リファレンスや他の記事を参照してみてください。

最後まで読んでくださり、ありがとうございました！

<br>
<br>
<br>

筆者：yuki｜学習10日目で初案件獲得→現在はフルスタックエンジニア転職に向けて学習中
Qiita：https://qiita.com/yuki4839
Twitter：https://twitter.com/yuki35522891