ブログに戻る

MySQLにおけるクエリの概要

MySQLにおけるクエリの概要

適切なデータ管理がなければ、ビジネスにおけるサステナビリティ(持続可能性)の実現は困難です。明確に定義されたシステムを構築することは、社内外の業務を管理するために不可欠です。ビジネスデータに関する詳細なインサイトは、全体のワークフローを理解し、パフォーマンスを測定するのに役立ちます。さらに、データベースを使用することで時間を節約し、情報に簡単にアクセスできるようになります。

データベースとは何ですか?

データベース(database)は、情報を安全な方法で保存するために使用される整理されたシステムです。カテゴリ分け機能を提供し、同様の種類のアイテムを1つのグループに分類するためのテーブルを作成できます。テーブルは、複数の行と列に情報をリストするオプションを提供します。その結果、データの品質と一貫性が向上します。保存機能やアクセスしやすさに加えて、データベースはプライバシーの保護やシステムのセキュリティ確保において重要な役割を果たします。アドホックなものであれ、アプリケーションにコード化されたプロセスの一部であれ、データを取得することはデータベース管理の最も重要な側面の1つです。

クエリ(query)は、リレーショナルDMSにおいて、テーブルからデータを取得するために使用される任意のコマンドです。 SELECT 文は、ほぼ常に Structured Query Language(SQL)クエリで使用されます。データベースから情報を取得する方法はいくつかあります。一般的に、開発者は高速で効果的であるため、コマンドラインオプションを好みます。これにより、クエリをシームレスに送信できます。

このガイドでは、MySQLを紹介し、MySQLでのクエリの操作方法について説明します。始めましょう!

前提条件

このチュートリアルを進めるには、以下が必要です。

ステップ1 — データベースの作成とセットアップ

最初のSQLクエリを作成して実行する前に、データベースを作成し、そこにテーブルを追加する必要があります。その後、サンプルデータを使用してテーブルにデータを挿入します。データベースを操作することで、基本的なセットアップを理解し、クエリの操作に自信を持つことができます。

実践的な経験は、概念を構築し、データベースの重要性を理解するための最も効果的な方法です。このガイドでは、データベースの使用方法と、現実世界の課題を解決するためのその重要性について説明します。データベースがどのようにレコードを構造化された方法で整理するのに役立つかを理解するために、シナリオを確認してみましょう。

シナリオ:大学生のグループが誕生日を祝うために休暇に出かけるデータベースを作成します。休暇に行く前に、彼らは親善水泳大会に参加することを計画しています。また、グループの全員が、旅行をスリリングで楽しいものにするためのアクティビティのToDoリストを計画しています。

まず、rootユーザーとしてMySQLを開きます:

次に、以下のコマンドを実行してデータベースを作成します:

次に、以下のコマンドを使用してデータベースを使用しましょう:

その後、データベースにテーブルを作成します。最初のテーブルの名前を celebrationとします。このテーブルには、友人の名前用の列 (name)、彼らが獲得したトーナメント数用の列 (wins)、そして彼らの bestタイム用の列 (time):

次に、テーブルにデータを挿入します:

次に、データベース内にもう1つのテーブルを作成して、お気に入りの誕生日のアクティビティに関する情報を保存します。次のような名前のテーブルを作成します。 vacation。そして、次の列を持たせます:

リスト

詳細

name:

各友人の名前を保存します。

birthdate:

各個人の生年月日を追跡します。

activity:

お気に入りのアクティビティの記録を保持します。

目的地:

各個人のお気に入りの目的地の情報を保存します。

meal:

個人が好むお気に入りの食事を追跡します。

テーブルにデータを挿入します:

これでデータベースのセットアップは完了です。

ステップ 2 — SELECT文を使い始める

SQLのクエリは通常、次で始まります: SELECT。これは、テーブル内のどの列を結果として返すかをクエリで指定するために使用されます。また、クエリには常に以下を含める必要があります: FROM。これは、ステートメントがクエリを実行するテーブルを指定するために使用されます。

クエリは以下の構文に従います:

クエリ構文を使用して、 meal列を vacationテーブルから返します:

出力は以下のようになります:

カンマで区切ることで、複数の列を選択することもできます:

出力:

また、テーブル内のすべての列を表すために、 asterisk (*)を使用することもできます:

出力:

指定された条件を満たすレコードをフィルタリングしたい場合は、 WHEREを使用します。指定された条件を満たさない行は結果から除外されます。 WHERE句は以下の構文を使用します:

これは、指定された列を値とどのように比較するかを定義する比較演算子です。一般的なSQL比較演算子には以下が含まれます:

演算子

用途

=

等価

!=

不等価

<

未満

>

より大きい

<=

以下

>=

以上

BETWEEN

値が指定された範囲内にあるかどうかをテストします。

IN

行の値が指定された値のセットに含まれているかどうかをテストします。

EXISTS

行が存在するかどうかをテストします

LIKE

値が指定された文字列と一致するかどうかをテストします

IS NULL

NULL値をテストします

IS NOT NULL

NULL以外のすべての値をテストします

Aishaのお気に入りの目的地を見つけたい場合は、以下のクエリを使用できます:

クエリは以下を返します:

SQLはワイルドカード文字の使用をサポートしており、これは特に以下で便利です: WHERE 句。パーセント記号( %)は0文字以上の未知の文字を表し、アンダースコア( _)は単一の未知の文字を表します。これらは、テーブル内の特定のデータを見つけたいが、その内容が不確かな場合に役立ちます。

例えば、友人の一番好きな目的地を忘れてしまい、その頭文字が「m」であることだけを覚えているとします。次のクエリを使用することで、目的地の名前を見つけることができます:

クエリは以下を返します:

データベースを操作する際、比較的長い名前や読みにくい名前の列やテーブルに遭遇することがあります。このような場合、 AS キーワードを使用してエイリアスを作成することで、名前をより読みやすくすることができます。 AS で作成されたエイリアスは、それが作成されたクエリの実行期間中のみ有効です:

ステップ 3 — 集計関数の紹介

データを扱う際、必ずしもデータそのものを見たいとは限りません。むしろ、データに関する情報を得たい場合が多いでしょう。 SELECT クエリを発行することで、SQL構文を使用してデータを解釈したり、データに対して計算を実行したりできます。これらは集計関数と呼ばれます。

The COUNT 関数は、特定の基準を満たす行の数をカウントして返します。例えば、何人の友人が Maldives に行くことを好むかを知りたい場合は、次のクエリを使用できます:

次の結果が返されます:

MIN は、指定された列内の最小値を見つけるために使用されます:

クエリは以下を出力します:

MAX は、指定された列内の最大の数値を見つけるために使用されます:

期待される出力は以下です:

両方の MIN および MAX 関数は、数値データとアルファベットデータの両方に使用できます。文字列値の列に適用された場合、 MIN 関数はアルファベット順で最初の値を返します。

The MIN 関数はアルファベット順で最初の値を返します:

出力は以下のようになります:

The MAX 関数はアルファベット順で最後の値を返します:

出力は以下のようになります:

ステップ 4 — クエリ出力の操作

よく使われるもう1つの句は、 GROUP BY句です。これは、ある列に対して集計関数を実行し、別の列の一致する値に関連付ける場合に使用されます:

出力は次のようになります:

クエリ結果をソートするには、 ORDER BY句を使用します。数値はデフォルトで昇順にソートされ、テキスト値はアルファベット順にソートされます。以下のクエリは、 namebirthdate列をリストしますが、結果を birthdate:

出力は以下のようになります:

出力は昇順になっています。降順でソートするには、クエリの最後に次の単語を追加します: DESC:

出力を見てみましょう:

SQLに HAVING句が追加されたのは、 WHERE句と同様の機能を提供しつつ、集計関数とも互換性を持たせるためです。これら2つの句の違いは、 WHEREが個々のレコードを参照するのに対し、 HAVINGはグループ化されたレコードを参照することです。そのため、HAVING句を使用する場合は常にGROUP BY句が存在しなければなりません:

クエリは以下を出力します:

同じアクティビティを好む友人が2人いないため、すべてにおいて COUNTは1になります。同じアクティビティを好む友人が2人いないためです。

ステップ 5 — 複数のテーブルのクエリ

クエリ結果で JOIN句を使用すると、2つ以上のテーブルの行を結合できます。これは、テーブル間の関連する列を特定し、出力を適切にソートすることによって行われます。

