1.3 子查询
语法:select * from 表1 where (子查询)
外面的查询称为父查询
子查询为父查询提供查询条件
1.3.1 标量子查询
特点:子查询返回的值是一个
-- 查找笔试成绩是80的学生
mysql> select * from stuinfo where stuno=(select stuno from stumarks where writtenexam=80);
+--------+---------+--------+--------+---------+------------+
| stuNo | stuName | stuSex | stuAge
在SQL语言中,子查询是一种强大的工具,它允许在一个查询语句内部嵌套另一个查询,以实现更复杂的查询逻辑。本篇文章将详细讲解MySQL数据库中的子查询,包括标量子查询和列子查询。
1. **标量子查询**:
标量子查询的特点是返回单个值,这个值可以作为外部查询(父查询)的条件。例如,假设我们有一个`stuinfo`表存储学生信息,另一个`stumarks`表存储学生的考试成绩。如果我们想找出所有笔试成绩达到80分的学生,可以使用如下的标量子查询:
```sql
SELECT * FROM stuinfo WHERE stuno = (SELECT stuno FROM stumarks WHERE writtenexam = 80);
```
这里,外部的`SELECT`查询(父查询)使用了内部的`SELECT`查询(子查询)的结果来过滤`stuinfo`表中的数据,找到`stuno`与子查询结果相等的学生。
同样的,如果我们想要找到最高分的学生,有两种方法。方法一是通过降序排序并限制返回一条记录:
```sql
SELECT * FROM stuinfo WHERE stuno = (SELECT stuno FROM stumarks ORDER BY writtenexam DESC LIMIT 1);
```
方法二是找出最高的笔试成绩再进行比较:
```sql
SELECT * FROM stuinfo WHERE stuno = (SELECT stuno FROM stumarks WHERE writtenexam = (SELECT MAX(writtenexam) FROM stumarks));
```
2. **列子查询**:
列子查询返回的结果是一列数据,而非单个值。这在处理多个可能的匹配项时非常有用。例如,如果我们想找出所有笔试成绩及格的学生,我们可以使用`IN`操作符结合列子查询:
```sql
SELECT * FROM stuinfo WHERE stuno IN (SELECT stuno FROM stumarks WHERE writtenexam >= 60);
```
这会返回所有在`stumarks`表中有及格成绩(60分及以上)的学生信息。相反,如果我们想找出不及格的学生,同样可以使用`IN`操作符,但这次是子查询返回不及格学生的学号:
```sql
SELECT * FROM stuinfo WHERE stuno IN (SELECT stuno FROM stumarks WHERE writtenexam < 60);
```
如果子查询返回的结果集有多条记录,使用`=`操作符是不合适的,因为它期待一个单一的值。在这种情况下,可以使用`IN`或`NOT IN`来检查值是否在子查询的结果集中。
总结来说,子查询在MySQL中是用于增强查询能力的关键构造,可以处理复杂的查询需求,如筛选满足特定条件的记录、获取最高/最低值、查找关联数据等。熟练掌握子查询能大大提高SQL编程的效率和灵活性,是数据库开发者的必备技能之一。
可以使用AS关键字,例如:
SELECT *
FROM (SELECT column1 FROM table1) AS alias_table
WHERE alias_table.column1 = 'value';