このMySQLシリーズの前回の記事では、MySQL句を使用してデータをフェッチする方法を示しました。このパートでは、MySQLのJoins関数、それらが使用される理由、およびそれらの使用方法について学習します。始めましょう。
MySQL結合を使用すると、複数のテーブルのデータにアクセスできます。 MySQL結合は、SQLステートメントで2つ以上のテーブルが結合されるたびに実行されます。 MySQL結合には、MySQL内部結合(単純結合とも呼ばれます)、MySQL左外部結合(左結合とも呼ばれ、左側のテーブルから一致するレコードを返します)、右側結合(これにより、右のテーブル)、および完全結合(これにより、すべてのテーブルから一致するレコードが返されます)。 MySQL JOINを使用すると、3つ以上のテーブルを結合できます。
MySQLでは、内部結合がデフォルトの結合です。その時点で指定されたキーワードについて、両方のテーブルの列の間に座標がある限り、両方のテーブルからすべての行が選択されます。
SQLとは異なり、MySQLは外部結合を個別の結合タイプとは見なしません。アウタージョインと同じ結果を得るには、レフトアウタージョインとライトアウタージョインに参加する必要があります。
MySQLで結合できるテーブルの数
MySQL 8.0の公式ドキュメントによると、JOINステートメントのテーブルの最大数は61です。ただし、テーブルの数が増えると、JOINステートメントは多くのサーバーリソースを必要とする可能性があることに注意してください。これがクエリの場合である場合は、サーバーの負荷を軽減するために、クエリを複数のクエリに分割することを強くお勧めします。
まず、データベースに新しいテーブルを追加します。このテーブルには、メッセージと、このメッセージを送信したユーザーIDが含まれ、メッセージという名前を付けます。テーブルのスキーマは次のとおりです。
CREATE TABLE `messages`(
`id` int(11)NOT NULL、
`message` varchar(255)NOT NULL
)
同じselectdata関数を使用します crud.phpで作成しました ファイル。それでは、これら2つのテーブルを結合することから始めましょう。テーブルを埋めて練習することもできます。
サーバーで時間を無駄にするのをやめる
Cloudwaysがサーバー管理を処理するため、優れたアプリの作成とクライアントの満足度の維持に集中できます。
無料で始める内部結合は、与えられた条件に一致する結果のみを表示し、他の結果を非表示にするようにテーブルを結合します。内部結合クエリの構造は次のとおりです。
SELECT column_name(s)
FROM table1
INNER JOIN table2
ON table1.column_name =table2.column_name;
内部結合と単純結合はどちらも同じです。次のようにクエリを作成することもできます:
SELECT column_name(s)
FROM table1
JOIN table2
ON table1.column_name =table2.column_name;
次に、内部結合を使用してデータベースから名前とメッセージをフェッチします。クエリは次のようになります
$sql = "SELECT CONCAT(myguests.firstname,' ',myguests.lastname) AS name, myguests.email, messages.message From myguests INNER JOIN messages ON myguests.id = messages.id";
CONCAT 関数は、MySQLの2つの文字列列を結合するために使用されます。 次に、以前に作成したindex.phpを開き、次のコードをコピーします。
<table> <tr> <td> Name</td> <td> Email</td> <td> Message</td> <!-- <td> Message</td> <td> Date</td>!--> </tr> <?php include 'crud.php'; $sql = "SELECT CONCAT(myguests.firstname,' ',myguests.lastname) AS name, myguests.email, messages.message From myguests INNER JOIN messages ON myguests.id = messages.id"; $result = selectdata($sql); if($result != "zero") { while($row = $result->fetch_assoc()) { echo "<tr>"; echo "<td>" . $row['name'] . "</td>"; echo "<td>" . $row['email'] . "</td>"; if($row['message'] === null){echo "<td>" . 'null'. "</td>";} else { echo "<td>" . $row['message']. "</td>"; } ; echo "</tr>"; } } else { echo $result; } ?> </table> ?>
PHP Webホスティングサーバーでこのページを実行すると、結果は次のようになります。
はっきりとわかるように、user_idとメッセージに一致する結果のみが返されます。 nullではありません。
右結合
RIGHT JOINは、右側のすべての値と左側のテーブルの一致する値を返し、一致するものが見つからない場合は左側のテーブルでnullを返すように、2つのテーブルを結合します。 RIGHTJOINの構造は次のとおりです。
SELECT column_name(s)
FROM table1
RIGHT JOIN table2
ON table1.column_name =table2.column_name;
次に、データベースから名前とメッセージをフェッチして、メッセージを作成しましょう。 右のテーブルとmyguests 左の表にあります。
$sql = "SELECT CONCAT(myguests.firstname,' ',myguests.lastname) AS name, myguests.email, messages.message From myguests RIGHT JOIN messages ON messages.id = myguests.id";
次に、index.phpを開き、 $ sqlを置き換えます。 上記でクエリします。実行すると、結果は次のようになります。
メッセージをご覧ください 表では、どのユーザーIDとも一致しないIDがいくつか表示されます。そのため、このクエリは名前とメールの列にnullを返し、左側の列には一致するものが見つかりません。
LEFT結合は、左側のテーブルからすべての値を返し、右側のテーブルから一致した値を返し、一致するものが見つからない場合は右側のテーブルでnullを返すように2つのテーブルを結合します。 LEFTJOINの構造は次のとおりです。
SELECT column_name(s)
FROM table1
LEFT JOIN table2
ON table1.column_name =table2.column_name;
次に、データベースから名前とメッセージをフェッチして、メッセージを作成します。 私たちの右のテーブルとのmyguests 左のテーブル。
$sql = "SELECT CONCAT(myguests.firstname,' ',myguests.lastname) AS name, myguests.email, messages.message From myguests LEFT JOIN messages ON messages.id = myguests.id";
次に、index.phpを開き、 $ sqlの代わりにクエリを実行します。 上記で。実行すると、結果は次のようになります。
メッセージをご覧ください 表では、どのユーザーIDとも一致しないIDがいくつか見つかります。そのため、このクエリはメッセージ列にnullを返し、右側の列には一致するものが見つかりません。
MySQLのUNIONは、異なるテーブルの複数の列を1つの列に結合するために使用されます。一意の値を選択するためのUNIONクエリの構造は次のとおりです。
SELECT column_name(s)FROM table1
ユニオン
SELECT column_name(s)FROM table2;
また、列から繰り返し値を選択するには、次のようにします。
SELECT column_name(s)FROM table1
ユニオンオール
SELECT column_name(s)FROM table2;
次に、テーブルからIDを取得しましょう。
$sql = "SELECT id FROM myguests UNION SELECT id FROM messages";
次に、index.phpを開き、 $ sqlを置き換えます。 上記でクエリします。実行すると、結果は次のようになります。
クエリにより、両方のテーブルにあるすべての一意のIDが取得されました。
このタイプのJOINは、Joinのテーブルから行のデカルト積を返します。最初のテーブルの各行と2番目のテーブルの各行を組み合わせたレコードで構成されるテーブルを返します。
Cross JOIN構文は、
SELECT column-name-list from table-name1 CROSS JOIN table-name2;
自己結合は通常の結合ですが、テーブルはそれ自体と結合されます。
SELECT column_name(s) FROM table1 T1, table1 T2 WHERE condition;
FULL OUTER JOINキーワードは、左(table1)または右(table2)のテーブルレコードのいずれかに一致する場合、すべてのレコードを返します。
注:FULL OUTER JOINは、非常に大きな結果セットを返す可能性があります!
SELECT column_name(s) FROM table1 FULL OUTER JOIN table2 ON table1.column_name = table2.column_name;
複数のテーブルに参加
以前のブログでは、異なるSQL結合クエリを使用して2つのテーブルを結合する方法を学習しました。ただし、大規模なアプリケーションで作業している場合、つまりeコマースストアを構築し、その中に顧客、注文、製品などの複数のテーブルを作成している場合、テーブルの結合が複雑になる可能性があります。これを整理するには、特定の顧客から注文されたすべての製品を入手する必要があります。スキーマは同じであるため、ここでは宣言しません。クエリを見てみましょう:
SELECT * FROM table1 LEFT JOIN table2 ON table2.id = table1.id LEFT JOIN table3 ON table3.id = table1.id
まず、テーブル1とテーブル2を結合します。これらは、テーブル1とテーブル2のデータを組み合わせた一時テーブルを提供し、その時点でテーブル3に結合されます。この方程式は、3つ以上のテーブルからN個のテーブルに拡張できます。SQLクエリにN個のテーブルを結合するためのN-1個の結合ステートメントが含まれていることを確認する必要があります。
上記のクエリを使用すると、table1の行(いずれの場合も)を他の2つのテーブルの行に一致させることができます。 LEFT JOINを使用すると、table2とtable3をtable1と結合できます(table2とtable1、table3とtable2だけではありません)。
WHERE、AND、ORDERBYなどの条件を追加することもできます
SELECT * FROM table1 LEFT JOIN table2 ON table2.id = table1.id LEFT JOIN table3 ON table3.id = table2.id WHERE month = 'numberHere' AND (table2.email IS NOT NULL OR table3.email IS NOT NULL) ORDER BY submitdate DESC
結論:
このチュートリアルでは、リレーショナルデータベースで多く使用される結合について学びました。結合は2つのテーブルにのみ使用されるだけでなく、同じ手法を使用して3つ以上のテーブルを結合できます。このMySQLシリーズの第8回の最終回では、MySQLでデータをフェッチおよび並べ替えるために正規表現(REGEX)を使用する方法について説明します。そのためには、ブログニュースレターを購読してください。マネージドPHPスタックにサインアップして、PHP最適化サーバーでこれらのチュートリアルのテストを開始できます。
よくある質問Q。 2つのテーブルを結合するにはどうすればよいですか?
回答: SQLで2つのテーブルを結合するには、主に4つの方法があります。内部結合(列が一致する行を返す)、左結合(左側のテーブルのすべてのレコードと右側のテーブルの一致するレコード)、右側の結合(右側のテーブルのすべてのレコード)左の表の一致するレコード)、およびUnion(重複を削除します)。
Q。 2つのテーブルを結合するために使用できるSQLコマンドは何ですか?
回答: 両方のテーブルから一致するレコードを返すINNERJOINステートメントを使用して、2つのテーブルを結合できます。
Q。結合せずにSQLで2つのテーブルを結合するにはどうすればよいですか?
回答: 次のステートメントを使用すると、実際にJOINステートメントを使用せずにテーブルを結合できます
SELECT * FROM TableA a, TableB b