MySQL 結合テーブルクエリの基本操作 左結合のよくある落とし穴

MySQL 結合テーブルクエリの基本操作 左結合のよくある落とし穴

概要

中小規模のプロジェクトでは、特にレポートを作成するときに、結合テーブル クエリが非常に一般的な操作になります。しかし、データを校正する際に、何か落とし穴は見つかりましたか?この記事では、MySQL でよく使用される結合テーブル クエリの一般的な落とし穴を再現します。

基本環境

テーブルステートメントの作成

`role` が存在する場合はテーブルを削除します。
テーブル `role` を作成します (
 `id` int(11) NOT NULL AUTO_INCREMENT,
 `role_name` VARCHAR(50) DEFAULT NULL COMMENT 'ロール名',
 主キー (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='role table';


`role` VALUES(1, 'Administrator') に挿入します。
`role` VALUES(2, 'ゼネラルマネージャー') に挿入します。
`role` VALUES(3, 'Section Chief') に挿入します。
`role` VALUES(4, 'チームリーダー') に挿入します。

`user` が存在する場合はテーブルを削除します。
テーブル `user` を作成します (
 `id` int(11) NOT NULL AUTO_INCREMENT,
 `role_id` int(11) NOT NULL COMMENT 'ロールID',
 `user_name` VARCHAR(50) デフォルト NULL コメント 'ユーザー名',
 `sex` int(1) デフォルト 0 コメント '性別',
 主キー (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='ユーザーテーブル';

`user` VALUES(1, 1, 'admin', 1) に挿入します。
`user` VALUES(2, 2, 'Manager Wang', 1) に挿入します。
`user` VALUES(3, 2, 'Manager Li', 2) に挿入します。
`user` VALUES(4, 2, 'Manager Zhang', 2) に挿入します。
`user` VALUES(5, 3, 'Section Chief Wang', 1) に挿入します。
`user` VALUES(6, 3, 'Section Chief Li', 1) に挿入します。
`user` VALUES(7, 3, 'Lv Section Chief', 2) に挿入します。
`user` VALUES(8, 3, 'Section Chief Xing', 1) に挿入します。
`user` VALUES(9, 4, 'Team Leader Fan', 2) に挿入します。
`user` VALUES(10, 4, 'Team Leader Zhao', 2) に挿入します。
`user` VALUES(11, 4, 'Ji Team Leader', 1) に挿入します。

データは以下のとおりです

mysql> ロールから * を選択します。
+----+-----------+
| ID | ロール名 |
+----+-----------+
| 1 | 管理者 |
| 2 | ゼネラルマネージャー|
| 3 | 課長 |
| 4 | チームリーダー|
+----+-----------+
セット内の 4 行 (0.00 秒)

mysql> ユーザーから * を選択します。
+----+---------+----------+------+
| ID | ロールID | ユーザー名 | 性別 |
+----+---------+----------+------+
| 1 | 1 | 管理者 | 1 |
| 2 | 2 | 王監督 | 1 |
| 3 | 2 | マネージャー リー | 2 |
| 4 | 2 | 張マネージャー | 2 |
| 5 | 3 | 王課長 | 1 |
| 6 | 3 | 李課長 | 1 |
| 7 | 3 | ルー課長 | 2 |
| 8 | 3 | 邢課長 | 1 |
| 9 | 4 | チームリーダーファン | 2 |
| 10 | 4 | チームリーダー 趙 | 2 |
| 11 | 4 | チームリーダー ジ | 1 |
+----+---------+----------+------+
セット内の行数は 11 です (0.00 秒)

基本的なビジネス

シンプルな情報レポート: ユーザー情報の照会

mysql> 選択
  -> ID、
  -> ユーザー名 AS '名前'、
  -> ( CASE WHEN sex = 1 THEN '男性' WHEN sex = 2 THEN '女性' ELSE '不明' END ) AS '性別'
  -> から
  -> ユーザー;
+----+-----------+--------+
| ID | 名前 | 性別 |
+----+-----------+--------+
| 1 | 管理者 | 男性 |
| 2 | マネージャー王 | 男性 |
| 3 | マネージャー Li | 女性 |
| 4 | マネージャー張 | 女性 |
| 5 | 王課長 | 男性 |
| 6 | 李課長 | 男性 |
| 7 | ルー課長 | 女性 |
| 8 | 課長 邢 | 男性 |
| 9 | チームリーダーファン | 女性 |
| 10 | チームリーダー 趙 | 女性 |
| 11 | Ji チームリーダー | 男性 |
+----+-----------+--------+

各役職名と対応する人員の女性数を照会する

mysql> 選択
  -> r.id、
  -> r.role_name AS ロール、
  -> count( u.sex ) 性別として
  -> から
  -> 役割 r
  -> LEFT JOIN USER u ON r.id = u.role_id
  -> AND u.sex = 2
  -> グループ化
  -> r.ロール名
  -> 順序
  -> r.id ASC;
+----+-----------+-----+
| ID | 役割 | 性別 |
+----+-----------+-----+
| 1 | 管理者 | 0 |
| 2 | ゼネラルマネージャー | 2 |
| 3 | 課長 | 1 |
| 4 | チームリーダー | 2 |
+----+-----------+-----+
セット内の 4 行 (0.00 秒)

性別フィルタリング条件を where 操作に変更するとどうなりますか?

mysql> 選択
  -> r.id、
  -> r.role_name AS ロール、
  -> count( u.sex ) 性別として
  -> から
  -> 役割 r
  -> LEFT JOIN USER u ON r.id = u.role_id
  -> どこ
  -> 米国の性別 = 2
  -> グループ化
  -> r.ロール名
  -> 順序
  -> r.id ASC;
+----+-----------+-----+
| ID | 役割 | 性別 |
+----+-----------+-----+
| 2 | ゼネラルマネージャー | 2 |
| 3 | 課長 | 1 |
| 4 | チームリーダー | 2 |
+----+-----------+-----+
セット内の 3 行 (0.00 秒)

ここで、文字データが不完全であることがわかります。

ゼネラルマネージャーの役​​割を持つ従業員の数を調べる

mysql> 選択
  -> r.id、
  -> r.role_name AS ロール、
  -> count( u.sex ) 性別として
  -> から
  -> 役割 r
  -> LEFT JOIN USER u ON r.id = u.role_id
  -> どこ
  -> r.role_name = 'ゼネラルマネージャー'
  -> グループ化
  -> r.ロール名
  -> 順序
  -> r.id ASC;
+----+-----------+-----+
| ID | 役割 | 性別 |
+----+-----------+-----+
| 2 | ゼネラルマネージャー | 3 |
+----+-----------+-----+
セット内の 1 行 (0.00 秒)

また、フィルター条件を「どこ」から「オン」に変更します

mysql> 選択
  -> r.id、
  -> r.role_name AS ロール、
  -> count( u.sex ) 性別として
  -> から
  -> 役割 r
  -> LEFT JOIN USER u ON r.id = u.role_id
  -> AND r.role_name = 'ゼネラルマネージャー'
  -> グループ化
  -> r.ロール名
  -> 順序
  -> r.id ASC;
+----+-----------+-----+
| ID | 役割 | 性別 |
+----+-----------+-----+
| 1 | 管理者 | 0 |
| 2 | ゼネラルマネージャー | 3 |
| 3 | 課長 | 0 |
| 4 | チームリーダー | 0 |
+----+-----------+-----+
セット内の 4 行 (0.00 秒)

ここで、データが冗長であることがわかります。

要約する

左の結合ステートメントでは、左のテーブル フィルターを where 条件に配置し、右のテーブル フィルターを on 条件に配置する必要があります。これにより、結果が多すぎず少なすぎず、ちょうどよくなります。

これで、MySQL 結合テーブル クエリの基本操作である左結合のよくある落とし穴に関するこの記事は終了です。MySQL 結合テーブル クエリの左結合に関する関連コンテンツについては、123WORDPRESS.COM の以前の記事を検索するか、次の関連記事を引き続き参照してください。今後とも 123WORDPRESS.COM をよろしくお願いいたします。

以下もご興味があるかもしれません:
  • MySQL 派生テーブル(Derived Table)の簡単な使用例分析
  • MySQL ジョイントテーブルクエリの簡単な例
  • MySQL ネストクエリと結合テーブルクエリの最適化方法
  • MySQL でのジョイントテーブルの更新と削除の構文の紹介
  • MySQL 派生テーブル ジョイントテーブル クエリ 実際のプロセス

<<:  派手なカルーセル効果を実現するJavaScript

>>:  Alibaba Cloud Server にセキュリティ グループ ルールを追加する詳細な説明 (グラフィック チュートリアル)

推薦する

Centos7.5 は mysql5.7.24 バイナリ パッケージの展開をインストールします

1. 環境整備:オペレーティング システム: CentOS Linux リリース 7.5.1804 ...

JavaScript 関数のパフォーマンスを測定するさまざまな方法の比較

目次概要パフォーマンス.nowコンソール.time時間精度を短縮注意事項分割して征服する入力値に注意...

CentOS7 64 ビットでの MySQL 5.7 のインストールと設定のチュートリアル

インストール環境: CentOS7 64ビットMINI版、MySQL5.7をインストール1. YUM...

Vue Element フロントエンドアプリケーション開発 テーブルリスト表示

1. リストクエリインターフェースの効果コード処理ロジックを紹介する前に、まずは感覚的に理解し、レン...

MySQL の自動増分主キーが使い果たされた場合の対処方法

面接では、次のようなシナリオを経験する必要があります。インタビュアー: 「MySQL を使用したこと...

JavaScript 状態コンテナ Redux の詳細な説明

目次1. Reduxを選ぶ理由2. Reduxデータフロー3つの原則4. Reduxソースコード分析...

Mysql の mysql.user ユーザー テーブルの詳細な説明

MySQL は、異なるユーザーに異なる権限を割り当てることができるマルチユーザー管理データベースであ...

IDEA 2020 で Tomcat サーバーを構成するための詳細な手順

IDEA 2020 で Tomcat を構成する手順は次のとおりです。最初のステップはTomcatを...

Docker ビルド PHP 環境チュートリアル詳細説明

Dockerのインストール公式インストールスクリプトを使用して最新バージョンのDockerをインスト...

この記事では、Viteがブラウザのリクエストに対して何を行うかを説明します。

目次動作原理:ブラウザは何をするのですか?ホストファイル index.htmlメイン.jsその他のベ...

メンテナンス可能なJSコードの書き方を教えます

目次保守可能なコードとは何ですか?コード規約1. 読みやすさ2. 変数と関数の命名3. 透過的な変数...

MySQL 結合クエリの原則の知識ポイント

MySQL 結合クエリ1. 基本概念2 つのテーブルの各行をペアで水平に接続して、すべての行の結果を...

Linux ネットワーク システムの紹介

目次ネットワーク情報ホスト名を変更するDNSドメイン名解決ネットワーク関連コマンドファイアウォール暗...

nginxを使用してドメイン名ベースの仮想ホストを構成する

1. 仮想ホストとは何ですか?仮想ホストは、特殊なテクノロジーを使用して、実行中のサーバーを論理的に...

XHTML 入門チュートリアル: テーブルタグの応用

<br />テーブルは XHTML では扱いにくいタグなので、このセクションで理解するだ...