SELECTステートメントに JOIN句を含める場合は、以下の構文に従います:

友人の wins(勝利数)に対して、また彼らの swimming(水泳)や、彼らの birthdays(誕生日)のためにトロフィーを購入したい場合、両方のテーブルを結合して、1つのクエリで必要なすべての情報を見つけることができるクエリを作成できます:

出力は次のようになります。

これは内部 JOIN句です。これは、両方のテーブルで一致する値を持つすべてのレコードを選択し、それらを結果セットに出力するためです。クエリに一致しないレコードは含まれません。どのエントリにも対応しない新しい行をテーブルに追加できます。

その後、次の SELECT文を JOIN句と一緒に再実行します。

celebrationテーブルにはPeterのエントリがなく、vacationテーブルにはEllaのエントリがないため、それらのレコードは存在しません。

外部 JOIN句を使用することで、いずれかのテーブルからすべてのレコードを返すことができます。これは LEFT JOINまたは RIGHT JOINのいずれかになります。 LEFT JOINは、左側のテーブルからすべてのレコードを返し、右側のテーブルからは一致したレコードのみを返します。外部結合の文脈における左側のテーブルとは、 FROM句で参照されているテーブルであり、右側のテーブルとは JOINステートメントの後に参照されているテーブルです。

クエリを再実行しますが、今回は LEFT JOIN句を使用します。

このコマンドは、右側のテーブルに対応するレコードがない場合でも、左側のテーブル( celebration)からすべてのレコードを返します。右側のテーブルに一致するレコードがない場合は、 NULL:

次は RIGHT JOIN句です。

右側のテーブル(vacation)からすべての値が返されます。Peterの birthdateは右側のテーブルに記録されていますが、左側のテーブルには記録されていないため、 nameおよび wins列はそれらの行で NULL値を返します。

複数のテーブルからレコードをクエリするには、 UNION 句の代わりに JOIN を使用できます。 UNION 演算子は、 JOIN 句とは異なり、単一の SELECT ステートメントを使用して複数のテーブルからの結果を固有の列として出力するのではなく、2 つの SELECT ステートメントの結果を単一の列に結合します。

これを示すために、次のクエリを実行できます。

このクエリは重複するエントリを削除します。これは、 UNION 演算子のデフォルトの動作です。

すべてのエントリ(および重複)を返すには、 UNION ALL 演算子を使用します。

出力:

サブクエリは、複数のテーブルをクエリするためのもう 1 つの方法です。サブクエリとは、別のクエリの中に含まれるクエリのことです(内部クエリまたはネストされたクエリとも呼ばれます)。これらは、あるクエリの結果を別の集計関数の結果と比較したい場合に便利です。

ここでは、Ella よりも多くの水泳大会で優勝した友人を特定する例を使用します。Ella が何回優勝したかをクエリしてから、それよりも多く優勝したのが誰かを確認するために別のクエリを実行する代わりに、単一のクエリで両方を計算できます。

クエリは以下を返します。

友人をサプライズ旅行に連れて行きたい場合、クエリを使用して誰が最も多く優勝したかを確認し、その目的地を返すことができます。

クエリは以下を返します。

このステートメントには、サブクエリの中にさらにサブクエリが含まれています。

結論

クエリの生成は、データベース管理において最も一般的なタスクの 1 つです。クエリの実行や結果の可視化に使用できる、phpMyAdminpgAdmin などのデータベース管理ツールがいくつか存在します。しかし、使いやすさと優れたコントロール性から、コマンドラインからの SELECT ステートメントが最も好まれる選択肢です。

さらに、当社のブログから、データベースに関する多くのチュートリアルを探索できます。:

ハッピーコンピューティング!

author

Preslav Dobrev

著者 · CloudSigma

Preslav DobrevはCloudSigmaのクリエイティブデザイナーであり、従来型および革新的なマーケティングチャネルを活用した一貫性のあるビジネスアイデンティティに注力しています。彼は芸術的なビジョンと戦略的マーケティングを融合させ、インパクトのあるブランドナラティブを生み出すことに長けています。

コメント

コメントはまだありません。最初のコメントを投稿しましょう。