急に「Amazon Aurora MySQL」を担当する事になった。

昨年、数年ぶりに、業務でデータベースのインフラを担当する事になり、
基本的な操作がパッと出て来なくて、苦労したので、内容をまとめていました。
読んでくれている貴方も、__急に「Amazon Aurora MySQL」を担当する事になった。__ 
なんて事があるかも知れません。
__そんな方のお役に立ちたいので、__ クリスマスプレゼントのつもりで、ちらりと公開させて頂きます。

Aurora MySQLインスタンスの作成
--
AWSコンソールにログインして、Aurora MySQLインスタンスを作成するための手順
1.	Amazon RDSコンソールにアクセスし、左側のメニューから「Databases」を選択します。
2.	「Create database」ボタンをクリックします。
3.	データベースエンジンとして「Amazon Aurora」を選択し、その後「Amazon Aurora with MySQL compatibility」を選択します。
4.	インスタンスの詳細を設定し、必要な情報を入力します。この情報には、インスタンスのサイズ、ストレージ、セキュリティグループ、パスワード、バックアップなどが含まれます。
5.	「Create database」ボタンをクリックして、インスタンスを作成します。
6.	Aurora MySQLインスタンスに接続する

Aurora MySQLインスタンスに接続する
--
1.	AWSコンソールにログインします。
2.	左側のメニューから「Amazon RDS」を選択します。
3.	インスタンスを選択し、その後「Connectivity & security」タブを選択します。
4.	セキュリティグループでインバウンドトラフィックを許可する必要がある場合は、必要な設定を行います。
5.	エンドポイント、ポート、ユーザー名、パスワードなどの情報を使用して、Aurora MySQLインスタンスに接続します。
6.	Aurora MySQLインスタンスでデータベースを作成する

Aurora MySQLインスタンスにデータベースを作成し、
データベースを使用する
--
1.	接続したいAurora MySQLインスタンスに接続します。
2.	MySQLコマンドを使用して、新しいデータベースを作成します。例えば、以下のようにします。
~~~
CREATE DATABASE mydatabase; 
~~~
3.	データベースを使用するには、以下のようにしてデータベースに接続します。
~~~
USE mydatabase;
~~~

Aurora MySQLでテーブルを作成する
--
~~~
CREATE TABLE employees (
  id INT NOT NULL AUTO_INCREMENT,
  first_name VARCHAR(50),
  last_name VARCHAR(50),
  email VARCHAR(100),
  PRIMARY KEY (id)
);
~~~
データの挿入
--
テーブルを作成したら、データを挿入することができます。例えば、次のようなクエリを実行することで、employeesテーブルに新しい行を挿入できます。
~~~
INSERT INTO employees (first_name, last_name, email) VALUES ('John', 'Doe', 'john.doe@example.com'); 
~~~
データの更新
--
データを更新するには、UPDATE文を使用します。例えば、次のようなクエリを実行することで、employeesテーブルのデータを更新できます。
~~~
UPDATE employees SET email = 'jane.doe@example.com' WHERE id = 1; 
~~~
データの削除
--
データを削除するには、DELETE文を使用します。例えば、次のようなクエリを実行することで、employeesテーブルからデータを削除できます。
~~~
DELETE FROM employees WHERE id = 1; 
~~~

このように、Aurora MySQLはMySQLと同様に使用できます。
--

SQLのWHERE句
--
SQLのWHERE句は、データベース内のテーブルから特定の条件に基づいて行を選択するために使用されます。WHERE句を使用することで、クエリが返す行の数を減らし、必要な情報に特化したクエリを作成することができます。

WHERE句の基本的な構文は以下の通りです。
~~~
SELECT column_name(s)
FROM table_name
WHERE condition;
~~~
ここで、column_name(s)は返される列の名前を指定するためのコンマ区切りのリストです。table_nameは対象とするテーブルの名前です。そして、conditionは行を選択するための条件を指定します。

たとえば、以下のようなCustomersテーブルがあるとします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2920213/854b85ec-b59d-7c1f-6e6a-5cfd2e808565.png)

次のクエリは、Country列が'Mexico'の顧客情報を取得します。
~~~
SELECT *
FROM Customers
WHERE Country = 'Mexico';
~~~
このクエリでは、Customersテーブルからすべての列を取得し、WHERE句を使用してCountry列が'Mexico'の行のみを選択します。結果は以下のようになります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2920213/0149aa08-e9c7-1493-a20d-6cbe59845b07.png)
WHERE句を使用することで、テーブル内の特定の行を選択することができます。条件をより複雑にすることもできます。たとえば、複数の条件を組み合わせることもできます。WHERE句は、SQLで最も一般的に使用されるキーワードの1つです。

