MySQL 子查询

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档


前言

在这里记录一些子查询方法。

一、查询平均工资最低的部门

SELECT department_id
FROM employees
GROUP BY department_id
HAVING AVG(salary) <= ALL (
                    SELECT AVG(salary) avg_sal
                    FROM employees
                    GROUP BY department_id
)

二、查询员工中工资大于本部门平均工资的员工的last——name,salary和department_id

方式一:

在这里插入图片描述

方式二:在form中使用子查询

SELECT last_name,salary,e1.department_id
FROM employees e1,
     (SELECT department_id,AVG(salary) dept_avg_sal 
      FROM employees 
      GROUP BY department_id) e2
WHERE e1.`department_id` = e2.department_id
AND e2.dept_avg_sal < e1.`salary`;

三、查询员工的id,salary,按照department_name 排序

SELECT employee_id,salary
FROM employees e
ORDER BY (
        SELECT department_name
        FROM departments d
        WHERE e.`department_id` = d.`department_id`
);

四、若employees表中employee_id与job_history表中employee_id相同的数目不小于2,输出这些相同id的员工的employee_id,last_name和其job_id

SELECT e.employee_id, last_name,e.job_id
FROM employees e
WHERE 2 <= (
         SELECT COUNT(*)
         FROM job_history
         WHERE employee_id = e.employee_id);

五、相关更新

在employees中增加一个department_name字段,数据为员工对应的部门名称

# 1)
ALTER TABLE employees
ADD(department_name VARCHAR2(14));
# 2)
UPDATE employees e
SET department_name = (SELECT department_name
                      FROM departments d
                      WHERE e.department_id = d.department_id);

删除表employees中,其与emp_history表皆有的数据

DELETE FROM employees e
WHERE employee_id in
                (SELECT employee_id
                 FROM emp_history
                 WHERE employee_id = e.employee_id);
<think>嗯,用户想了解MySQL子查询的使用方法、示例和解释。首先,我需要明确子查询的基本概念,确保自己理解正确。子查询是嵌套在另一个查询中的查询,可以出现在SELECT、FROM、WHERE等子句中。然后,用户可能需要具体的例子,比如在WHERE子句中使用子查询来过滤数据,或者在FROM子句中使用派生。 接下来,得考虑不同的子查询类型,比如标量子查询、行子查询、列子查询等,每种类型需要不同的示例。还要注意子查询与JOIN的区别,可能用户也会混淆这两者,所以需要解释适用场景。另外,性能方面,子查询可能会影响效率,尤其是关联子查询,这时候可能需要提到优化方法,比如使用JOIN替代或者确保索引正确。 用户的问题可能还包括常见的错误,比如子查询返回多行导致错误,这时候需要提醒使用IN、ANY、ALL等操作符。此外,EXISTS和NOT EXISTS的使用场景也是重点,应该举例说明。最后,整理一些注意事项,比如性能优化和可读性,帮助用户避免常见陷阱。 需要确保所有SQL示例语法正确,并且使用中文解释清楚。可能用户是初学者,所以步骤要详细,示例要简单明了。同时,生成的相关问题要覆盖子查询的不同方面,比如定义、与JOIN的比较、性能优化等,这样用户可以有进一步学习的路径。</think>### MySQL子查询使用方法及示例 MySQL子查询是通过将一个查询语句嵌套在另一个查询中实现数据筛选或计算的核心功能[^1]。 #### 一、基础语法结构 $$ SELECT \ 列名 \ FROM \ 1 \ WHERE \ 列A \ IN \ (SELECT \ 列B \ FROM \ 2) $$ 这是典型的WHERE子句子查询应用,括号内的查询结果将作为外层查询的条件值[^2]。 #### 二、主要应用场景 1. **WHERE子查询**(过滤条件): ```sql SELECT product_name FROM products WHERE category_id IN ( SELECT category_id FROM categories WHERE parent_id = 5 ) ``` 此例通过子查询获取特定父类下的所有子类商品[^3] 2. **FROM子查询**(派生): ```sql SELECT avg_salary FROM ( SELECT department, AVG(salary) as avg_salary FROM employees GROUP BY department ) AS dept_stats WHERE avg_salary > 5000 ``` 将分组统计结果作为临时进行二次查询 3. **SELECT子查询**(计算列): ```sql SELECT order_id, (SELECT customer_name FROM customers WHERE customers.id = orders.customer_id) AS buyer FROM orders ``` 在结果集中动态获取关联信息 #### 三、特殊运算符 1. **EXISTS检测**: ```sql SELECT * FROM employees e WHERE EXISTS ( SELECT 1 FROM projects WHERE lead_id = e.emp_id ) ``` 验证是否存在关联项目记录 2. **比较运算符组合**: ```sql SELECT * FROM products WHERE price > ALL ( SELECT avg_price FROM price_stats WHERE region = 'Asia' ) ``` 通过ALL运算符进行多值比较 #### 四、性能优化建议 1. 为子查询中的关联字段建立索引 2. 深度嵌套查询可转换为JOIN语句: ```sql SELECT p.product_name FROM products p JOIN categories c ON p.category_id = c.category_id WHERE c.parent_id = 5 ``` 3. 使用EXPLAIN分析执行计划
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值