MySql のサブクエリ内のクエリ例の詳細な説明

MySql のサブクエリ内のクエリ例の詳細な説明

北西を見ると私の故郷はどこにあるでしょうか。南東の満月を何度見たことがあるでしょうか。

月が再びゆっくりと空に昇っています。寝る前に夢を見ている間に、私の愛する読者の皆さんを MySql の最後のサブクエリ部分の探索へと導きます。

注: 一部のクエリ結果は質問の要件とは異なって表示され、結果を読みやすくするために追加のフィールドが表示される場合があります。実際にこれを実行している読者は、正しい結果を得るために SELECT の後の余分なフィールドを削除できます。

#WHERE または HAVING の後に #1 が続きます。スカラー サブクエリ (単一行サブクエリ)
#2. 列サブクエリ(複数行サブクエリ)
#3. 行サブクエリ(複数列と複数行)
#特徴:
# ① サブクエリは括弧内に配置されます # ② サブクエリは通常、条件の右側に配置されます # ③ スカラーサブクエリ: 通常、単一行演算子とともに使用されます # 単一行演算子: > < >= <= <> !-
# 列サブクエリ。通常は複数行演算子とともに使用されます。# IN、ANY/SOME (any)、ALL
# ④ サブクエリの実行はメインクエリよりも優先され、メインクエリの条件はサブクエリの結果を使用します。
#1. スカラーサブクエリ#ケース 1: 誰の給料が Abel より高いですか?
#①Abelの給与を照会する給与を選択する
従業員から
ここで last_name = 'Abel'; 

#②給与を満たす従業員情報を照会>①ResultSELECT *
従業員から
WHERE salary>(SELECT salary FROM employees WHERE last_name='Abel'); 

#ケース 2. job_id が従業員番号 141 と同じで、給与が従業員番号 143 より高い従業員の名前、job_id、給与を返します。
#①従業員141のjob_idを確認する
ジョブIDを選択
従業員から
ここで、従業員IDは'141'です。 

#②従業員143の給与を確認する
給与を選択
従業員から
ここで、従業員IDは'143'です。 

#③最後に結果をマージする SELECT CONCAT(last_name,first_name) AS name,
job_id ASジョブ番号、
従業員からの給与として
ここで、job_id=(
 ジョブIDを選択
 従業員から
 従業員ID='141'
)
および給与>(
 給与を選択
 従業員から
 従業員ID='143'
); 

#ケース 3. 会社内で最も低い給与の従業員の last_name、job_id、salary を返します。
MIN(給与)を選択
従業員から; 

選択
last_name 姓として、
給料 給料として、
job_id AS ジョブ番号 FROM 従業員
ここで、給与=(
 MIN(給与)を選択
 従業員から
     ); 

#ケース4. 部門番号50の最低賃金より高い最低賃金を持つ部門の部門IDと最低賃金を照会します。
#①50部門の最低給与を確認する SELECT MIN(salary)
従業員から
ここで、department_id=50; 

#グループ化後、フィルター条件①。【部署がないものも除外しないので、部署番号はフィルターしない】
部門IDを部門IDとして選択し、
従業員からの月給としてMIN(給与)
#WHERE 部門ID
部門IDによるグループ化
月給制>(
 MIN(給与)を選択
 従業員から
    ); 

#2. 列サブクエリ(複数行サブクエリ)
#複数行を返す#複数行比較演算子を使用する

#ケース 1. location_id が 1400 または 1700 である部門内のすべての従業員の名前を返します。
#①location_idが1400または1700の部門番号を照会するSELECT DISTINCT department_id
部門から
location_id が(1400,1700)の場合; 

#②従業員名を照会し、部門番号がリストの項目の1つであることを要求します。①SELECT CONCAT(last_name,first_name) AS name FROM employees
部門ID IN (
 SELECT DISTINCT 部門ID
 部門から
 location_id が (1400, 1700) の場合
 ); 

