mysql小知识

什么是sql语句的子查询

SQL语句的子查询是指在一个SQL语句中嵌套另一个SQL语句。子查询可以嵌套在主查询的FROM子句、WHERE子句、HAVING子句、SELECT子句或INSERT语句中。

子查询可以返回一个结果集,这个结果集可以被主查询使用。子查询通常用于获取需要在主查询中使用的数据,或者用于限制主查询的结果集。通过子查询,可以在一个查询中完成多个操作。

子查询可以是简单的SELECT语句,也可以是复杂的多表连接和聚合操作。在子查询中可以使用各种SQL语句和操作符,包括WHERE、JOIN、GROUP BY、HAVING、UNION等,以满足不同的查询需求。

使用子查询可以提高查询的灵活性和复杂性,使得查询可以更精确地获取所需的数据。但是,子查询的嵌套过深或使用不当可能会导致查询效率低下或出现错误,因此在使用子查询时需要注意优化和避免潜在的问题。

子查询分类

根据使用子查询的位置和功能,可以将子查询分为以下几类:

  1. **标量子查询(Scalar Subquery):**标量子查询返回单个值作为结果。这种子查询通常嵌套在SELECT语句的列中,用于计算或获取单个值的信息。例如:

    SELECT column1, (SELECT MAX(column2) FROM table2) as max_value
    FROM table1;

  2. **行子查询(Row Subquery):**行子查询返回一行或多行作为结果。这种子查询通常在WHERE子句中使用,并与主查询的条件进行比较。例如:

    SELECT column1
    FROM table1
    WHERE (column2, column3) IN (SELECT column2, column3 FROM table2);

  3. **列子查询(Column Subquery):**列子查询返回一个列作为结果。这种子查询通常在SELECT语句的列中使用,作为某个列的值。例如:

    SELECT column1, (SELECT column2 FROM table2 WHERE table1.column1 = table2.column1) as column2_value
    FROM table1;

  4. **表子查询(Table Subquery):**表子查询返回一个结果集作为结果。这种子查询通常嵌套在FROM子句中,作为一个临时表。例如:

    SELECT t1.column1, t2.column2
    FROM (SELECT column1 FROM table1) as t1
    JOIN (SELECT column2 FROM table2) as t2 ON t1.column1 = t2.column2;

  5. **相关子查询(Correlated Subquery):**相关子查询是指嵌套在主查询中的子查询,可以引用主查询中的列,并与主查询的条件有关。这种子查询的结果集是根据主查询的每一行动态生成的。例如:

    SELECT column1
    FROM table1 t1
    WHERE column2 = (SELECT MAX(column2) FROM table2 WHERE t1.column1 = table2.column1);

关联查询

  1. **内连接(INNER JOIN):**内连接是最常见的关联查询类型,它只返回匹配的行。内连接使用两个表之间的关联条件来匹配行,并返回满足条件的行。

    示例:

    复制代码
    SELECT *
    FROM table1
    INNER JOIN table2 ON table1.column = table2.column;
  2. **左连接(LEFT JOIN):**左连接返回左表中的所有行,以及右表中与左表中匹配的行。如果右表中没有匹配的行,则以NULL填充右表的列。

    示例:

    复制代码
    SELECT *
    FROM table1
    LEFT JOIN table2 ON table1.column = table2.column;
  3. **右连接(RIGHT JOIN):**右连接返回右表中的所有行,以及左表中与右表中匹配的行。如果左表中没有匹配的行,则以NULL填充左表的列。

    示例:

    复制代码
    SELECT *
    FROM table1
    RIGHT JOIN table2 ON table1.column = table2.column;
  4. **全连接(FULL JOIN):**全连接返回左右两个表中的所有行,如果两个表中没有匹配的行,则以NULL填充匹配的一方。

    示例:

    复制代码
    SELECT *
    FROM table1
    FULL JOIN table2 ON table1.column = table2.column;
  5. **自连接(SELF JOIN):**自连接是指在同一表中创建连接。它将表视为两个不同的实体,并使用别名来区分它们。自连接通常用于将表的数据与自身进行比较和分析。

    示例:

    复制代码
    SELECT *
    FROM table1 AS t1
    INNER JOIN table1 AS t2 ON t1.column = t2.column;

