DQL
多表查询
多表查询是指在查询时涉及到多个表的操作。常用的多表查询方式包括联结(Join)、子查询(Subquery)、联合查询(Union)等。
联结(Join)是最常用的多表查询方式之一,它通过连接多个表的列,从而实现多表查询的目的。Join有多种类型,包括内连接(Inner Join)、左连接(Left Join)、右连接(Right Join)和全连接(Full Join)等。
子查询(Subquery)是将一个查询语句嵌入到另一个查询语句中作为条件的方式。在子查询中,通常使用了关键字IN、EXISTS或者比较运算符(如=、>、<等)来连接两个查询语句,从而实现多表查询的目的。
联合查询(Union)是将两个或多个查询语句的结果集合并为一个结果集的方式。联合查询要求每个查询语句的列数和列类型相同,否则需要使用转换函数将结果转换为相同类型的数据。
子查询
常用在WHERE子句中的子查询
- 用于比较表达式中的子查询;子查询仅能返回单个值
2. 用于IN中的子查询:子查询应该单独查询并返回一个或多个值重新构成列表
- 用于EXISTS 和 Not EXISTS
4、用于FROM子句中的子查询
FROM子查询指的是将一个SELECT语句作为另一个SELECT语句的FROM子句中的一部分,用于产生虚拟表,以便与另一个表联接。它可以用于复杂的查询,例如从多个表中选择数据和使用聚合函数。常见的用法包括生成汇总报告、分析和比较数据
联合查询:UNION
交叉连接
交叉连接 (Cross join) 是一种MySQL中的查询操作,也被称为笛卡尔积(Cartesian Product)。它会返回两个表中所有行的组合,即没有任何条件限制,返回两个表中每一行的所有组合结果。交叉连接可以使用 CROSS JOIN 或者省略 JOIN 关键字,直接使用逗号 , 连接两个表来实现;
SQL JOIN
inner join
left join和right join
在 SQL 中,LEFT OUTER JOIN 和 LEFT JOIN 是等价的,两者的作用是一样的,都是返回左表中所有的记录,再匹配右表中符合条件的记录,没有匹配的记录设置为NULL。
只不过LEFT OUTER JOIN 是标准 ANSI SQL 的语法,而LEFT JOIN 是 MySQL 数据库特有的语法,不过在大多数情况下,它们的效果是相同的,可以通用。
full join
MariaDB [hellodb]> select * from students s full join teachers t on s.teacherid=t.tid;
ERROR 1064 (42000): You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near 'full join teachers t on s.teacherid=t.tid' at line 1
MYSQL 不支持full join,可使用left join和right join 和union 变通处理
self join
是一种特殊的关系型数据库表(或视图)连接,用于连接同一表中的不同行。在自链接中,同一表被视为两个不同的表,并且需要至少两个表别名或引用原表两次或以上,每个引用都应使用不同的别名。
以下是一个自链接的示例,假设有一个名为employee的表,包含以下字段:id,name,manager_id。其中 id 是员工的唯一标识符,name 是员工的姓名,manager_id 是员工的经理的标识符。
我们可以使用自链接查询来查找每个员工的经理的姓名。查询如下:
SELECT语句处理的顺序
SELECT语句的执行流程:
查询执行路径中的组件:查询缓存、解析器、预处理器、优化器、查询执行引擎、存储引擎