📜  sql 子查询 - SQL (1)

📅  最后修改于: 2023-12-03 15:05:18.713000             🧑  作者: Mango

SQL子查询

在SQL中,一个查询可以包含另一个查询作为子查询。这个子查询可以在主查询的WHERE子句、FROM子句或SELECT子句中使用,并且可以用来完成复杂的查询操作。

子查询的语法

子查询可以嵌套在SELECT语句、FROM语句、WHERE语句或者另一个子查询之中。

SELECT子查询
SELECT col1, col2, col3, ... 
    (SELECT col_x FROM table2 WHERE table1.col1 = table2.col1) AS subquery_col
FROM table1
WHERE subquery_col > 0;

在上面的例子中,我们在SELECT子句中使用了子查询来计算一个新的列subquery_col。这个子查询返回table2中与table1关联的列col_x的值。然后我们可以使用这个新列来进行WHERE过滤。

FROM子查询
SELECT col1, col2, col3 
FROM (SELECT col4 FROM table2 WHERE col5 > 10) AS subquery
JOIN table1 ON subquery.col4 = table1.col1;

在上面的例子中,我们在FROM子句中使用了子查询来创建一个临时表,该表只包含满足条件col5>10的table2的列col4。然后我们使用这个临时表作为子查询的结果集,连接到table1,以获取符合要求的所有列。

WHERE子查询
SELECT col1, col2, col3
FROM table1 
WHERE col4 IN (SELECT col4 FROM table2 WHERE col5 > 10);

在上面的例子中,我们在WHERE子句中使用了子查询来限制结果集,只返回table1中包含在table2中,且满足条件col5>10的列col4。这个子查询返回一个包含列col4的表,作为WHERE过滤语句的条件。

子查询与聚合函数结合
SELECT col1, AVG(col2) 
FROM table1
WHERE col3 > (SELECT AVG(col3) FROM table1)
GROUP BY col1;

在上面的例子中,我们在WHERE子句中使用了子查询来比较每个行的col3值是否大于整个表的col3平均值。如果大于,则该行被筛选出来并参与后续的聚合函数AVG(col2)的计算。最后我们按列分组使用GROUP BY 语句。

总结

SQL子查询是SQL语言的一个核心元素,可以用来创建复杂查询,尤其是那些需要从多个表中检索数据的查询。从上面的例子中可以看出,使用子查询不仅可以帮助我们实现复杂的逻辑查询和数据处理,而且还可以提高查询效率,避免数据冗余,减少不必要的计算。