SQL基礎: 構造化クエリ言語入門

# SQL基礎: 構造化クエリ言語入門
構造化クエリ言語(SQL)は、関係データベースを扱うために広く使用されている最も一般的なツールである。1970年代に開発され、現在では、データアナリスト、データベース管理者、および他のデータを扱うプロフェッショナルにとって必須のスキルと見なされています。この記事では、SQL基本事項の簡単な紹介を提供し、この強力なツールを使い始めるための手助けをします。

# SQLとは？
上記のように、SQLは構造化クエリ言語(Structured Query Language)の略で、関係データベースからデータを管理・操作・抽出するために用いられる特定のドメイン向けの言語です。関係データベースは、テーブルにデータを格納し、これらのテーブルをキーまたは外部キーを通じて関連付けることができます。SQLは、ユーザーがこれらのテーブルとその関係性と対話することを可能にし、大量のデータを管理するための非常に貴重なツールです。

# SQLを必要とする人々
ソフトウェア開発者やアナリスト、データサイエンティスト、データベース管理者など、SQL（構造化クエリ言語）を広く利用しています。金融システム、カスタマーリレーションシップマネジメントツール、在庫管理ソフトウェア、データウェアハウジングソリューションなど、大規模または複雑なデータセットを扱う必要がある場合、効率的にデータを管理し分析するためにSQLを使用することが必要です。現在、多くの企業では、データ分析またはデータベース管理に関わる職種にSQLの専門技術が必要とされています。

# SQLの主要なコンセプト
SQLの操作方法について深堀りする前に、以下の重要な概念を理解することが重要です。

*   テーブル: テーブルは行や列に整理されたデータの集合です。
*   行: 各行はテーブル内の単一のレコードを表します。
*   列: 各列は、テーブル内のレコードの特定の属性を表します。
*   キー: キーは、テーブル内の行をユニークに識別する属性または属性の組み合わせです。
*   外部キー: 外部キーとは、1つのテーブルの属性で、他のテーブルの主キーを参照するものです。


基本的なSQLコマンド
===========

SQLのキーとなる概念に慣れたら、SQLコマンドを書き始める準備ができます。ここでは、始めるためのいくつかの基本的なSQLコマンドを紹介します。

1.  SELECT：このコマンドはデータベースからデータを抽出するために使用されます。条件に基づいてテーブルから1つまたは複数の列を取得します。

例：`SELECT column_name FROM table_name;`

2.  INSERT：このコマンドはデータベースに新しいデータを挿入するために使用されます。指定された値を持つ新しい行がテーブルに追加されます。

例：`INSERT INTO table_name (column1, column2, column3) VALUES (value1, value2, value3);`

3.  UPDATE：このコマンドは、データベース内の既存のデータを更新するために使用されます。選択した行の値が変更されます。

例：`UPDATE table_name SET column_name = new_value WHERE some_column = some_value;`

4.  DELETE：このコマンドはデータベースからデータを削除するために使用されます。条件に基づいて1つまたは複数の行がテーブルから削除されます。

例：`DELETE FROM table_name WHERE some_column = some_value;`

5.  CREATE：このコマンドはデータベースに新しいテーブルまたはビューを作成するために使用されます。

例：`CREATE TABLE table_name (column1 datatype(length), column2 datatype(length), column3 datatype(length));`

6.  DROP：このコマンドは、既存のテーブル、ビュー、データベース、またはインデックスを削除するために使用されます。

例：`DROP TABLE table_name;`

Mysql 開発環境
==========

MacOS用
------

macOSでMySQL開発環境を構築するには、次の手順に従ってください。

1.  Homebrewをインストールします。Homebrewは、システム上にソフトウェアパッケージを簡単にインストールおよび管理できるmacOSのパッケージマネージャーです。 Homebrewをインストールするには、ターミナルを開いて次のコマンドを実行してください。

```shell
/bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"
```

2.  MySQLをインストールします。 Homebrewをインストールした後、MySQLをインストールするために使用できます。 ターミナルで次のコマンドを実行してください。

```shell
brew install mysql
```

3.  MySQLを開始します。 インストールが完了したら、以下のコマンドを実行してMySQLサーバーを開始してください。

```shell
mysql.server start
```