SQLのGROUP BY句
--
SQLのGROUP BY句は、特定の列をグループ化し、
そのグループに関する集計情報を取得するために使用されます。

以下は、GROUP BY句の基本的な構文です。
~~~
SELECT column1, column2, ..., aggregate_function(columnx)
FROM table
GROUP BY column1, column2, ...;
~~~
SELECT句には、グループ化する列と、集計関数が含まれます。
FROM句には、データを取得するテーブルが含まれます。
GROUP BY句には、グループ化する列が含まれます。
例えば、以下のテーブルがあるとします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2920213/351e115e-c277-fe9e-a71f-b2b9cab9a8f8.png)
このテーブルを使って、以下のようなクエリを実行することができます。
~~~
SELECT gender, AVG(age)
FROM table
GROUP BY gender;
~~~
これにより、性別ごとの平均年齢が返されます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2920213/ec172574-cfe3-60a5-6dcc-aa166ca10ddd.png)
上記クエリでは、gender列をグループ化して、
AVG関数により各グループの平均年齢を計算しています。

SQLのJOIN句
--
SQLのJOIN句は、複数のテーブルから必要なデータを取得するために使用されます。JOIN句は、異なるテーブルの列の値を基準に、テーブルを結合します。

JOIN句には、いくつかのタイプがありますが、最も一般的なタイプは INNER JOINです。 INNER JOINは、2つのテーブルの間で共通の値を持つ列を使用して、行を結合します。 その他のJOINタイプには、LEFT JOIN、RIGHT JOIN、FULL OUTER JOINなどがあります。

以下は、INNER JOINの基本的な構文です。
~~~
SELECT table1.column1, table2.column2, ...
FROM table1
INNER JOIN table2
ON table1.join_column = table2.join_column;
~~~
SELECT句には、結果に含める列が含まれます。
FROM句には、データを取得するテーブルが含まれます。
INNER JOIN句には、結合するテーブルが含まれます。
ON句には、結合条件が含まれます。結合条件は、2つのテーブルの間で共通の列を指定します。
例えば、以下の2つのテーブルがあるとします。

テーブル1:
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2920213/8f6e761f-a50e-5b56-da2d-f4f6b87ac248.png)
テーブル2:
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2920213/0d0a3565-a83f-49ce-cb12-324afe76d6ab.png)
これらのテーブルをJOIN句を使って結合するには、以下のようにクエリを実行します。
~~~
SELECT table1.id, table1.name, table2.department
FROM table1
INNER JOIN table2
ON table1.id = table2.id;
~~~
このクエリにより、以下のような結果が得られます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2920213/e5ce4062-3537-e485-2f6c-6eba1db2b06f.png)
上記のクエリでは、2つのテーブルのid列を基準にINNER JOINで結合し、テーブル1からid、name列とテーブル2からdepartment列を取得しています。

SQLのUNION ALL句
--
SQLのUNION ALL句は、複数のSELECTステートメントの結果セットを1つの結果セットに結合するために使用されます。UNION ALL句は、重複した行を削除せずに、すべての結果を返します。

以下は、UNION ALL句の基本的な構文です。
~~~
SELECT column1, column2, ...
FROM table1
UNION ALL
SELECT column1, column2, ...
FROM table2;
~~~
各SELECTステートメントで返される列は同じ数である必要があります。
列のデータ型は同じである必要があります。
例えば、以下の2つのテーブルがあるとします。

テーブル1:
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2920213/92545fdc-7a9f-62f8-62f2-a77f7089e9b7.png)
テーブル2:
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2920213/52e3706f-5a6f-4f88-0504-d3ca1822dcb1.png)
これらのテーブルをUNION ALL句を使って結合するには、以下のようにクエリを実行します。
~~~
SELECT id, name, age
FROM table1
UNION ALL
SELECT id, name, age
FROM table2;
~~~
このクエリにより、以下のような結果が得られます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2920213/0abf0dfb-c7e2-6536-4031-fc7d67f7651e.png)
上記のクエリでは、2つのテーブルの列をUNION ALL句で結合し、重複を削除せずに、すべての行を結果として返します。