上記と同じ結果を得るには、IN の代わりに ANY を使用します。SELECT CONCAT(last_name,first_name) AS name FROM employees
部門ID = ANY(
 SELECT DISTINCT 部門ID
 部門から
 location_id が (1400, 1700) の場合
 );
# 例: location_id が 1400 または 1700 ではない部門のすべての従業員の名前を返します。
SELECT CONCAT(last_name,first_name) AS name FROM employees
department_id が ( に含まれない ) である場所
 SELECT DISTINCT 部門ID
 部門から
 location_id が (1400, 1700) の場合
);
==============================
SELECT CONCAT(last_name,first_name) AS name FROM employees
部門ID <> ALL(
 SELECT DISTINCT 部門ID
 部門から
 location_id が (1400, 1700) の場合
); 

#ケース2. IT_PROG部門のjob_idを持つ従業員よりも給与が低い他の職種の従業員の従業員IDを返します。
# 名前、job_id、給与
#①IT_PROG部門の給与を照会するSELECT DISTINCT salary
従業員から
ここで、job_id は 'IT_PROG' です。 

#②IT_PROGSELECT以外の部署の情報を調べる*
従業員から
ここで、job_id != 'IT_PROG'; 

#③従業員テーブルで、従業員ID AS 従業員番号を選択するために、①と②をマージします。
CONCAT(姓,名) AS 名前、
job_id ASジョブ番号、
従業員からの給与として
ここで、job_id != 'IT_PROG'
AND 給与<ANY(
 給与を選択
 従業員から
 ここで、job_id='IT_PROG'
  ); 

ANYの代わりにMAXを使用すると、上記のSELECT employee_id AS employee numberと同じ効果が得られます。
CONCAT(姓,名) AS 名前、
job_id ASジョブ番号、
従業員からの給与として
ここで、job_id <> 'IT_PROG'
そして給料<(
 SELECT MAX(給与)
 従業員から
 ここで、job_id='IT_PROG'
  );
#ケース 3. job_id が「IT_PROG」の部門よりも給与が低い他の部門のすべての従業員の従業員番号、名前、job_id、給与を返します。
#①まずはIT_PROG部門の給与を調べます。
給与を個別に選択
従業員から
ここで、job_id は 'IT_PROG' です。 

従業員IDを従業員IDとして選択し、
CONCAT(姓,名) AS 名前、
job_id ASジョブ番号、
従業員からの給与として
WHERE 給与<ALL(
 給与を個別に選択
 従業員から
 ここで、job_id='IT_PROG'
)
 AND ジョブID <> 'IT_PROG';
=============================
ALL ではなく MIN
従業員IDを従業員IDとして選択し、
CONCAT(姓,名) AS 名前、
job_id ASジョブ番号、
従業員からの給与として
給与<(
  MIN(給与)を選択
  従業員から
  ここで、job_id='IT_PROG'
)
 AND ジョブID <> 'IT_PROG'; 

#3. 行サブクエリ(結果セットに 1 行と複数の列、または複数の行と複数の列が含まれる)
#ケース1. 従業員番号が最も小さく、給与が最も高い従業員を照会します。SELECT MIN(employee_id) を導入します。
従業員から;
=================
SELECT MAX(給与)
従業員から; 

選択*
従業員から
ここで、従業員ID = (
 SELECT MIN(従業員ID)
 従業員から
)
給与 = (
 SELECT MAX(給与)
 従業員から
     ); 

このクエリ結果では仮想フィールドが使用され、単一行演算子は一貫している必要があります。結果は上記と同じです。
選択*
従業員から
ここで (従業員ID, 給与)=(
 SELECT MIN(従業員ID)、
 MAX(給与)
 従業員から
       );
#2. SELECT サブクエリ#スカラー サブクエリのみをサポートし、結果は 1 行 1 列になります#ケース 1. 各部門の従業員数をクエリするSELECT d.*,(SELECT COUNT(*) FROM employees)
部門dから; 

条件SELECT d.*,(SELECT COUNT(*)を追加します。
従業員から
e.department_id=d.department_id の場合
) AS numberFROM departments d; 

#ケース2. 従業員番号=102の部署名を照会します。
部門名を選択
部門から;
==============
従業員IDを選択
従業員から
ここで、従業員ID = 102; 

従業員IDを選択します。
(
 部門名を選択
 部門から
 e.department_id=d.department_id の場合
)
従業員から
ここで、従業員IDは102です。 

#3. FROM の後の注意: サブクエリの結果はテーブルとして使用され、別名を指定する必要があります。#ケース: 各部門の平均給与レベルをクエリします。
SELECT ROUND(AVG(給与),2),部門ID
従業員から
部門IDでグループ化; 

e.averagesalary、j.grade_level を選択
job_grades から j へ
、(
SELECT ROUND(AVG(給与),2) AS averagesalary,department_id
 従業員から
 部門IDによるグループ化
) AS e
e.average_sal が j.lowest_sal と j.highest_sal の間である場合;
#1999 文法、教師の答え SELECT e.*,j.grade_level
から (
  SELECT ROUND(AVG(給与),2) AS averagesalary,department_id
  従業員から
  部門IDによるグループ化
) AS e
内部結合 job_grades j
e.average_sal が j.lowest_sal と j.highest_sal の間です。 

#4. EXISTSの後(相関サブクエリ)
構文: EXISTS (完全なクエリステートメント)
注: 完全なクエリ ステートメントは、1 行 1 列、または 1 行複数列にすることができます。 注: 最初に外部クエリを実行し、特定のフィールドの値に従ってフィルター処理します。 EXISTS は、値 (ブール型) が存在するかどうかを判断します。結果は 1、0、いいえの 2 つだけです。 #SELECT EXISTS (SELECT employee_id FROM employees); を導入します。 

給与を含む従業員情報を照会します 3W SELECT EXISTS(SELECT * FROM employees WHERE salary=30000); 

#事例紹介。従業員名と部署名の照会#従業員名と部署名の照会SELECT first_name,department_id
従業員から
部門IDは; 

#部門名を照会する SELECT department_name
部門から; 

#従業員名と部署名をチェックする SELECT e.first_name,d.department_name
従業員から
内部結合 ( SELECT 部門名、部門ID
 部門から
) AS d
オン e.department_id=d.department_id; 

#ケース1..従業員の部署名を照会する SELECT department_name
部門から
存在する場所(
 選択*
 従業員から
 ここで、d.department_id=e.department_id
    ); 

EXISTSの代わりにINを使用すると、上記のSELECT department_nameと同じ結果になります。
部門から
d.department_id IN ( ) のWHERE
 部門IDを選択
 従業員から
     );
#ケース2.恋人がいない男神様の情報を問い合わせる#INメソッドSELECT *
男の子から
bo.id が IN でない(
 ボーイフレンドIDを選択
 美しさから
);
===============
#EXISTS メソッド SELECT *
男の子から
存在しない場所(
 ボーイフレンドIDを選択
 美しさから
 ここで、bo.id=be.boyfriend_id
); 

上級 9: ユニオン クエリ UNION ユニオン マージ: 複数のクエリ ステートメントの結果を 1 つの結果にマージします。
文法:
 クエリステートメント 1
 連合
 クエリ 2
 連合
 ...

適用シナリオ:
クエリされる結果は複数のテーブルから取得され、複数のテーブル間に直接的な接続はありません。
ただし、クエリ情報が一貫している場合。
Web ページの検索コンテンツでは、さまざまなテーブルからコンテンツが取得され、結合されてユーザーに返されます。

特徴:
1. 複数のクエリ ステートメント内のクエリ列の数は一貫している必要があります。
2. 複数のクエリ ステートメント内の各列の型と順序は一貫している必要があります。
3. デフォルトで重複を削除するには、UNION キーワードを使用します。UNION ALL を使用すると、重複を含むすべての項目が表示されます。 

