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等操作符。

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

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

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

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

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

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

相关推荐
2501_927993532 分钟前
SQL Server 2022安装详细教程(图文详解,非常详细)
数据库·sqlserver
星火s漫天3 分钟前
第一篇: 使用Docker部署flask项目(Flask + DB 容器化)
数据库·docker·flask
岁岁种桃花儿8 分钟前
CentOS7 彻底卸载所有JDK/JRE + 重新安装JDK8(实操完整版,解决kafka/jps报错)
java·开发语言·kafka
xcLeigh8 分钟前
Python 项目实战:用 Flask 实现 MySQL 数据库增删改查 API
数据库·python·mysql·flask·教程·python3
威迪斯特9 分钟前
Flask:轻量级Web框架的技术本质与工程实践
前端·数据库·后端·python·flask·开发框架·核心架构
xu_yule11 分钟前
Redis存储(15)Redis的应用_分布式锁_Lua脚本/Redlock算法
数据库·redis·分布式
一灰灰blog27 分钟前
Spring AI中的多轮对话艺术:让大模型主动提问获取明确需求
数据库·人工智能·spring
roman_日积跬步-终至千里44 分钟前
【Java并发】Java 线程池实战:警惕使用CompletableFuture.supplyAsync
java·开发语言·网络
毕设源码-钟学长1 小时前
【开题答辩全过程】以 基于Springboot的扶贫众筹平台为例,包含答辩的问题和答案
java·spring boot·后端
Fleshy数模1 小时前
MySQL 表创建全攻略:Navicat 图形化与 Xshell 命令行双模式实践
linux·mysql