SQLのDISTINCTキーワード
--
SQLのDISTINCTキーワードは、SELECT文で指定された列の一意の値のみを返します。つまり、重複した値を除去して結果セットを返します。

使用方法の例を示します。

例1：単一の列を持つ表でDISTINCTを使用する

以下の例は、単一の列を持つ表でDISTINCTを使用する方法を示しています。
~~~
SELECT DISTINCT column_name
FROM table_name;
~~~
例えば、以下のようなCustomersテーブルがあるとします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2920213/2145d03c-4d71-6299-66d8-19cfc5140513.png)

以下のクエリは、Customersテーブルから一意の国名のリストを取得します。
~~~
SELECT DISTINCT Country
FROM Customers;
~~~
結果は次のようになります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2920213/21ec2dbe-8470-cb05-e4b1-7057ba46155a.png)

例2：複数の列を持つ表でDISTINCTを使用する

以下の例は、複数の列を持つ表でDISTINCTを使用する方法を示しています。
~~~
SELECT DISTINCT column_name1, column_name2, ...
FROM table_name;
~~~

例えば、以下のようなOrdersテーブルがあるとします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2920213/c324c925-1492-7d60-fc93-37e706db38f5.png)
以下のクエリは、一意の顧客IDと注文日のリストを取得します。
~~~
SELECT DISTINCT CustomerID, OrderDate
FROM Orders;
~~~
結果は以下のようになります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2920213/899974eb-6a5c-fbc0-12a0-18d0a39f2e4a.png)

SQLのWITHキーワード
--
SQLのWITHキーワードは、クエリ内で一時的なビューを作成するために使用されます。
WITHキーワードを使用することで、複雑なクエリを簡素化することができ、クエリの可読性と再利用性を向上することができます。

WITHキーワードを使用する構文は以下の通りです。
~~~
WITH temporary_view AS (
   SELECT column_name(s)
   FROM table_name
   WHERE condition
)
SELECT *
FROM temporary_view;
~~~
temporary_viewは一時的なビューの名前で、SELECT文で使用されます。temporary_view内のクエリは、任意のSELECT文と同様に構築されます。temporary_viewを含むSELECT文の後に続くSELECT文は、一時的なビューで定義された列を使用することができます。

例えば、以下のようなEmployeesテーブルがあるとします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2920213/4df4c3e0-2d2e-b377-8431-ef16d5f2ef18.png)
以下のクエリは、部署ごとの従業員数を一時的なビューを使用して取得します。
~~~
WITH employee_count AS (
   SELECT Department, COUNT(*) AS num_employees
   FROM Employees
   GROUP BY Department
)
SELECT Department, num_employees
FROM employee_count;
~~~
このクエリは、EmployeesテーブルからDepartment列をグループ化し、各部署ごとに従業員数を数えます。そして、一時的なビューであるemployee_countを作成し、SELECT文で使用します。結果は以下のようになります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2920213/f8722e98-8977-e89d-22d1-b9ef02aa1af6.png)
WITHキーワードを使用することで、クエリ内に一時的なビューを作成することができ、クエリを簡素化することができます。

SQLのCOALESCE 関数
--
COALESCE 関数は、渡された複数の引数のうち、最初に NULL 以外の値を返すものを返します。つまり、COALESCE 関数は、最初の引数から順番に NULL 以外の値があるかどうかをチェックし、最初に NULL 以外の値を見つけた場合にその値を返します。引数がすべて NULL の場合、COALESCE 関数は NULL を返します。
~~~
SELECT COALESCE(column1, column2, column3) AS result_column
FROM table_name;
~~~
このクエリは、column1、column2、column3 のうち、最初に NULL 以外の値を result_column として返します。つまり、column1 が NULL でない場合、column1 の値が返されます。column1 が NULL の場合、column2 の値が返されます。column1 と column2 がともに NULL の場合、column3 の値が返されます。column1、column2、column3 がすべて NULL の場合、result_column は NULL になります。

