# 子查询

## 1、子查询概念

子查询：sub query

子查询是一种常用计算机语言SELECT-SQL语言中嵌套查询下层的程序模块。当一个查询是另一个查询的条件时，称之为子查询。

子查询：指在一条select语句中，嵌入了另外一条select语句，那么被嵌入的select语句称之为子查询语句。

## 2、主查询概念

主查询：主要的查询对象，第一条select语句，确定的用户所有获取的数据目标（数据源），以及要具体得到的字段信息。

## 3、子查询和主查询的关系

```
1、    子查询是嵌入到主查询中的；
2、    子查询的辅助主查询的：要么作为条件，要么作为数据源
3、    子查询其实可以独立存在：是一条完整的select语句
```

## 4、子查询分类

### 按功能分

```
标量子查询：子查询返回的结果是一个数据（一行一列）
列子查询：返回的结果是一列（一列多行）
行子查询：返回的结果是一行（一行多列）
表子查询：返回的结果是多行多列（多行多列）
Exists子查询：返回的结果1或者0（类似布尔操作）
```

### 按位置分

```
Where子查询：子查询出现的位置在where条件中
From子查询：子查询出现的位置在from数据源中（做数据源）
```

### 1、标量子查询

#### 概念

标量子查询：子查询得到结果是一个数据（一行一列）

#### 语法

基本语法：select \* from 数据源 where 条件判断 =/<> (select 字段名 from 数据源 where 条件判断); //子查询得到的结果只有一个值

```
select * from class where class_name = (select class_id from class2 where class_name = '小明');
```

### 2、列子查询

#### 概念

列子查询：子查询得到的结果是一列数据（一列多行）

#### 语法

基本语法：

主查询 where 条件 in (列子查询);

```
select class_name from class where class_id in (select class_id from class_2);
```

### 3、行子查询

#### 概念

行子查询：子查询返回的结果是一行多列

#### 行元素

行元素：字段元素是指一个字段对应的值，行元素对应的就是多个字段：多个字段合起来作为一个元素参与运算，把这种情况称之为行元素。

#### 语法

基本语法：

主查询 where 条件\[（构造一个行元素）] = (行子查询);

```
select * from class where (class_id,class_name) = (select max(class_number) from class);
```

#### 总结

已经学过三个子查询：常见的三个子查询

标量子查询、列子查询和行子查询：都属于where子查询4、表子查询

### 4、表子查询

#### 概念

表子查询：子查询返回的结果是多行多列，表子查询与行子查询非常相似，只是行子查询需要产生行元素，而表子查询没有。

行子查询是用于where条件判断：where子查询

表子查询是用于from数据源：from子查询

#### 语法

基本语法：

Select 字段表 from (表子查询) as 别名 \[where] \[group by] \[having] \[order by] \[limit];

### 5、Exists子查询

#### 概念

Exists子查询：查询返回的结果只有0或者1，1代表成立，0代表不成立

#### 语法

基本语法：where exists(查询语句); //exists就是根据查询得到的结果进行判断：如果结果存在，那么返回1，否则返回0

Where 1：永远为真

### 6、子查询中特定关键字的使用

#### In

主查询 where 条件 in (列子查询);

#### Any

任意一个

\= any(列子查询)：条件在查询结果中有任意一个

```
1  =any(1,2,3)  ===== true
1  <>any(1,2,3)  ===== true
```

#### some

与any完全一样：在国外，some与any的正面含义一致，但是否定就大不相同：not any与not some

开发者为了让对应的使用者不要在语法上纠结：重新设计了some

#### All

\= all(列子查询)：等于里面所有

<>all(列子查询)：不等于其中所有
