SQL 子查询

子查询

在 SQL 中,子查询(Subquery)是一个嵌套在另一个查询中的查询语句。子查询可以用于在 SELECTINSERTUPDATEDELETE 语句中提供数据或条件。子查询可以返回单个值、一行、一列或多行多列数据。以下是对子查询的详细讲解。

1. 子查询的基本语法

子查询的基本语法如下:

SELECT column1, column2, ...
FROM table_name
WHERE column_name operator (
    SELECT column1, column2, ...
    FROM another_table
    WHERE condition
);
  • column1, column2, ...:要查询的列。
  • table_name:主查询的表。
  • column_name:主查询中用于比较的列。
  • operator:比较运算符,如 =, <>, >, <, >=, <=, IN, NOT IN, EXISTS, NOT EXISTS 等。
  • another_table:子查询的表。
  • condition:子查询的条件。

2. 子查询的类型

子查询可以分为以下几种类型:

  • 标量子查询:返回单个值。
  • 行子查询:返回一行数据。
  • 列子查询:返回一列数据。
  • 表子查询:返回多行多列数据。

示例

假设有一个 employees 表,包含以下数据:

employee_id first_name last_name salary department_id
1 Alice Smith 60000 101
2 Bob Johnson 70000 101
3 Charlie Brown 50000 102
4 David Davis 80000 102
5 Eve White 90000 103

标量子查询

查询工资高于平均工资的员工:

SELECT * 
FROM employees
WHERE salary > (
    SELECT AVG(salary)
    FROM employees
);

结果:

employee_id first_name last_name salary department_id
4 David Davis 80000 102
5 Eve White 90000 103

行子查询

查询工资和部门 ID 与员工 Alice 相同的员工:

SELECT * 
FROM employees
WHERE (salary, department_id) = (
    SELECT salary, department_id
    FROM employees
    WHERE first_name = 'Alice'
);

结果:

employee_id first_name last_name salary department_id
1 Alice Smith 60000 101
2 Bob Johnson 70000 101

列子查询

查询工资高于部门 101 的任何员工工资的员工:

SELECT * 
FROM employees
WHERE salary > ANY (
    SELECT salary
    FROM employees
    WHERE department_id = 101
);

结果:

employee_id first_name last_name salary department_id
4 David Davis 80000 102
5 Eve White 90000 103

表子查询

查询每个部门工资最高的员工:

SELECT e1.*
FROM employees e1
WHERE (
    SELECT COUNT(*)
    FROM employees e2
    WHERE e2.department_id = e1.department_id AND e2.salary > e1.salary
) = 0;

结果:

employee_id first_name last_name salary department_id
2 Bob Johnson 70000 101
4 David Davis 80000 102
5 Eve White 90000 103

EXISTSNOT EXISTS

查询没有订单的客户:

SELECT *
FROM customers c
WHERE NOT EXISTS (
    SELECT 1
    FROM orders o
    WHERE o.customer_id = c.customer_id
);

结果:

customer_id customer_name customer_email customer_age
3 Charlie charlie@example.com 22
全部评论

相关推荐

11-04 19:05
已编辑
东莞城市学院 单片机
不知道怎么取名字_:你这个要实习两年?哪有这么久的,感觉就是即使你毕业了,但还按实习的话,是不是不用给你缴社保公积金啥的
点赞 评论 收藏
分享
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务