4.インストールをセキュリティ強化する必要があります。 それを行うには、次のコマンドを実行してください。

```shell
mysql_secure_installation
```

インストールのセキュリティに関するいくつかの質問が表示されます。

5.  MySQLにログインします。 MySQLにログインするには、以下のコマンドを入力してください。

```shell
mysql -u root -p
```

正しいパスワードを入力すると、MySQLにログインでき、データベースやテーブルを操作できます。

## Windows

https://dev.mysql.com/doc/refman/8.0/en/windows-installation.html


Example
=======

CREATE TABLE
------------

### 基本レベル

以下は、"users" テーブルを作成する例で、"id"、"name"、"age"、"email" の各列があります。

```SQL
CREATE TABLE users (
  id INT PRIMARY KEY,
  name VARCHAR(50),
  age INT,
  email VARCHAR(100)
);
```

この例では、4つの列を持つ "users" テーブルを作成しています。 "id" 列はテーブルのプライマリーキーとして機能する整数です。 "name" 列は、最大50文字まで格納できる可変長の文字列です。"age" 列は、ユーザーの年齢を格納する整数です。最後に、 "email" 列は、最大100文字まで格納できる可変長の文字列で、ユーザーに関連する電子メールアドレスを表します。

### 中級レベル

ブログサービス用に `users` と `posts` テーブルを作成する SQL コマンドの例：

```SQL
CREATE TABLE users (
  id INT NOT NULL AUTO_INCREMENT,
  username VARCHAR(50) NOT NULL,
  email VARCHAR(100) NOT NULL,
  password VARCHAR(255) NOT NULL,
  PRIMARY KEY (id)
);

CREATE TABLE posts (
  id INT NOT NULL AUTO_INCREMENT,
  user_id INT NOT NULL,
  title VARCHAR(255) NOT NULL,
  body TEXT NOT NULL,
  created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
  updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
  PRIMARY KEY (id),
  FOREIGN KEY (user_id) REFERENCES users(id)
);
```

この SQL コードは、2つのテーブル、 `users` と `posts` を必要な列とともに作成します。 `users` テーブルには `id`、`username`、`email`、および `password` の列が含まれています。一方、 `posts` テーブルには、`id`、`user_id`、`title`、`body`、`created_at`、および `updated_at` の列が含まれています。`posts` テーブルの `user_id` フィールドは、 `users` テーブルの `id` フィールドを参照しています。

DROP TABLE
----------

「users」テーブルを使用したSQL DROP TABLE実装の例：

```sql
DROP TABLE users;
```

このステートメントは、データベースから「users」テーブルとその中に含まれるすべてのデータを永久に削除します。テーブルが削除されたら、データを取得する方法はありません。テーブルを削除するなど、潜在的に破壊的な操作を実行する前にデータをバックアップすることが重要です。

SELECT
------

「users」という名前のテーブルには、「id」、「name」、「age」、「email」という列があります。そして、18歳以上の年齢の列を持つテーブルからレコード全体を選択したい場合、次のSQLクエリを書くことができます。

```SQL
SELECT * FROM users WHERE age >= 18;
```

これにより、「age」が18以上のすべてのレコードが返されます。「_」シンボルは、テーブルからすべての列を選択することを意味します。特定の列のみを選択したい場合は、「_」を選択したい列の名前に置き換えることができます（たとえば、「SELECT name、email FROM users WHERE age> = 18」とすることができます）。


SELECT INNER JOIN
-----------------

SQLのSELECT INNER JOINコマンドを実装する例です。usersとpostsのテーブルがある場合、同時にユーザーとポストの情報を取得します。

```SQL
SELECT
    users.name,
    posts.title,
    posts.content
FROM
    users
INNER JOIN
    posts
ON
    users.id = posts.user_id;
```

このクエリは、1つ以上の投稿をしたすべてのユーザーと、それらの投稿のタイトルと内容を返します。ユーザーが投稿を書いていない場合、結果に含まれません。

LEFT JOIN
---------

SQLのSELECT LEFT JOINコマンドを実装する例です。usersとpostsのテーブルがある場合、左側がusersで右側がpostsであるような全レコードを取得します。

