多表查询(MYSQL)

1. 概念

多表查询是指从多张表中查询数据。通过连接多个表,可以获取跨表的数据信息,从而满足复杂的查询需求。

2. 笛卡尔积

在多表查询中,笛卡尔积是指两个表的所有组合情况。例如,表A有m行,表B有n行,则笛卡尔积的结果会有m×n行。笛卡尔积通常是无效的,需要通过条件过滤来避免。

3. 多表查询的分类

多表查询主要分为以下几种类型:

3.1 内连接(INNER JOIN)

内连接查询返回两个表的交集部分,即满足连接条件的记录。

SELECT 字段列表
FROM 表1
INNER JOIN 表2
ON 条件;

3.2 左外连接(LEFT JOIN)

左外连接返回左表的所有记录,以及右表中满足连接条件的记录。如果右表中没有匹配的记录,则返回NULL。

SELECT 字段列表
FROM 表1
LEFT JOIN 表2
ON 条件;

3.3 右外连接(RIGHT JOIN)

右外连接返回右表的所有记录,以及左表中满足连接条件的记录。如果左表中没有匹配的记录,则返回NULL。

SELECT 字段列表
FROM 表1
RIGHT JOIN 表2
ON 条件;

3.4 子查询(Subquery)

子查询是指在一个查询语句中嵌套另一个查询语句。子查询可以分为单行子查询和多行子查询。

  • 单行子查询:返回单行单列的结果。

  • 多行子查询:返回多行单列或多行多列的结果。

-- 单行子查询示例
SELECT 字段列表
FROM 表1
WHERE 字段 = (SELECT 字段 FROM 表2 WHERE 条件);

-- 多行子查询示例
SELECT 字段列表
FROM 表1
WHERE 字段 IN (SELECT 字段 FROM 表2 WHERE 条件);

4. 示例

假设我们有两个表:employees(员工表)和departments(部门表),表结构如下:

  • employees 表:

    • id(员工ID)

    • name(员工姓名)

    • department_id(部门ID)

  • departments 表:

    • id(部门ID)

    • department_name(部门名称)

4.1 内连接查询

查询员工及其所在部门的名称:

SELECT e.name AS 员工姓名, d.department_name AS 部门名称
FROM employees e
INNER JOIN departments d
ON e.department_id = d.id;

4.2 左外连接查询

查询所有员工及其所在部门的名称(即使某些员工没有分配部门):

SELECT e.name AS 员工姓名, d.department_name AS 部门名称
FROM employees e
LEFT JOIN departments d
ON e.department_id = d.id;

4.3 子查询查询

查询部门名称为“技术部”的员工信息:

SELECT *
FROM employees
WHERE department_id = (SELECT id FROM departments WHERE department_name = '技术部');

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值