この記事では、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 子句的条件,就可以被使用了
上記は WHERE 句です。 WHERE 句のサブクエリは推奨されません。テーブル結合を使用する必要があります。
SQL ステートメントを作成する場合、WHERE サブクエリが最も思考ロジックと一致します
この種のサブクエリは最も単純ですが、最も理解しやすいですが、非常に非効率なサブクエリです。
先ほど説明したクエリを使用して、基本給が会社の平均基本給を超える従業員の情報をクエリしてみましょう。 「WHERE」句で各従業員レコードを「SELECT」サブクエリと比較する場合、サブクエリを再実行する必要があります。従業員テーブルに 10,000 件のレコードがある場合、サブクエリを 10,000 回実行する必要があり、何度も実行するのは非常に非効率です。
クエリ文において、繰り返しクエリされるサブクエリを「相関サブクエリ」と呼びます。ここでの「WHERE」サブクエリは「相関サブクエリ」に属します。この種のサブクエリの使用は避けてください。
クエリ ステートメントでは、「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」サブクエリも相関サブクエリであり、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 サイトの他の関連記事を参照してください。