MySQL データベースの高度なクエリとマルチテーブルクエリ

MySQL データベースの高度なクエリとマルチテーブルクエリ

MySQL マルチテーブルクエリ

ワークシートを追加する

-- ユーザーテーブル (ユーザー)
テーブル `user` を作成します (
	`id` INT AUTO_INCREMENT PRIMARY KEY COMMENT 'ユーザーID(主キー)',
	`username` VARCHAR(50) COMMENT 'ユーザー名', 
	`age` CHAR(3) COMMENT 'ユーザーの年齢'
);

-- 注文
テーブル「注文」を作成します(
	`id` INT AUTO_INCREMENT PRIMARY KEY COMMENT '注文ID(主キー)',
	`price` 二重コメント '注文価格',
	`user_id` INT COMMENT 'ユーザーID(外部キー)'
);

-- 既存のテーブルに外部キーを追加します。構文は次のとおりです: alter table table name add constraint [foreign key name] foreign key (foreign key field) references parent table (primary key field);
ALTER TABLE orders ADD CONSTRAINT user_fk FOREIGN KEY (user_id) REFERENCES `user` (id);

-- ユーザー テーブルにデータを追加します INSERT INTO USER VALUES(1,'第一',11);
INSERT INTO USER VALUES(2,'小等',12);
INSERT INTO USER VALUES(3,'张三',33);
INSERT INTO USER VALUES(4,'李四',24);
USER VALUES(5,'王五',17)に挿入します。
INSERT INTO USER VALUES(6,'赵六',36);
USER VALUES(7,'七七',18)に挿入します。
INSERT INTO USER VALUES(8,'粑粑',NULL);

-- orders テーブルにデータを挿入します INSERT INTO orders VALUES(111,1314,3);
注文にVALUES(112,122,3)を挿入します。
注文にVALUES(113,15,4)を挿入します。
注文にVALUES(114,315,5)を挿入します。
注文にVALUES(115,1014,NULL)を挿入します。
注文にVALUES(116,666,6)を挿入します。
注文にVALUES(117,1111,1)を挿入します。
注文にVALUES(118,8888,NULL)を挿入します。

ここに画像の説明を挿入

ここに画像の説明を挿入

デカルト積

  • 数学では、2 つの集合 X と Y の直積 (直積とも呼ばれる) は、X × Y として表現されます。ここで、最初のオブジェクトは X のメンバーであり、2 番目のオブジェクトは Y のすべての可能な順序付きペアのメンバーです。 (直積) 百度百科事典
  • デカルト積とは何ですか?
`user`,`orders` から * を選択します。

ここに画像の説明を挿入

  • 上の図にあるデータは、私たちプログラマーにとっては何の役にも立ちません。
  • では、デカルト積をどうやって除去するのでしょうか?重複データを削除するには、主キー制約と外部キー制約が必要です。
SELECT * FROM `user` AS u,`orders` AS o WHERE u.`id`=o.`user_id`;

ここに画像の説明を挿入

1. 内部結合

1.1 暗黙的な内部結合

  • fromの直後に複数のテーブル名が出現し、これは暗黙的な内部結合です。
  • テーブル a、テーブル b から * を選択します。この場合、a.id = b.a_id になります。
SELECT * FROM `user` AS u,`orders` AS o WHERE u.`id`=o.`user_id`;

ここに画像の説明を挿入

1.2 内部結合を表示する(推奨)

  • 内部結合を使用してテーブルをリンクし、その後に条件を続けます。 (内側は省略可能)
  • テーブル a から * を選択し、テーブル b を a.id = b.a_id で内部結合します。
  • 成人ユーザーと注文データを照会します。
SELECT * FROM `user` u JOIN `orders` o ON u.`id`=o.`user_id` WHERE age >= 18;

ここに画像の説明を挿入

2. 外部結合

  • 外部リンクは、null を含む単一のテーブルのすべてのデータを表示できます。

2.1 適切な外部リンク

  • 右側の表にすべてのデータを表示します
  • 右外部結合を使用してテーブルをリンクし、その後に on および条件を続けます。 (外側は省略可能)
  • テーブル a から * を選択し、テーブル b を a.id=b.a_id で右外部結合します。
`user` u から * を選択し、 `orders` o を ON u.`id`=o.`user_id` として右結合します。

ここに画像の説明を挿入

左テーブルデータ(ユーザー)

ここに画像の説明を挿入

右の表のデータ(注文)

ここに画像の説明を挿入

2.2 左外側リンク(推奨)

  • 左の表にすべてのデータを表示する
  • 左外部結合を使用してテーブルをリンクし、その後に on および条件を続けます。 (外側は省略可能)
  • テーブル a から * を選択し、テーブル b を a.id=b.a_id で左外部結合します。
SELECT * FROM `user` u LEFT JOIN `orders` o ON u.`id`=o.`user_id`;

ここに画像の説明を挿入

左テーブルデータ(ユーザー)

ここに画像の説明を挿入

右の表のデータ(注文)

ここに画像の説明を挿入

3. サブクエリ

  • サブクエリ、ネストされた感じ。クエリの結果は別のクエリの条件として使用されます。
  • 最も古いユーザーの注文データを照会する
SELECT * FROM orders o WHERE o.`user_id` IN (
	u.`id` を `user` u から選択し、 u.`age` を IN (
		`user` u から MAX(u.`age`) を選択
	)
);

ここに画像の説明を挿入

4. フル接続(MySQLではサポートされていません)

  • 完全な接続、左側と右側のテーブルのすべてのデータ(null を含む)。右外部リンクと左外部リンクの組み合わせに相当します。
  • select * from table a full outer join table b on a.id=b.a_id; (MySQL はこれをサポートしていないため、説明しません)

その他のMySQLの記事については、以下のリンクをご覧ください。

MySQL DDL ステートメント

MySQL CRUD ステートメント

MySQL 集計関数

MySQL マルチテーブルクエリ

終わり…

これで、MySQL データベースの高度なクエリとマルチテーブル クエリに関するこの記事は終了です。MySQL の高度なクエリとマルチテーブル クエリに関するより関連性の高いコンテンツについては、123WORDPRESS.COM で以前の記事を検索するか、以下の関連記事を引き続き参照してください。今後とも 123WORDPRESS.COM をよろしくお願いいたします。

以下もご興味があるかもしれません:
  • SqlクエリMySqlデータベーステーブル名と説明テーブルフィールド(列)情報
  • MySQL データベース SELECT クエリ式分析
  • MySQL データベースの詳細な説明 - 複数テーブル クエリ - 内部結合、外部結合、サブクエリ、相関サブクエリ
  • Mysql データベース テーブルのインデックスによってクエリ速度が向上しないのはなぜですか?
  • MySQL データベース クエリの高度なマルチテーブル クエリの詳細な説明
  • MySQL データベース テーブルにインデックスがあるにもかかわらず、クエリが遅いのはなぜですか?

<<:  Vueリスナーの使用例の詳細な説明

>>:  vue ルーティング ビュー router-view のネストされたジャンプの実装

推薦する

Linux コマンドラインで電卓を使用する 5 つのコマンド

みなさんこんにちは。私は梁旭です。 Linux を使用するときに、計算を行う必要がある場合があり、そ...

MySQLデータ損失の原因と解決策

目次序文問題の説明原因分析拡大する総括する序文最近、データの欠落やデータの損失に関するフィードバック...

Nginxの仕組みの詳細な説明

Nginxの仕組みNginx はコアとモジュールで構成されています。 Nginx 自体は実際にはほと...

Vueカスタムディレクティブの詳細

目次1. 背景2. ローカルカスタム指示3. グローバルカスタム指示4.1 カスタムコマンドフック関...

Vue スキャフォールディングでのレンダリングを理解する

Vue スキャフォールディングでは、エントリ ファイル main.js の新しい Vue コードに、...

Dockerコンテナ起動時に固定IPを設定する実装

Dockerインストール後のネットワークタイプ [root@insure updev]# docke...

MySQLでカンマ区切り値の列を列に変換する方法

序文場合によっては、第 1 正規形設計パターンに従わないビジネス テーブルに遭遇することがあります。...

Linux ファイル操作でよく使われるコマンドのまとめ

0. 新しい操作: mkdir abc #新しいフォルダを作成 touch abc.sh #新しいフ...

手書きの Vue2.0 データハイジャックの例

目次1: webpackをビルドする2. データハイジャック3: まとめ1: webpackをビルド...

Packetdrillの簡潔なユーザーガイド

1. Packetdrillのコンパイルとインストールソースコードリンク https://githu...

React でのポータルとエラー境界処理の実装

目次ポータルエラー境界処理エラー境界を使用しない場合はどうなりますか?注記ポータルスロットとも言えま...

デザイン理論: なぜ私たちは間違った場所を見ているのでしょうか?

数日前、バスで仕事に行きました。バスのカードリーダーの実際の使用シーンを実際に見て、カードリーダーの...

CSS ブラウザ互換性の問題に対する 4 つの解決策

フロントエンドは、技術が急速に進化するだけでなく、知っておくべき事柄が多すぎるという理由で大変な仕事...

HTMLは実際にはいくつかの重要なタグを学ぶアプリケーションです

「これは革命になるだろう」という記事が出たあと。業界の皆様に認知され、もちろん内外からの評価もいただ...

Reactは二次連結(左右連結)を実現する

この記事では、二次リンクを実現するためのReactの具体的なコードを参考までに共有します。具体的な内...