MySQLグループリンクの使用に関する詳細な説明

MySQLグループリンクの使用に関する詳細な説明

MYSQL におけるグループ化とリンクは、データベースの操作やデータのやり取りで最もよく使用される 2 つの機能です。この 2 つの項目を適切に処理すると、MYSQL の実行効率が非常に高くなります。

1. グループ化

名前が示すように、データは各グループがどのような原則と特性を持っているかに応じてグループ化されます。

1. 一番簡単なものから始めましょう:

tb1.sex で tb1 グループから count(*) を選択します。

すべてのデータ項目の数を照会し、性別ごとにグループ化します。このクエリによって取得される結果セットには、count(*) という 1 つの列のみが含まれます。

2. 次に、このグループ化を分析しましょう。select と from の間に何を置くことができますか?

データがグループ化されると、ほとんどのデータ フィールドの意味が失われます。考えてみてください。複数のデータの同じ列に 1 つの値しか表示されない場合、その値は誰に対して表示されるのでしょうか。この値は役に立つのでしょうか。

よく考えてみると、by の列だけを入れることができ、count()、sum() などの SQL 関数操作があることに気づくのは難しくありません。(グループ化の基準として by の後に含まれ、結果として集計関数に含まれる)

例: 各大学の学生数を照会します: (大学の値は大学 ID です)

SELECT a.COLLEGE AS college,COUNT(*) AS number of students FROM base_alumni a GROUP BY a.COLLEGE;

3. where、having、group by を一緒に使用する

初めて group by を学んだとき、group by は where と一緒に使用できず、having のみ使用できるという誤解をしていました...

あなたは本を注意深く読んでいません。実際、それらは一緒に使用できますが、where は group by の前にのみ使用でき、having は group by の後にのみ使用できます。

ここで、フィルター条件のキーワードですが、グループ化前のデータのみをフィルターできます。

Having もフィルタリング条件のキーワードです。機能は where と同じですが、グループ化されたデータをフィルタリングします。つまり、グループ化後に得られた結果セットをフィルタリングします。

目的は、1 つのステートメント内の 2 つの where 句の問題を解決し、それらを区別することだと思います。

例:

30100 の大学の各専攻に何人の学生がいるかを問い合わせます。

SELECT a.MAJOR AS major, COUNT(*) AS number of students FROM base_alumni a WHERE a.COLLEGE = 30100 GROUP BY a.MAJOR;

各大学に何人の学生がいるかを問い合わせます。学生数は 3 人を超えます。

SELECT a.COLLEGE AS college,COUNT(*) AS number of students FROM base_alumni a GROUP BY a.COLLEGE HAVING COUNT(*)>3;

フィルター実行順序:①最初に*をフィルター、②フィルター結果をグループ化、③グループ化結果をフィルター

4. Group By All の使用、ハハハ、私はよくオンラインで確認し、この構文を削除することにしました〜

実は、前のwhereの後に、グループ化された結果にwhereに一致しないデータを表示したいのですが、もちろん計算は行われず、計算結果は0またはnullで表されます。この構文は役に立たない気がして、応用シナリオが思い浮かびません~

2. ディープラーニング接続

接続には、内側接続、フル接続、左外側接続、右外側接続の4種類があります。

1. 接続が表示される場所

① fromとwhereの間にテーブルを接続する

② whereとhavingのうち、havingはgroup byの結果セットをフィルタリングすること、つまりgroup byの結果セットをテーブルとして扱い、それを他のテーブルに接続してさらにフィルタリングすることです。

2. 接続タイプの解釈

テーブルをセット、接続をマッピングとして考えると、結果は次のようになります。

内部結合: 1 対 1 マッピング。完全結合: デカルト積。左外部結合: 1 対 1 マッピング + 左のテーブルは右のテーブルの null に対応。右外部結合: 1 対 1 マッピング + 右のテーブルは左のテーブルの null に対応。

キーワード:

内部結合: 内部結合、完全結合: クロス結合、左外部結合: 左結合、右外部結合: 右結合。

文法:

テーブル a は、テーブル b を a.column 1 = b.column 2 で左結合します。

3. 接続の使用

前のグループ化の例では、結果セットにバグがありました。

例: 各大学の学生数を照会します: (大学の値は大学 ID です)。接続がない場合、現在のテーブルにはこの大学に関する情報がないため、学生数が 0 の大学は表示されません。

では、ここで左結合 (左外部結合) を実行してみましょう。

SELECT c.ID, a.COLLEGE, COUNT(a.COLLEGE) FROM (SELECT ID FROM dic_college) c LEFT JOIN (SELECT COLLEGE FROM base_alumni) a ON c.ID = a.COLLEGE GROUP BY c.ID

ここに完全な文章があります。この文章を書くのにとても苦労しました。

読んでみてください:

まず、大学のテーブルと卒業生の情報テーブル(学生テーブル)の左結合をしてみましょう。

大学が必要なので、大学がメイン テーブルとなり、左結合 c LEFT JOIN a ON ... の前に配置されます。

すると、フィールドが多数あることがわかったので、冗長なフィールドを削除しました。これにより、観察が容易になっただけでなく、SQL の実行効率も向上しました。

①大学テーブルを1つのフィールドのみに変更する(SELECT ID FROM dic_college)

②学生テーブルを1つのフィールドのみに変更します(SELECT COLLEGE FROM base_alumni)