"users"と "posts"という2つのテーブルがあります。 "user\_id"が一致する"posts"テーブルからのレコードと共に "users"テーブルのすべてのレコードを取得したい場合。また、ユーザーに記事がない場合でも、その情報を返すことを望みます。

```SQL
SELECT 
  users.id,
  users.name,
  posts.title,
  posts.body
FROM 
  users
LEFT JOIN 
  posts 
    ON users.id = posts.user_id;
```

このクエリでは、`LEFT JOIN`は共通の列`user_id`に基づいて、`users`テーブルからすべてのレコードと `posts`テーブルから対応するレコードを返します。もし投稿をしていないユーザーがいた場合は、投稿に関連する列の値にNULL値が含まれることになります。

注意：`LEFT JOIN`では、左側のテーブル（`users`）が選択され、右側のテーブル（`posts`）から関連する行が選択されます。右側に一致しないレコードがある場合、NULL値が右側の列の値の代わりにそこにあります。

RIGHT JOIN
----------

SQLのSELECT RIGHT JOINコマンドを実装する例です。usersとpostsのテーブルがある場合、右側がusersで左側がpostsであるような全レコードを取得します。

前提として、`users`テーブルには`id`、`username`、`email`、`joined_at`の列があり、`posts`テーブルには`id`、`title`、`content`、そして`user_id`の列があります。

`users`テーブルからすべての行を取得し、`user_id`列で一致する場合に対応する`posts`テーブルの行を含める場合は、次のSQLクエリを使用できます。

```SQL
SELECT *
FROM users
RIGHT JOIN posts
ON users.id = posts.user_id;
```

これにより、 `users`テーブルからすべての行、`posts`テーブルから`user_id`列で`users`テーブルの`id`列と一致する行が含まれるすべての行が返されます。`posts`の特定の行に対応する`users`の行が見つからない場合は、`users`の列には`NULL`値が含まれます。


INSERT INFO
-----------

"users"テーブルに新しい行を追加するためのSQL INSERT INTO文の例：

1つのレコードを挿入する場合：

```sql
INSERT INTO users (id, name, age, email)
VALUES (1, 'John Smith', 25, 'john@example.com');
```

注：id列を指定しない場合、データベースの構成に応じて、プライマリキー列の値が自動的に生成される場合があります。

一度に複数のレコードを挿入する場合：

```sql
INSERT INTO users (name, age, email) VALUES 
  ('Sarah Johnson', 29, 'sarah@example.com'),
  ('Michael Brown', 32, 'michael@example.com'),
  ('Lisa Davis', 24, 'lisa@example.com');
```

これにより、指定された値を持つ3つの新しい行がusersテーブルに挿入されます。

UPDATE
------

SQL UPDATEの実装の例：

id 1のユーザーの名前を更新したいとします。 次のSQLステートメントを使用してそれを達成できます。

```SQL
UPDATE users
SET name = 'John'
WHERE id = 1;
```

これにより、idが1に等しい場所でユーザーの名前が「John」に更新されます。

同様に、複数の列を更新する必要がある場合は、次の構文を使用できます。

```SQL
UPDATE users
SET name = 'John', age = 30, email = 'john@example.com'
WHERE id = 1;
```

このステートメントのSET句で指定されたものと同じく、idが1のuserの"name"、"age"、"email"カラムが更新されます。

DELETE
------

"users" テーブルのSQL DELETE実装の例：

```sql
DELETE FROM users WHERE id = 1;
```

このクエリは、“id”列が1の行を“users”​テーブルから削除します。 "users"テーブルからすべての行を削除する場合は、WHERE句を単純に省略できます：

```sql
DELETE FROM users;
```

DELETEコマンドを使用する際には慎重に行う必要があります。データは永久にテーブルから削除されるため、削除ステートメントを実行する前にデータをバックアップし、条件を二重に確認することが重要です。

まとめ
---

SQLは、関係データベースからデータを管理し、操作し、取得するための非常に強力なツールです。 この記事ではSQLの基礎について触れただけですが、堅固な基盤を築くことができます。 初心者でも経験豊富なプロフェッショナルでも、SQLを学習することでデータと分析の作業効率が上がります。 SQLコマンドを試行錯誤し、練習し続けて、この有用なツールのマスターになってください。