mysql子查询

1、概念

        子查询就是将一个查询(子查询)的结果作为另一个查询(主查询)的数据来源或判断条件的查询。

2、分类

  • 按查询结果的行列数
    • 标量子查询:结果只有一行一列
    • 列子查询:结果只有一列多行,也称为多行子查询
    • 行子查询:结果有一行多列或多行多列
    • 表子查询:结果一般为多行多列
  • 按子查询出现的位置:SELECT后面、FROM后面、WHERE或HAVING后面、EXISTS后面(相关子查询)
    • SELECT后面:仅仅支持标量子查询。
    • FROM后面:支持表子查询
    • WHERE或HAVING后面:主要支持标量子查询和列子查询,行子查询用得比较少
    • EXISTS后面:支持表子查询

2.1 SELECT后面的子查询

SELECT Column1, (SELECT MAX(Column2) FROM Table2 t2 where t1.id=t2.t1_id) AS MaxValue
FROM Table1 t1;

        主查询的表是Table1,子查询的表是Table2,根据SQL的执行顺序得知此子查询的结果返回的是一个标量

2.2 FROM后面的子查询

        FROM后面一般是表,代表数据源,因此是把子查询的结果当作一张表,且必须给这张表起别名

SELECT avg_t2.*,t1.*
FROM (
	SELECT t2.name,AVG(t2.salary) AS avg_salary
	FROM Table2 t2
	GROUP BY t2.name
) avg_t2
LEFT JOIN Table1 t1
ON t1.name=t2.name;

2.3 WHERE或HAVING后面的子查询

特点

  • 子查询放在小括号内。
  • 子查询一般放在条件的右侧。
  • 标量子查询一般搭配着单行操作符使用,比如:>、<、>=、<=、=、!=;列子查询一般搭配着多行操作符使用,比如IN、ANY/SOME、ALL。
  • 子查询的执行优先于主查询执行,主查询的条件用到了子查询的结果。

示例

select t1.*, 
	( select count(*) from Table2 t2 where t1.id = t2.t1_id ) as t2Count
	from Table1 t1;

2.4 EXISTS后面的子查询

语法:EXISTS(完整的查询语句),括号内的查询语句可以1行1列,也可以多行多列。

结果:1或0,当括号内有查询结果时,返回1,当括号内没有查询结果时,返回0。在逻辑判断中,1可认为是True,0可认为是False。

一般来讲,EXISTS后面的子查询都可以用IN后面的子查询代替,所以用得不是很多。

SELECT t1.*
FROM Table1 t1
WHERE EXISTS(
	SELECT t2.id
	FROM Table1 t2
	WHERE t1.id = t2.t1_id
);

3、缺点

        子查询虽然好用但是也有弊端 使用子查询的主要缺点包括以下几个方面:

  •  执行效率较低:由于子查询需要先执行一次,然后将结果作为临时表再参与外部查询的处理,因此执行效率通常会比较低。
  •  可读性较差:当嵌套多层子查询时,SQL 查询语句的可读性和可维护性会变得较差,特别是对于初学者或不熟悉 SQL 语言的开发人员来说,理解查询语句的逻辑和含义可能会有困难。
  •  可扩展性较差:在使用子查询时,如果需要添加更多的条件或限制,可能需要频繁地嵌套子查询,从而导致查询语句变得冗长和复杂。这也使得查询语句的可扩展性较差。
  •  可能存在逻辑错误:在编写子查询时,需要非常仔细地考虑查询的逻辑和语法,否则可能会导致查询出现错误或返回错误的结果。

        因此,在使用子查询时,需要仔细考虑查询的逻辑和优化方式,以最大程度地提高查询的效率、可读性和可维护性,同时避免出现逻辑错误和产生负面影响。

        如果子查询中的查询条件涉及到了被索引的字段,那么直接加索引可以帮助优化子查询。当使用索引时,数据库可以快速定位匹配结果而不必扫描整个表,从而提高查询效率。

你可能感兴趣的:(数据库,mysql,数据库)