区别

  1. **内连接(INNER JOIN):**返回满足连接条件的行,两个表中不匹配的行将被忽略。

  2. 外连接:

    • 左外连接(LEFT JOIN):返回左表中的所有行以及满足连接条件的右表中的匹配行,右表中不匹配的行将以NULL值显示。
    • 右外连接(RIGHT JOIN):返回右表中的所有行以及满足连接条件的左表中的匹配行,左表中不匹配的行将以NULL值显示。
    • 全外连接(FULL OUTER JOIN):返回左表和右表中的所有行,如果没有匹配的行,将以NULL值显示。
  3. **自连接(SELF JOIN):**将表视为两个独立实例并进行连接,通常用于将表中的数据与其自身进行对比或分析。

  4. **交叉连接(CROSS JOIN):**返回两个表中的所有可能组合,结果是两个表的行数乘积。

  5. **自然连接(NATURAL JOIN):**通过比较两个表中的同名列,自动找到匹配的列进行连接,并且只返回一次列名。

  • 内连接只返回满足连接条件的行,而外连接会返回所有的行,对于不匹配的行,会使用NULL值填充。
  • 自连接是将表视为两个独立实例进行连接,用于将表中的数据与其自身进行对比或分析。
  • 交叉连接返回两个表中的所有可能组合,结果是两个表的行数乘积。
  • 自然连接通过比较两个表中的同名列自动找到匹配的列进行连接,只返回一次列名。

总结

子查询:

  • 子查询是在一个查询内部嵌套了另一个查询。
  • 子查询可以在SELECT、FROM、WHERE、HAVING和INSERT语句中使用。
  • 子查询可以返回单个值或者多个值。
  • 子查询可以嵌套多层。
  • 子查询可以用来过滤数据、计算表达式、排序、分组等操作。
  • 子查询的运行效率较低,可能会导致性能问题。

关联查询:

  • 关联查询是在两个或多个表之间建立关联,通过匹配相关字段来获取结果。

  • 关联查询可以使用INNER JOIN、LEFT JOIN、RIGHT JOIN和FULL JOIN等操作符。

  • 关联查询可以返回多个表的列,形成一个虚拟的联合表。

  • 关联查询可以根据关联条件来过滤数据、计算表达式、排序、分组等操作。

  • 关联查询的效率较高,可以通过优化查询语句和创建索引来提高性能。

  • 子查询适合在需要根据查询结果进行进一步操作的场景,灵活性较高,但性能较差。

  • 关联查询适合在需要从多个表中获取相关数据的场景,性能较好,但可读性较差。

  • 在实际使用中,应根据查询的具体需求和数据量来选择子查询或关联查询。

相关推荐
葡萄成熟时 !5 小时前
JAVA 常用API学习笔记
java·笔记·学习
Lyyaoo.6 小时前
Spring Boot Validation 声明式参数校验
spring boot·后端·mysql
Rain的Java大神之路6 小时前
介绍一下分布式事务
java·分布式·后端·spring·spring cloud·架构·springcloud
oradh7 小时前
Oracle闪回技术操作总结
数据库·oracle·oracle闪回技术操作总结·oracle闪回·flashback技术
吴声子夜歌7 小时前
Java面试题——基础(一)
java·开发语言
南城以南溫暖如初1477 小时前
外卖CPS实战指南:从技术选型到运营落地全流程解析
java·spring boot·mysql·架构·vue
ltl7 小时前
RocksDB 并发 Compaction 与 Rate Limiter
数据库
傻啦嘿哟8 小时前
英雄联盟皮肤爬虫:爬取全皮肤价格与特效,做比价工具
java·c++·爬虫
码匠许师傅9 小时前
【C++ 面试真题】24. 聊聊 C++ 的时间日期处理
java·c++·面试
闻道且行之9 小时前
图片处理助手|泊松融合原理 + C++ 工程实现,seamlessClone 三模式一次讲透
数据库·c++·人工智能·opencv