mysql学习教程,从入门到夺目,SQL子查询(38)

[复制链接]
发表于 2026-1-12 02:07:26 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?立即注册

×
1、SQL子查询

SQL子查询(也称为嵌套查询或内部查询)是一个嵌套在另一个查询内部的查询。子查询可以出现在SELECT、INSERT、UPDATE或DELETE语句中,而且可以用在WHERE、FROM或SELECT列表中。以下是SQL子查询的一些根本语法和用法示例:
1.1、根本语法
  1. SELECT column_name(s)
  2. FROM table_name
  3. WHERE column_name OPERATOR (SELECT column_name(s)
  4.                             FROM table_name
  5.                             WHERE condition);
复制代码

  • OPERATOR:这是比力运算符,如=、>、<、>=、<=、<>、IN、ANY、ALL等。
  • SELECT column_name(s) FROM table_name WHERE condition:这是子查询,它返回一个或多个值,这些值将用于外部查询的比力。
1.2、用法示例

1. 在WHERE子句中使用子查询

查询工资高于公司均匀工资的员工:
  1. SELECT name, salary
  2. FROM employees
  3. WHERE salary > (SELECT AVG(salary) FROM employees);
复制代码
2. 在FROM子句中使用子查询(将子查询作为临时表)

查询每个部门的员工数目:
  1. SELECT department_id, employee_count
  2. FROM (
  3.     SELECT department_id, COUNT(*) AS employee_count
  4.     FROM employees
  5.     GROUP BY department_id
  6. ) AS dept_counts;
复制代码
在这个例子中,子查询起首按部门分组并盘算员工数目,然后外部查询从这个临时表(别名为dept_counts)中选择数据。
3. 在SELECT列表中使用子查询(作为盘算列)

查询每个员工的工资以及他们地点部门的均匀工资:
  1. SELECT name, salary,
  2.        (SELECT AVG(salary)
  3.         FROM employees e2
  4.         WHERE e1.department_id = e2.department_id) AS dept_avg_salary
  5. FROM employees e1;
复制代码
在这个例子中,对于employees表中的每一行,子查询都会盘算并返回该员工地点部门的均匀工资。注意,这种用法大概会导致性能标题,由于它会为每一行都实行一次子查询。
4. 使用IN操纵符的子查询

查询属于特定部门ID列表的员工:
  1. SELECT name, department_id
  2. FROM employees
  3. WHERE department_id IN (SELECT department_id FROM departments WHERE location = 'New York');
复制代码
在这个例子中,子查询返回位于纽约的部门的ID列表,然后外部查询选择那些部门ID在子查询效果会合的员工。
5. 使用EXISTS操纵符的子查询

查询有至少一个员工工资高出50000的部门:
  1. SELECT department_name
  2. FROM departments d
  3. WHERE EXISTS (
  4.     SELECT 1
  5.     FROM employees e
  6.     WHERE e.department_id = d.department_id AND e.salary > 50000
  7. );
复制代码
在这个例子中,子查询查抄是否存在工资高出50000的员工,而且该员工的部门与外部查询的部门雷同。如果子查询返回至少一行,EXISTS效果为真,外部查询则返回该部门名称。
固然!以下是一个关于怎样使用SQL子查询的示例。假设我们有两个表:employees 和 departments。employees 表包罗员工的信息,而 departments 表包罗部门的信息。这两个表通过 department_id 字段关联。
表结构如下:
employees 表

  • employee_id
  • name
  • department_id
  • salary
    departments 表
  • department_id
  • department_name
假设我们想查询每个部门中薪水最高的员工的姓名和部门名称。这可以通过使用子查询来实现。以下是具体的SQL查询:
  1. SELECT e.name, d.department_name, e.salary
  2. FROM employees e
  3. JOIN departments d ON e.department_id = d.department_id
  4. WHERE (e.department_id, e.salary) IN (
  5.     SELECT department_id, MAX(salary)
  6.     FROM employees
  7.     GROUP BY department_id
  8. );
复制代码
这个查询的表明如下:

  • 子查询部门:
    1. SELECT department_id, MAX(salary)
    2. FROM employees
    3. GROUP BY department_id
    复制代码
    这个子查询返回每个部门中薪水最高的纪录。它按 department_id 分组,并使用 MAX(salary) 函数获取每个部门的最高薪水。
  • 主查询部门:
    1. SELECT e.name, d.department_name, e.salary
    2. FROM employees e
    3. JOIN departments d ON e.department_id = d.department_id
    4. WHERE (e.department_id, e.salary) IN (...)
    复制代码
    主查询从 employees 表和 departments 表中选择员工的姓名、部门名称和薪水。它通过 JOIN 操纵将两个表毗连在一起,并使用 WHERE 子句来过滤纪录。
    WHERE 子句中的 (e.department_id, e.salary) IN (...) 用于确保只选择那些薪水与子查询效果中最高薪水匹配的纪录。