COALESCE 関数は、NULL を非常に扱いやすくするため、よく使われます。例えば、テーブルの列に NULL が含まれている場合、その列を集計する場合に COALESCE 関数を使用すると、NULL 値を適切に扱うことができます。欠損値をデフォルト値に置き換える方法。
例として、以下のようなテーブルがあると仮定してください。
~~~
employees
| id | first_name | last_name | salary |
|----|------------|-----------|--------|
| 1  | John       | Smith     | 50000  |
| 2  | Jane       | Doe       | NULL   |
| 3  | Bob        | Johnson   | 60000  |
| 4  | Alice      | Lee       | NULL   |
~~~
このテーブルからCoalesce関数を使用して、各従業員の給与を取得する例を示します。
(salary列のNULLをデフォルト値である0に置き換える)
~~~
SELECT id, first_name, last_name, COALESCE(salary, 0) AS salary
FROM employees;
~~~
上記のクエリを実行すると、以下のような結果が得られます。
~~~
| id | first_name | last_name | salary |
|----|------------|-----------|--------|
| 1  | John       | Smith     | 50000  |
| 2  | Jane       | Doe       | 0      |
| 3  | Bob        | Johnson   | 60000  |
| 4  | Alice      | Lee       | 0      |
~~~
給与がNULLの従業員の場合、Coalesce関数は0を返します。これにより、各従業員の給与が取得され、NULLの値が0に置き換えられます。

例1: COALESCE関数を使用して、列の値がNULLの場合に代替値を返す。

~~~
SELECT COALESCE(column_name, 'N/A') FROM table_name;
~~~
この例では、column_nameがNULLである場合、代替値としてN/Aが返されます。

例2: COALESCE関数を使用して、複数の列のうち最初の非NULL値を返す。

~~~
SELECT COALESCE(column1, column2, column3) FROM table_name;
~~~
この例では、column1、column2、およびcolumn3のいずれかがNULLである場合、最初に非NULL値が返されます。

例3: COALESCE関数を使用して、サブクエリの結果がNULLである場合に代替値を返す。

~~~
SELECT COALESCE((SELECT column_name FROM table_name WHERE condition), 'N/A');
~~~
この例では、conditionが満たされない場合、サブクエリの結果はNULLとなります。COALESCE関数を使用することで、代替値としてN/Aを返すことができます。

例4：Coalesce関数を使用して、2つの列の非NULL値を結合する

~~~
SELECT Coalesce(column1, column2) AS result
FROM table_name;
~~~
この例では、table_nameというテーブルから、column1とcolumn2の値を結合して、resultというエイリアス名で表示します。もしcolumn1の値がNULLであれば、Coalesce関数はcolumn2の値を返します。

例5：Coalesce関数を使用して、複数のテーブルの値を結合する

~~~
SELECT Coalesce(table1.column1, table2.column2, table3.column3) AS result
FROM table1
LEFT JOIN table2 ON table1.id = table2.id
LEFT JOIN table3 ON table1.id = table3.id;
~~~
この例では、3つのテーブル（table1、table2、table3）から、idが一致する値を結合して、Coalesce関数を使用して非NULL値を結合します。もしtable1.column1の値がNULLであれば、Coalesce関数はtable2.column2の値を返し、table2.column2の値もNULLであれば、table3.column3の値を返します。

例6：COALESCEを使用して、NULLを回避する方法
~~~
SELECT COALESCE(column1, column2, column3, 'No value') AS result FROM table_name;
~~~
上記の例では、3つの列（column1、column2、column3）のいずれかがNULLである場合、'No value'が返されます。

例7：COALESCEを使用して、複数の列の値を結合する方法
~~~
SELECT COALESCE(column1 || ' ', '') || COALESCE(column2 || ' ', '') || COALESCE(column3 || ' ', '') AS result FROM table_name;
~~~
上記の例では、3つの列（column1、column2、column3）の値を連結して返します。NULLの値がある場合は、その列の値を空文字列に変換して連結します。

上記の例は、各列の値をスペースで区切って連結する例です。適宜、区切り文字を変更することも可能です。

参考にして頂けたら、幸いです。
--

そういえば、チューニングやバックアップも考慮したなぁと。。

Amazon Aurora MySQL　SQLチューニング
https://qiita.com/kimuni-i/items/e58f3c6b5e8f4d7ddab6

不要なインデックスを削除して、パフォーマンスをチューニング
https://qiita.com/kimuni-i/items/101f1673141cb92a987d

Amazon Aurora MySQLのWell-Architected基本構成を確認してみた
https://qiita.com/kimuni-i/items/d657f4c2924c2acaefc3

MySQLバックアップ　基本
https://qiita.com/kimuni-i/items/c2ff7e735e67c10613a5

DynamoDB テーブルに保存されている項目にLambda 関数で、アクセスしたい時
https://qiita.com/kimuni-i/items/d3f36a90b3988fe3e5f9