ホームページ > データベース > mysql チュートリアル > MySQL データベースのサブクエリ構文ルールの概要

MySQL データベースのサブクエリ構文ルールの概要

WBOY
リリース: 2022-08-12 20:49:04
転載
2090 人が閲覧しました

この記事では、mysql に関する関連知識を提供します。主にデータベース サブクエリの構文規則に関連する問題を紹介します。サブクエリとは、クエリ ステートメントにネストされたクエリです。これは、データを抽出するときに、依存関係のある未知のデータがたくさんありますので、一緒に見ていきましょう、皆さんのお役に立てれば幸いです。

MySQL データベースのサブクエリ構文ルールの概要

推奨学習: mysql ビデオ チュートリアル

サブクエリは、クエリ ステートメント内にネストされたクエリです。データには、依存関係のある未知のデータが多数あります。このとき、まずデータセットの結果セットをクエリし、次にこの結果セットを次のクエリのオブジェクトとして使用する必要があります。 「テーブル接続の章」で、サブクエリの効率が低いことについてお話しました。実際、すべてのサブクエリが非効率であるわけではありません。レコードを照合するときに、「WHERE」サブクエリを繰り返し実行する必要があります。これは真実ではありません。推奨されています。ただし、クエリ結果セットをテーブルとして使用し、他のテーブルと接続する場合、これは "FROM" 句のサブクエリになります。このサブクエリ方法は引き続き推奨されます。

詳しくは、サブクエリは「単一行サブクエリ」、「複数行サブクエリ」、「WHERE」サブクエリ、「FROM」サブクエリ、および「SELECT」サブクエリに分けられます。これらはすべてこの章で説明します。学ぶ必要があります。

サブクエリの概要

サブクエリは、クエリ ステートメント内にネストされたクエリです。

通常のクエリ ステートメントは、「SELECT」サブクエリと「FROM」サブクエリ、「WHERE」に分かれています。 subquery; (「'FROM' subquery」を使用することを強くお勧めします)

サブクエリの例は次のとおりです:

基本給与が会社の平均基本給与を超える従業員の情報をクエリします。 (以前にこのケースを作成するためにテーブル結合を使用しました。ここでは、サブクエリを使用してそれを実装する方法を見ていきます。)

SELECT
    empno, ename, sal
FROM 
    t_emp
WHERE
    sal >= (SELECT AVG(sal) FROM t_emp);
    
-- 正常情况下,将聚合函数作为 WHERE 子句的条件是不可以的,但是这里利用子查询与聚合函数先将平均底薪查询出来,这就变成具体的数据了
-- 这种情况下,作为 WHERE 子句的条件,就可以被使用了
ログイン後にコピー

上記は WH​​ERE 句です。 WHERE 句のサブクエリは推奨されません。テーブル結合を使用する必要があります。

WHERE サブクエリ

SQL ステートメントを作成する場合、WHERE サブクエリが最も思考ロジックと一致します

この種のサブクエリは最も単純ですが、最も理解しやすいですが、非常に非効率なサブクエリです。

先ほど説明したクエリを使用して、基本給が会社の平均基本給を超える従業員の情報をクエリしてみましょう。 「WHERE」句で各従業員レコードを「SELECT」サブクエリと比較する場合、サブクエリを再実行する必要があります。従業員テーブルに 10,000 件のレコードがある場合、サブクエリを 10,000 回実行する必要があり、何度も実行するのは非常に非効率です。

クエリ文において、繰り返しクエリされるサブクエリを「相関サブクエリ」と呼びます。ここでの「WHERE」サブクエリは「相関サブクエリ」に属します。この種のサブクエリの使用は避けてください。

FROM サブクエリ

クエリ ステートメントでは、「FROM」サブクエリは 1 回だけ実行されます。これは、「WHERE」サブクエリの逆であるため、クエリ効率が非常に高い。

同様に、基本給が会社の平均基本給を超える従業員情報のクエリを例として、「FROM」サブクエリがどのように実装されるかを見てみましょう。

SELECT
    e.empno, e.ename, e.sal, t.avg
FROM t_emp e 
JOIN (SELECT deptno, AVG(sal) AS avg FROM t_emp GROUP BY deptno) t
ON e.deptno = t.deptno 
AND e.sal >= t.avg;

-- 首先,按照每一个部门编号去分组,然后统计部门标号与该部门对应的平均月薪。将这个结果集作为一张临时的表与员工的表做连接。
-- 连接的条件为 "员工表" 的 "部门编号" = "结果集" 的 "部门编号",并且员工的月薪大于部门的平均月薪
ログイン後にコピー

したがって、この質問は「FROM」サブクエリを使用して簡単に実装でき、「WHERE」サブクエリを使用する必要はありません。 「FROM」サブクエリは相関サブクエリではないため、一部の問題を解決する場合は、このサブクエリの種類を制限する必要があります。

SELECT サブクエリ

正直に言うと、これまで経験したプロジェクトの中で、この種のサブクエリは見たことがありません。

その理由は、「SELECT」サブクエリも相関サブクエリであり、SQL 文内で繰り返し実行されるため、クエリ効率が非常に低いためです。

ここで例を挙げます。 たとえば、各従業員の部門情報をクエリしたい場合、

SELECT
    e.empno,
    e.ename,
    (SELECT dname FROM t_dept WHERE deptno = e.deptno) AS 部门名称
FROM t_emp e;

-- 先试用 "SELECT" 子查询查询出 "部门表" 中的部门名称,约束条件为 "部门表"中的 "部门编号" 与 "员工表"中的 "部门编号" 一致
-- 将 "SELECT" 子查询得到的 "部门名称" 作为SQL语句中的一个字段进行输出
ログイン後にコピー

実行結果は正しいですが、 , ただし、実行効率が低すぎるため、この「SELECT」サブクエリ方法は推奨されません。理解してください。他の人が「SELECT」サブクエリを使用しているのを見ると、親切にするのが最善です。

推奨学習: mysql ビデオ チュートリアル

以上がMySQL データベースのサブクエリ構文ルールの概要の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

関連ラベル:
ソース:jb51.net
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
最新の問題
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート