適切なデータ管理がなければ、ビジネスにおけるサステナビリティ(持続可能性)の実現は困難です。明確に定義されたシステムを構築することは、社内外の業務を管理するために不可欠です。ビジネスデータに関する詳細なインサイトは、全体のワークフローを理解し、パフォーマンスを測定するのに役立ちます。さらに、データベースを使用することで時間を節約し、情報に簡単にアクセスできるようになります。
データベースとは何ですか?
データベース(database)は、情報を安全な方法で保存するために使用される整理されたシステムです。カテゴリ分け機能を提供し、同様の種類のアイテムを1つのグループに分類するためのテーブルを作成できます。テーブルは、複数の行と列に情報をリストするオプションを提供します。その結果、データの品質と一貫性が向上します。保存機能やアクセスしやすさに加えて、データベースはプライバシーの保護やシステムのセキュリティ確保において重要な役割を果たします。アドホックなものであれ、アプリケーションにコード化されたプロセスの一部であれ、データを取得することはデータベース管理の最も重要な側面の1つです。
クエリ(query)は、リレーショナルDMSにおいて、テーブルからデータを取得するために使用される任意のコマンドです。 SELECT 文は、ほぼ常に Structured Query Language(SQL)クエリで使用されます。データベースから情報を取得する方法はいくつかあります。一般的に、開発者は高速で効果的であるため、コマンドラインオプションを好みます。これにより、クエリをシームレスに送信できます。
このガイドでは、MySQLを紹介し、MySQLでのクエリの操作方法について説明します。始めましょう!
前提条件
このチュートリアルを進めるには、以下が必要です。
-
最新バージョンの Ubuntuがインストールされていること(システムに)。
-
システムユーザーが sudo権限を持っていること.
-
sudoアカウントへのアクセスに問題がある場合は、MySQLのrootパスワードの変更を検討してください.
-
-
MySQLがセットアップされていること(サーバーに)。
ステップ1 — データベースの作成とセットアップ
最初のSQLクエリを作成して実行する前に、データベースを作成し、そこにテーブルを追加する必要があります。その後、サンプルデータを使用してテーブルにデータを挿入します。データベースを操作することで、基本的なセットアップを理解し、クエリの操作に自信を持つことができます。
実践的な経験は、概念を構築し、データベースの重要性を理解するための最も効果的な方法です。このガイドでは、データベースの使用方法と、現実世界の課題を解決するためのその重要性について説明します。データベースがどのようにレコードを構造化された方法で整理するのに役立つかを理解するために、シナリオを確認してみましょう。
シナリオ:大学生のグループが誕生日を祝うために休暇に出かけるデータベースを作成します。休暇に行く前に、彼らは親善水泳大会に参加することを計画しています。また、グループの全員が、旅行をスリリングで楽しいものにするためのアクティビティのToDoリストを計画しています。
まず、rootユーザーとしてMySQLを開きます:
|
1 |
$ sudo mysql |
次に、以下のコマンドを実行してデータベースを作成します:
|
1 2 3 |
mysql> CREATE DATABASE `vacation`; Query OK, 1 row affected (0.52 sec) |
次に、以下のコマンドを使用してデータベースを使用しましょう:
|
1 |
mysql> USE vacation; |
その後、データベースにテーブルを作成します。最初のテーブルの名前を celebrationとします。このテーブルには、友人の名前用の列 (name)、彼らが獲得したトーナメント数用の列 (wins)、そして彼らの bestタイム用の列 (time):
|
1 2 3 4 5 6 7 |
mysql> CREATE TABLE celebration ( -> name varchar(50), -> wins real, -> time real -> ); Query OK, 0 rows affected (2.03 sec) |
次に、テーブルにデータを挿入します:
|
1 2 3 4 5 6 7 8 9 |
mysql> INSERT INTO celebration (name, wins, time) VALUES('Austin', '4', '15.5'), ('Ivan','7','9'), ('Aisha','10','5'), ('Zane','13','7.5'); Query OK, 4 rows affected (0.29 sec) Records: 4 Duplicates: 0 Warnings: 0 |
次に、データベース内にもう1つのテーブルを作成して、お気に入りの誕生日のアクティビティに関する情報を保存します。次のような名前のテーブルを作成します。 vacation。そして、次の列を持たせます:
|
リスト |
詳細 |
|
name: |
各友人の名前を保存します。 |
|
birthdate: |
各個人の生年月日を追跡します。 |
|
activity: |
お気に入りのアクティビティの記録を保持します。 |
|
目的地: |
各個人のお気に入りの目的地の情報を保存します。 |
|
meal: |
個人が好むお気に入りの食事を追跡します。 |
|
1 2 3 4 5 6 7 8 |
mysql> CREATE TABLE vacation ( name varchar(50), birthdate date, activity varchar(50), destination varchar(50), meal varchar(50) ); Query OK, 0 rows affected (0.09 sec) |
テーブルにデータを挿入します:
|
1 2 3 4 5 6 7 8 9 10 |
mysql> CREATE TABLE vacation ( name varchar(50), birthdate date, activity varchar(50), destination varchar(50), meal varchar(50) ); Query OK, 0 rows affected (0.09 sec) Records: 4 Duplicates: 0 Warnings: 0 |
これでデータベースのセットアップは完了です。
ステップ 2 — SELECT文を使い始める
SQLのクエリは通常、次で始まります: SELECT。これは、テーブル内のどの列を結果として返すかをクエリで指定するために使用されます。また、クエリには常に以下を含める必要があります: FROM。これは、ステートメントがクエリを実行するテーブルを指定するために使用されます。
クエリは以下の構文に従います:
|
1 |
mysql> SELECT column_to_select FROM table_to_select WHERE certain_conditions_apply; |
クエリ構文を使用して、 meal列を vacationテーブルから返します:
|
1 |
mysql> SELECT meal FROM vacation; |
出力は以下のようになります:
|
1 2 3 4 5 6 7 8 9 10 |
+-------+ | meal | +-------+ | Steak | | Sushi | | Fries | | Tofu | +-------+ 4 rows in set (0.00 sec) |
カンマで区切ることで、複数の列を選択することもできます:
|
1 |
mysql> SELECT name, destination FROM vacation; |
出力:
|
1 2 3 4 5 6 7 8 9 10 |
+--------+-------------+ | name | destination | +--------+-------------+ | Austin | Maldives | | Ivan | Mauritius | | Aisha | Colorado | | Zane | Bora Bora | +--------+-------------+ 4 rows in set (0.00 sec) |
また、テーブル内のすべての列を表すために、 asterisk (*)を使用することもできます:
|
1 |
mysql> SELECT * FROM celebration; |
出力:
|
1 2 3 4 5 6 7 8 9 10 |
+--------+------+------+ | name | wins | time | +--------+------+------+ | Austin | 4 | 15.5 | | Ivan | 7 | 9 | | Aisha | 10 | 5 | | Zane | 13 | 7.5 | +--------+------+------+ 4 rows in set (0.00 sec) |
指定された条件を満たすレコードをフィルタリングしたい場合は、 WHEREを使用します。指定された条件を満たさない行は結果から除外されます。 WHERE句は以下の構文を使用します:
|
1 |
mysql> . . . WHERE column_name comparison_operator value |
これは、指定された列を値とどのように比較するかを定義する比較演算子です。一般的なSQL比較演算子には以下が含まれます:
|
演算子 |
用途 |
|
= |
等価 |
|
!= |
不等価 |
|
< |
未満 |
|
> |
より大きい |
|
<= |
以下 |
|
>= |
以上 |
|
BETWEEN |
値が指定された範囲内にあるかどうかをテストします。 |
|
IN |
行の値が指定された値のセットに含まれているかどうかをテストします。 |
|
EXISTS |
行が存在するかどうかをテストします |
|
LIKE |
値が指定された文字列と一致するかどうかをテストします |
|
IS NULL |
NULL値をテストします |
|
IS NOT NULL |
NULL以外のすべての値をテストします |
Aishaのお気に入りの目的地を見つけたい場合は、以下のクエリを使用できます:
|
1 |
mysql> SELECT destination FROM vacation WHERE name ='Aisha'; |
クエリは以下を返します:
|
1 2 3 4 5 6 7 |
+-------------+ | destination | +-------------+ | Colorado | +-------------+ 1 row in set (0.03 sec) |
SQLはワイルドカード文字の使用をサポートしており、これは特に以下で便利です: WHERE 句。パーセント記号( %)は0文字以上の未知の文字を表し、アンダースコア( _)は単一の未知の文字を表します。これらは、テーブル内の特定のデータを見つけたいが、その内容が不確かな場合に役立ちます。
例えば、友人の一番好きな目的地を忘れてしまい、その頭文字が「m」であることだけを覚えているとします。次のクエリを使用することで、目的地の名前を見つけることができます:
|
1 |
mysql> SELECT destination FROM vacation WHERE destination LIKE 'm%'; |
クエリは以下を返します:
|
1 2 3 4 5 6 7 8 |
+-------------+ | destination | +-------------+ | Maldives | | Mauritius | +-------------+ 2 rows in set (0.04 sec) |
データベースを操作する際、比較的長い名前や読みにくい名前の列やテーブルに遭遇することがあります。このような場合、 AS キーワードを使用してエイリアスを作成することで、名前をより読みやすくすることができます。 AS で作成されたエイリアスは、それが作成されたクエリの実行期間中のみ有効です:
|
1 2 3 4 5 6 7 8 9 10 11 |
mysql> SELECT name AS E, destination as D, activity as A FROM vacation; +--------+-----------+-------------------+ | E | D | A | +--------+-----------+-------------------+ | Austin | Maldives | skiing | | Ivan | Mauritius | paragliding | | Aisha | Colorado | mountain climbing | | Zane | Bora Bora | fishing | +--------+-----------+-------------------+ 4 rows in set (0.00 sec) |
ステップ 3 — 集計関数の紹介
データを扱う際、必ずしもデータそのものを見たいとは限りません。むしろ、データに関する情報を得たい場合が多いでしょう。 SELECT クエリを発行することで、SQL構文を使用してデータを解釈したり、データに対して計算を実行したりできます。これらは集計関数と呼ばれます。
The COUNT 関数は、特定の基準を満たす行の数をカウントして返します。例えば、何人の友人が Maldives に行くことを好むかを知りたい場合は、次のクエリを使用できます:
|
1 |
mysql> SELECT COUNT(destination) FROM vacation WHERE destination = 'Maldives'; |
次の結果が返されます:
|
1 2 3 4 5 6 7 |
+--------------------+ | COUNT(destination) | +--------------------+ | 1 | +--------------------+ 1 row in set (0.06 sec) |
MIN は、指定された列内の最小値を見つけるために使用されます:
|
1 |
mysql> SELECT MIN(wins) FROM celebration; |
クエリは以下を出力します:
|
1 2 3 4 5 6 7 |
+-----------+ | MIN(wins) | +-----------+ | 4 | +-----------+ 1 row in set (0.02 sec) |
MAX は、指定された列内の最大の数値を見つけるために使用されます:
|
1 |
mysql> SELECT MAX(wins) FROM celebration; |
期待される出力は以下です:
|
1 2 3 4 5 6 7 |
+-----------+ | MAX(wins) | +-----------+ | 13 | +-----------+ 1 row in set (0.03 sec) |
両方の MIN および MAX 関数は、数値データとアルファベットデータの両方に使用できます。文字列値の列に適用された場合、 MIN 関数はアルファベット順で最初の値を返します。
The MIN 関数はアルファベット順で最初の値を返します:
|
1 |
mysql> SELECT MIN(name) FROM celebration; |
出力は以下のようになります:
|
1 2 3 4 5 6 7 |
+-----------+ | MIN(name) | +-----------+ | Aisha | +-----------+ 1 row in set (0.00 sec) |
The MAX 関数はアルファベット順で最後の値を返します:
|
1 |
mysql> SELECT MAX(name) FROM celebration; |
出力は以下のようになります:
|
1 2 3 4 5 6 7 |
+-----------+ | MAX(name) | +-----------+ | Zane | +-----------+ 1 row in set (0.00 sec) |
ステップ 4 — クエリ出力の操作
よく使われるもう1つの句は、 GROUP BY句です。これは、ある列に対して集計関数を実行し、別の列の一致する値に関連付ける場合に使用されます:
|
1 |
mysql> SELECT COUNT(name), activity FROM vacation GROUP BY activity; |
出力は次のようになります:
|
1 2 3 4 5 6 7 8 9 10 |
+-------------+-------------------+ | COUNT(name) | activity | +-------------+-------------------+ | 1 | skiing | | 1 | paragliding | | 1 | mountain climbing | | 1 | fishing | +-------------+-------------------+ 4 rows in set (0.04 sec) |
クエリ結果をソートするには、 ORDER BY句を使用します。数値はデフォルトで昇順にソートされ、テキスト値はアルファベット順にソートされます。以下のクエリは、 name と birthdate列をリストしますが、結果を birthdate:
|
1 |
mysql> SELECT name, birthdate FROM vacation ORDER BY birthdate; |
出力は以下のようになります:
|
1 2 3 4 5 6 7 8 9 10 |
+--------+------------+ | name | birthdate | +--------+------------+ | Zane | 1996-01-01 | | Aisha | 1999-07-24 | | Austin | 2002-01-07 | | Ivan | 2010-12-18 | +--------+------------+ 4 rows in set (0.04 sec) |
出力は昇順になっています。降順でソートするには、クエリの最後に次の単語を追加します: DESC:
|
1 |
mysql> SELECT name, birthdate FROM vacation ORDER BY birthdate DESC; |
出力を見てみましょう:
|
1 2 3 4 5 6 7 8 9 10 |
+--------+------------+ | name | birthdate | +--------+------------+ | Ivan | 2010-12-18 | | Austin | 2002-01-07 | | Aisha | 1999-07-24 | | Zane | 1996-01-01 | +--------+------------+ 4 rows in set (0.00 sec) |
SQLに HAVING句が追加されたのは、 WHERE句と同様の機能を提供しつつ、集計関数とも互換性を持たせるためです。これら2つの句の違いは、 WHEREが個々のレコードを参照するのに対し、 HAVINGはグループ化されたレコードを参照することです。そのため、HAVING句を使用する場合は常にGROUP BY句が存在しなければなりません:
|
1 |
mysql> SELECT COUNT(name), activity FROM vacation GROUP BY activity HAVING COUNT(name) >= 1; |
クエリは以下を出力します:
|
1 2 3 4 5 6 7 8 |
+-------------+-------------------+ | COUNT(name) | activity | +-------------+-------------------+ | 1 | skiing | | 1 | paragliding | | 1 | mountain climbing | | 1 | fishing | +-------------+-------------------+ |
同じアクティビティを好む友人が2人いないため、すべてにおいて COUNTは1になります。同じアクティビティを好む友人が2人いないためです。
ステップ 5 — 複数のテーブルのクエリ
クエリ結果で JOIN句を使用すると、2つ以上のテーブルの行を結合できます。これは、テーブル間の関連する列を特定し、出力を適切にソートすることによって行われます。
SELECTステートメントに JOIN句を含める場合は、以下の構文に従います:
|
1 2 3 |
mysql> SELECT table1.column1, table2.column2 mysql> FROM table1 mysql> JOIN table2 ON table1.related_column=table2.related_column; |
友人の wins(勝利数)に対して、また彼らの swimming(水泳)や、彼らの birthdays(誕生日)のためにトロフィーを購入したい場合、両方のテーブルを結合して、1つのクエリで必要なすべての情報を見つけることができるクエリを作成できます:
|
1 2 3 |
mysql> SELECT celebration.name, celebration.wins, vacation.birthdate FROM celebration JOIN vacation ON celebration.name=vacation.name; |
出力は次のようになります。
|
1 2 3 4 5 6 7 8 9 10 |
+--------+------+------------+ | name | wins | birthdate | +--------+------+------------+ | Austin | 4 | 2002-01-07 | | Ivan | 7 | 2010-12-18 | | Aisha | 10 | 1999-07-24 | | Zane | 13 | 1996-01-01 | +--------+------+------------+ 4 rows in set (0.00 sec) |
これは内部 JOIN句です。これは、両方のテーブルで一致する値を持つすべてのレコードを選択し、それらを結果セットに出力するためです。クエリに一致しないレコードは含まれません。どのエントリにも対応しない新しい行をテーブルに追加できます。
|
1 2 3 4 |
mysql> INSERT INTO celebration(name,wins,time) VALUES('Ella', '1', '120'); Query OK, 1 row affected (0.01 sec) |
|
1 2 3 4 |
mysql> INSERT INTO celebration(name,wins,time) VALUES('Ella', '1', '120'); Query OK, 1 row affected (0.01 sec) |
その後、次の SELECT文を JOIN句と一緒に再実行します。
|
1 2 3 4 5 6 7 8 9 10 11 12 13 |
mysql> SELECT celebration.name, celebration.wins, vacation.birthdate -> FROM celebration -> JOIN vacation ON celebration.name=vacation.name; +--------+------+------------+ | name | wins | birthdate | +--------+------+------------+ | Austin | 4 | 2002-01-07 | | Ivan | 7 | 2010-12-18 | | Aisha | 10 | 1999-07-24 | | Zane | 13 | 1996-01-01 | +--------+------+------------+ 4 rows in set (0.00 sec) |
celebrationテーブルにはPeterのエントリがなく、vacationテーブルにはEllaのエントリがないため、それらのレコードは存在しません。
外部 JOIN句を使用することで、いずれかのテーブルからすべてのレコードを返すことができます。これは LEFT JOINまたは RIGHT JOINのいずれかになります。 LEFT JOINは、左側のテーブルからすべてのレコードを返し、右側のテーブルからは一致したレコードのみを返します。外部結合の文脈における左側のテーブルとは、 FROM句で参照されているテーブルであり、右側のテーブルとは JOINステートメントの後に参照されているテーブルです。
クエリを再実行しますが、今回は LEFT JOIN句を使用します。
|
1 2 3 |
mysql> SELECT celebration.name, celebration.wins, vacation.birthdate FROM celebration LEFT JOIN vacation ON celebration.name=vacation.name; |
このコマンドは、右側のテーブルに対応するレコードがない場合でも、左側のテーブル( celebration)からすべてのレコードを返します。右側のテーブルに一致するレコードがない場合は、 NULL:
|
1 2 3 4 5 6 7 8 9 10 11 |
+--------+------+------------+ | name | wins | birthdate | +--------+------+------------+ | Austin | 4 | 2002-01-07 | | Ivan | 7 | 2010-12-18 | | Aisha | 10 | 1999-07-24 | | Zane | 13 | 1996-01-01 | | Ella | 1 | NULL | +--------+------+------------+ 5 rows in set (0.00 sec) |
次は RIGHT JOIN句です。
|
1 2 3 |
mysql> SELECT celebration.name, celebration.wins, vacation.birthdate FROM celebration RIGHT JOIN vacation ON celebration.name=vacation.name; |
右側のテーブル(vacation)からすべての値が返されます。Peterの birthdateは右側のテーブルに記録されていますが、左側のテーブルには記録されていないため、 nameおよび wins列はそれらの行で NULL値を返します。
|
1 2 3 4 5 6 7 8 9 10 11 |
+--------+------+------------+ | name | wins | birthdate | +--------+------+------------+ | Austin | 4 | 2002-01-07 | | Ivan | 7 | 2010-12-18 | | Aisha | 10 | 1999-07-24 | | Zane | 13 | 1996-01-01 | | NULL | NULL | 1991-05-03 | +--------+------+------------+ 5 rows in set (0.01 sec) |
複数のテーブルからレコードをクエリするには、 UNION 句の代わりに JOIN を使用できます。 UNION 演算子は、 JOIN 句とは異なり、単一の SELECT ステートメントを使用して複数のテーブルからの結果を固有の列として出力するのではなく、2 つの SELECT ステートメントの結果を単一の列に結合します。
これを示すために、次のクエリを実行できます。
|
1 |
mysql> SELECT name FROM celebration UNION SELECT name FROM vacation; |
このクエリは重複するエントリを削除します。これは、 UNION 演算子のデフォルトの動作です。
|
1 2 3 4 5 6 7 8 9 10 11 12 |
+--------+ | name | +--------+ | Austin | | Ivan | | Aisha | | Zane | | Ella | | Peter | +--------+ 6 rows in set (0.00 sec) |
すべてのエントリ(および重複)を返すには、 UNION ALL 演算子を使用します。
|
1 |
mysql> SELECT name FROM celebration UNION ALL SELECT name FROM vacation; |
出力:
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
+--------+ | name | +--------+ | Austin | | Ivan | | Aisha | | Zane | | Ella | | Austin | | Ivan | | Aisha | | Zane | | Peter | +--------+ 10 rows in set (0.00 sec) |
サブクエリは、複数のテーブルをクエリするためのもう 1 つの方法です。サブクエリとは、別のクエリの中に含まれるクエリのことです(内部クエリまたはネストされたクエリとも呼ばれます)。これらは、あるクエリの結果を別の集計関数の結果と比較したい場合に便利です。
ここでは、Ella よりも多くの水泳大会で優勝した友人を特定する例を使用します。Ella が何回優勝したかをクエリしてから、それよりも多く優勝したのが誰かを確認するために別のクエリを実行する代わりに、単一のクエリで両方を計算できます。
|
1 2 3 4 |
mysql> SELECT name, wins FROM celebration -> WHERE wins > ( -> SELECT wins FROM celebration WHERE name = 'Ella' -> ); |
クエリは以下を返します。
|
1 2 3 4 5 6 7 8 9 10 |
+--------+------+ | name | wins | +--------+------+ | Austin | 4 | | Ivan | 7 | | Aisha | 10 | | Zane | 13 | +--------+------+ 4 rows in set (0.06 sec) |
友人をサプライズ旅行に連れて行きたい場合、クエリを使用して誰が最も多く優勝したかを確認し、その目的地を返すことができます。
|
1 2 3 4 |
mysql> SELECT name, destination, activity, meal -> FROM vacation -> WHERE name = ( SELECT name FROM celebration -> WHERE wins = (SELECT MAX(wins) FROM celebration)); |
クエリは以下を返します。
|
1 2 3 4 5 6 7 |
+------+-------------+----------+------+ | name | destination | activity | meal | +------+-------------+----------+------+ | Zane | Bora Bora | fishing | Tofu | +------+-------------+----------+------+ 1 row in set (0.00 sec) |
このステートメントには、サブクエリの中にさらにサブクエリが含まれています。
結論
クエリの生成は、データベース管理において最も一般的なタスクの 1 つです。クエリの実行や結果の可視化に使用できる、phpMyAdmin や pgAdmin などのデータベース管理ツールがいくつか存在します。しかし、使いやすさと優れたコントロール性から、コマンドラインからの SELECT ステートメントが最も好まれる選択肢です。
さらに、当社のブログから、データベースに関する多くのチュートリアルを探索できます。:
- SQLite vs MySQL vs. PostgreSQL: リレーショナルデータベース管理システムの比較
- MySQLで破損したテーブルを修復する迅速な解決策:チュートリアル
- Centos 7にMySQLをインストールする方法
- MySQLユーザー — 権限の作成と付与
- Ubuntu上のMySQLでレプリケーションを設定する
ハッピーコンピューティング!
コメント
コメントはまだありません。最初のコメントを投稿しましょう。