通过这种方式,我们可以得到每个部门中薪水最高的员工的姓名和部门名称。
渴望这个示例对你有所资助!如果你有任何其他标题或须要进一步的表明,请告诉我。
注意事项


  • 子查询必须始终返回与外部查询盼望的比力范例相匹配的数据范例。
  • 在某些情况下,子查询大概会导致性能标题,特殊是当它们返回大量数据或须要为外部查询的每一行都实行一次时。在这种情况下,思量使用毗连(JOIN)或其他优化技能。
  • 始终确保子查询中的条件精确地引用了外部查询(如果有的话)中的列,以克制不测的效果。
固然可以。以下是几个使用SQL子查询的具体案例,这些案例涵盖了差异范例的子查询以及它们在实际应用中的用法。
案例一:查询工资高于公司均匀工资的员工

假设我们有一个 employees 表,此中包罗员工的姓名和工资信息。我们想找出那些工资高于公司均匀工资的员工。
  1. SELECT name, salary
  2. FROM employees
  3. WHERE salary > (SELECT AVG(salary) FROM employees);
复制代码
在这个查询中,子查询 (SELECT AVG(salary) FROM employees) 盘算了公司全部员工的均匀工资。然后,主查询选择那些工资高于这个均匀值的员工。
案例二:查询每个部门中工资最高的员工

这个案例与之前的示例雷同,但这次我们不但要找出薪水最高的员工,还要表现他们地点的部门。
  1. SELECT e.name, d.department_name, e.salary
  2. FROM employees e
  3. JOIN departments d ON e.department_id = d.department_id
  4. WHERE (e.department_id, e.salary) IN (
  5.     SELECT department_id, MAX(salary)
  6.     FROM employees
  7.     GROUP BY department_id
  8. );
复制代码
在这个查询中,子查询起首按部门分组并找出每个部门的最高工资。然后,主查询使用 JOIN 将 employees 表和 departments 表毗连起来,并通过 WHERE 子句中的 IN 操纵符来过滤出那些工资与子查询效果中最高工资匹配的纪录。
案例三:查询属于特定种别的产物名称

假设我们有一个 products 表和一个 categories 表。products 表包罗产物的名称和种别ID,而 categories 表包罗种别ID和种别名称。我们想找出属于特定种别(比方“Electronics”)的产物名称。
  1. SELECT product_name
  2. FROM products
  3. WHERE category_id IN (
  4.     SELECT category_id
  5.     FROM categories
  6.     WHERE category_name = 'Electronics'
  7. );
复制代码
在这个查询中,子查询 (SELECT category_id FROM categories WHERE category_name = 'Electronics') 找出了全部种别名称为“Electronics”的种别ID。然后,主查询选择那些种别ID与子查询效果匹配的产物名称。
案例四:查询工资高于本部门均匀工资的员工

这个案例要求我们找出那些工资高于他们地点部门均匀工资的员工。这次我们须要使用干系子查询。
  1. SELECT name, salary, department_id
  2. FROM employees e1
  3. WHERE salary > (
  4.     SELECT AVG(salary)
  5.     FROM employees e2
  6.     WHERE e1.department_id = e2.department_id
  7. );
复制代码
在这个查询中,子查询依赖于外部查询的 department_id 列。每次外部查询遍历到某一行时,子查询都会实行一次以盘算该部门的均匀工资。然后,主查询选择那些工资高于这个均匀值的员工。
案例五:查询有员工工资高出特定金额的部门

假设我们想知道哪些部门有员工的工资高出了特定金额(比方100000)。
  1. SELECT department_name
  2. FROM departments d
  3. WHERE EXISTS (
  4.     SELECT 1
  5.     FROM employees e
  6.     WHERE e.department_id = d.department_id AND e.salary > 100000
  7. );
复制代码
在这个查询中,子查询查抄是否存在工资高出100000的员工,而且该员工的部门与外部查询的部门雷同。如果子查询返回行,EXISTS 效果为真,外部查询则返回该部门名称。
这些案例展示了SQL子查询在差异场景下的应用。通过机动使用子查询,我们可以构建出强大且复杂的查询来满意各种业务需求。
回复

使用道具 举报

登录后关闭弹窗

登录参与点评抽奖  加入IT实名职场社区
去登录
快速回复 返回顶部 返回列表