この時点でのクエリ結果は次のようになります

SELECT * FROM (SELECT ID FROM dic_college) c LEFT JOIN (SELECT COLLEGE FROM base_alumni) a ON c.ID = a.COLLEGE

この時点で、結果セットをグループ化します:GROUP BY c.ID、クエリフィールドを変更します

上記の結果セットでは、c.ID と a.COLLEGE が 1 対 1 で対応しています。このとき、count(*) のデータは行の総数です。メイン テーブルは college テーブルなので、このデータは count(c.ID) のデータと同じです。

しかし、a.COLLEGEが空の行の値はすべて1であり、これは望んでいるものではないので、count(*)をcount(a.COLLEGE)に変更すると、データが出てきます。

これは、すべての大学の中で各大学の学生数を問い合わせる正しい答えです。もちろん、上のスクリーンショットはデータの最初の数行のみであり、その背後にはさらに多くのデータがあります。

4. テストした後

左と右が結合します...

SELECT * FROM a LEFT JOIN b ON b.ID = a.FK_ID;

SELECT * FROM b RIGHT JOIN a ON b.ID = a.FK_ID;

2 つのステートメントは同じ結果を生成し、それらの間に他の違いは検出されません。

フル接続はクロス接続であり、接続は使用されません...

SELECT * FROM c,a WHERE c.ID = a.FK_ID;

SELECT * FROM c CROSS JOIN a ON c.ID = a.FK_ID;

これら 2 つのステートメントの間に違いはありません。

上記は、MYSQL のグループ化とリンクの詳細な説明に関するこの記事の内容のすべてです。まだ質問がある場合は、下のコメントエリアで議論することができます。

以下もご興味があるかもしれません:
  • IDEA で MySQL にリンクするとエラー 08001 が発生し、接続に成功した後にテーブルが表示されない問題と解決策
  • MySQLにNavicatをインストールした後、2059が表示され、認証プラグインとローカルリンク仮想マシンdocker、リモートリンクサーバー
  • Python pymysql リンク データベース クエリ結果を Dataframe インスタンスに変換
  • MySQL マルチテーブルクエリ例の詳しい解説 [リンククエリ、サブクエリなど]
  • 操作例 MySQL ショートリンク
  • MySql 8.0.11 のインストール プロセスと Navicat とのリンク時に発生する問題の概要
  • MySqlは、外部ネットワーク接続クライアントの低速問題を解決するためにskip-name-resolveを使用します。
  • SSHトンネルを使用してMySQLサーバーに接続する方法
  • MySQL リンクを表示し、異常なリンクを削除する方法

<<:  WHMCS V7.4.2 グラフィカル インストール チュートリアル

>>:  js の parseInt() の奇妙な動作の調査と修正

推薦する

elementui の el-popover スタイルの変更が有効にならない問題の解決策

element-uiを使用する場合、el-popoverというよく使われるコンポーネントがありますが...

インタラクションデザインと心理学の驚くべきつながり18選

デザイナーは心理学を理解する必要があるデザイナーが知るべき心理学という本は非常に興味深いです。まず、...

Windows Server 2016 リモート デスクトップ サービスの構成とライセンスのアクティブ化 (2 ユーザー)

Server 2016 のリモート デスクトップ接続のデフォルト数は 2 ユーザーです。2 人以上...

CocosCreator 入門チュートリアル: TS で初めてのゲームを作る

目次前提TypeScript と JavaScriptコードエディタの選択TypeScriptを学ぶ...

divの背景を透明に設定する方法の例

div の背景を透明にする一般的な方法は 2 つあります。 1. 不透明度属性を 0 ~ 1 の値に...

Vue Element Sortablejs を使用してテーブル列をドラッグする詳細な説明

1. css: ドラッグテーブル.css @charset "UTF-8"; ....

onfocus="this.blur()" は視覚障害のあるウェブマスターに嫌われている

スクリーン リーダー ソフトウェアの操作ページについて話しているとき、彼はフロントエンドの学生たちに...

JavaScript のフラット配列をツリー構造に変換する例

目次バックグラウンドで10,000個のデータが失われた再帰法非再帰的方法要約するバックグラウンドで1...

Nginx tp3.2.3 404 問題の解決

最近、Apache を nginx に変更しました。TP プロジェクトを実行に移すと、404 エラー...

Dockerfile を使用して Java ランタイム環境のミラーを作成する方法

現在の環境は次のとおりです。セントロス7.5 docker-ce 18.06.1-ce 1. まずc...

Dockerプライベートライブラリの実装

プライベート Docker レジストリのインストールとデプロイは、Docker テクノロジーを導入、...

Windows 10にWSL2 Ubuntu20.04をインストールしてdocker環境を構築する方法

WSLを有効にするシステムがWindows 10 2004以降であることを確認してください 「メニュ...

xHTML タグと HTML タグの違いは何ですか?

すべてのタグは小文字でなければなりませんXHTML では、すべてのタグは小文字でなければなりません。...

Vueは適切なスライドアウトレイヤーアニメーションを実装します

この記事では、適切なスライドアウトレイヤーアニメーションを実装するためのVueの具体的なコードを例と...

HTML 学習ノート - HTML 構文の詳細な説明 (必読)

1. HTML マークアップ言語とは何ですか? HTML は、Web ページの情報を表すマークアッ...