これを注意深く読んでくださった皆様に感謝します。MySql クエリの部分は終了です。私のブログのテンプレートに従って、いくつかの簡単な SQL クエリ ステートメントを完了できると思います。SQL を学習したので、今後はもっと練習してください。SQL1992 および 1999 構文は、主流のリレーショナル データベースで共通です。今後もMySQLの知識を広げていきますので、興味のある方はフォローしてください! o(^▽^)o

これで、MySql のサブクエリ内のクエリ例の詳細な説明に関するこの記事は終了です。サブクエリ内の MySql クエリに関するより関連性の高いコンテンツについては、123WORDPRESS.COM の以前の記事を検索するか、以下の関連記事を引き続き参照してください。今後とも 123WORDPRESS.COM をよろしくお願いいたします。

以下もご興味があるかもしれません:
  • MySQL の列サブクエリと行サブクエリ操作に関するチュートリアル
  • MYSQL サブクエリとネストされたクエリの最適化例の分析
  • MySQL のサブクエリの例
  • MySQL サブクエリ (ネストされたクエリ)、結合テーブル、複合クエリの詳細な説明
  • MySQL チュートリアル: サブクエリの例の詳細な説明

<<:  Ubuntu 18.04 に Nvidia グラフィック カード ドライバーをインストールするチュートリアル (画像とテキスト付き)

>>:  Vue プロジェクトでブラウザ キャッシュ設定を無効にする例

推薦する

MySQLはランダムに一定数のレコードを抽出します

以前は、このような使用シナリオを処理するために rand() で直接 order していましたが、効...

MySQL で 1000 万件のレコードをすばやくクエリする方法

目次通常のページングクエリ最適化する方法大きなオフセット使用ID制限大量データ問題の最適化通常のペー...

Javascriptで戦略パターンを実装する方法

目次概要コードの実装要約する概要戦略パターンは、JavaScript デザイン パターンにおける動作...

Angular環境構築と簡単な体験のまとめ

Angular入門Angular は、Google が開発したオープンソースの Web フロントエン...

MySQLからClickHouseに移行する5つの方法

データ移行は、MySQL から ClickHouse にインポートする必要があります。概要プランは以...

SQL文のパフォーマンスを分析するための標準的な要約

この記事では、explain を使用して SQL ステートメントを分析する方法を紹介します。実際、イ...

HTML 言語百科事典

123WordPress.com-HTML noscriptオブジェクトolオプションPパラントプレ...

検索テキストボックスがフォーカスを外れたときにテキストの位置がジャンプする問題の解決方法

検索テキストボックスにテキストを設定すると、フォーカスを外すと位置がジャンプしますコードをコピーコー...

フレームセットを使用して複雑なページレイアウトを実装するためのテクニックの概要

コードをコピーコードは次のとおりです。 <html> <!--混合フレームレイアウ...

WEB 標準ウェブページ構造

背景画像でも、ページ上のテキストサイズでも、1 ピクセルの違いは非常に明白です。そして、私は学生時代...

HTMLおよびJSPページがキャッシュされ、Webサーバーから再取得されるのを防ぎます。

ユーザーがログアウトした後、ブラウザの戻るボタンがクリックされると、Web アプリケーションは保護さ...

HTMLフォーム入力監視の詳細な理解

今日、入力イベントに関するブログ投稿を見て、気まぐれで関連情報を整理してみました。イベント:関数 c...

Ubuntu 18.04 (コミュニティ エディション) に Docker CE をインストールする方法

古いバージョンをアンインストールする以前に古いバージョンをインストールしたことがある場合は、まずそれ...

ドロップダウンメニューを実装するためのネイティブ js

ドロップダウン メニューも実生活では非常に一般的です。実装に使用される js コードは、タブ選択やア...

MySQL でテーブル メタデータ ロックを待機する理由と方法

MySQL が alter table などの DDL 操作を実行すると、テーブル メタデータ ロッ...