子查询

作者: 御都 | 来源:发表于2019-08-01 23:55 被阅读0次

1 定义

:select查询语句中嵌套了select语句,嵌套的那个select查询语句就叫子查询
1.1 从employee表中查询出工资最高员工的信息

mysql> select * from employee;
+----+------+------+--------+--------+--------+
| id | name | age  | salary | phone  | in_dpt |
+----+------+------+--------+--------+--------+
|  1 | Tom  |   26 |   2500 | 119119 | dpt4   |
|  2 | Jack |   24 |   2500 | 120120 | dpt2   |
|  3 | Rose |   22 |   2800 | 114114 | dpt3   |
|  4 | Jim  |   35 |   3000 | 100861 | dpt1   |
|  5 | Mary |   21 |   3000 | 100101 | dpt2   |
|  6 | Alex |   26 |   3000 | 123456 | dpt1   |
|  7 | Ken  |   27 |   3500 | 654321 | dpt1   |
|  8 | Rick |   24 |   3500 | 987654 | dpt3   |
|  9 | Joe  |   31 |   3600 | 110129 | dpt2   |
| 10 | Mike |   23 |   3400 | 110110 | dpt4   |
| 11 | Jobs | NULL |   3600 |  19283 | dpt2   |
| 12 | Tony | NULL |   3400 | 102938 | dpt3   |
+----+------+------+--------+--------+--------+
12 rows in set (0.00 sec)

mysql> select MAX(salary) from employee;
+-------------+
| MAX(salary) |
+-------------+
|        3600 |
+-------------+
1 row in set (0.00 sec)

mysql> select * from employee where salary =(select MAX(salary) from employee);
+----+------+------+--------+--------+--------+
| id | name | age  | salary | phone  | in_dpt |
+----+------+------+--------+--------+--------+
|  9 | Joe  |   31 |   3600 | 110129 | dpt2   |
| 11 | Jobs | NULL |   3600 |  19283 | dpt2   |
+----+------+------+--------+--------+--------+
2 rows in set (0.00 sec)

mysql> 

2 子查询的分类

2.1 子查询结果为单行单列,可以作为WHERE的条件使用运算符去判断,运算符包括 > ,<, = ,>=,<=
查询工资小于平均工资的员工信息

mysql> select avg(salary) from employee;
+-------------+
| avg(salary) |
+-------------+
|   3150.0000 |
+-------------+
1 row in set (0.00 sec)

mysql> select * from employee where salary < (select avg(salary) from employee);
+----+------+------+--------+--------+--------+
| id | name | age  | salary | phone  | in_dpt |
+----+------+------+--------+--------+--------+
|  1 | Tom  |   26 |   2500 | 119119 | dpt4   |
|  2 | Jack |   24 |   2500 | 120120 | dpt2   |
|  3 | Rose |   22 |   2800 | 114114 | dpt3   |
|  4 | Jim  |   35 |   3000 | 100861 | dpt1   |
|  5 | Mary |   21 |   3000 | 100101 | dpt2   |
|  6 | Alex |   26 |   3000 | 123456 | dpt1   |
+----+------+------+--------+--------+--------+
6 rows in set (0.00 sec)

mysql> 

2.2 子查询结果是多行单列,以作为WHERE的条件使用运算符IN去判断
查询部门人数为11和15的员工信息

mysql> select * from department;
+----------+------------+
| dpt_name | people_num |
+----------+------------+
| dpt1     |         11 |
| dpt2     |         12 |
| dpt3     |         10 |
| dpt4     |         15 |
+----------+------------+
4 rows in set (0.01 sec)

mysql> select * from employee;
+----+------+------+--------+--------+--------+
| id | name | age  | salary | phone  | in_dpt |
+----+------+------+--------+--------+--------+
|  1 | Tom  |   26 |   2500 | 119119 | dpt4   |
|  2 | Jack |   24 |   2500 | 120120 | dpt2   |
|  3 | Rose |   22 |   2800 | 114114 | dpt3   |
|  4 | Jim  |   35 |   3000 | 100861 | dpt1   |
|  5 | Mary |   21 |   3000 | 100101 | dpt2   |
|  6 | Alex |   26 |   3000 | 123456 | dpt1   |
|  7 | Ken  |   27 |   3500 | 654321 | dpt1   |
|  8 | Rick |   24 |   3500 | 987654 | dpt3   |
|  9 | Joe  |   31 |   3600 | 110129 | dpt2   |
| 10 | Mike |   23 |   3400 | 110110 | dpt4   |
| 11 | Jobs | NULL |   3600 |  19283 | dpt2   |
| 12 | Tony | NULL |   3400 | 102938 | dpt3   |
+----+------+------+--------+--------+--------+
12 rows in set (0.00 sec)

mysql> select dpt_name from department where people_num = 11 or people_num = 15;
+----------+
| dpt_name |
+----------+
| dpt1     |
| dpt4     |
+----------+
2 rows in set (0.00 sec)

mysql> select * from employee where in_dpt in(select dpt_name from department where people_num in(11,15));
+----+------+------+--------+--------+--------+
| id | name | age  | salary | phone  | in_dpt |
+----+------+------+--------+--------+--------+
|  4 | Jim  |   35 |   3000 | 100861 | dpt1   |
|  6 | Alex |   26 |   3000 | 123456 | dpt1   |
|  7 | Ken  |   27 |   3500 | 654321 | dpt1   |
|  1 | Tom  |   26 |   2500 | 119119 | dpt4   |
| 10 | Mike |   23 |   3400 | 110110 | dpt4   |
+----+------+------+--------+--------+--------+
5 rows in set (0.01 sec)

2.3 子查询结果是多行多列,可以作为一张虚拟表,和其他表连接查询。
查询工资大于平均工资的员工和其部门的信息

mysql> select * from employee where salary >(select avg(salary) from employee);
+----+------+------+--------+--------+--------+
| id | name | age  | salary | phone  | in_dpt |
+----+------+------+--------+--------+--------+
|  7 | Ken  |   27 |   3500 | 654321 | dpt1   |
|  8 | Rick |   24 |   3500 | 987654 | dpt3   |
|  9 | Joe  |   31 |   3600 | 110129 | dpt2   |
| 10 | Mike |   23 |   3400 | 110110 | dpt4   |
| 11 | Jobs | NULL |   3600 |  19283 | dpt2   |
| 12 | Tony | NULL |   3400 | 102938 | dpt3   |
+----+------+------+--------+--------+--------+
6 rows in set (0.00 sec)

mysql> select * from department t1,(select * from employee where salary >(select avg(salary) from employee)) t2 where t1.dpt_name
    -> =t2.in_dpt;
+----------+------------+----+------+------+--------+--------+--------+
| dpt_name | people_num | id | name | age  | salary | phone  | in_dpt |
+----------+------------+----+------+------+--------+--------+--------+
| dpt1     |         11 |  7 | Ken  |   27 |   3500 | 654321 | dpt1   |
| dpt3     |         10 |  8 | Rick |   24 |   3500 | 987654 | dpt3   |
| dpt2     |         12 |  9 | Joe  |   31 |   3600 | 110129 | dpt2   |
| dpt4     |         15 | 10 | Mike |   23 |   3400 | 110110 | dpt4   |
| dpt2     |         12 | 11 | Jobs | NULL |   3600 |  19283 | dpt2   |
| dpt3     |         10 | 12 | Tony | NULL |   3400 | 102938 | dpt3   |
+----------+------------+----+------+------+--------+--------+--------+
6 rows in set (0.00 sec)

mysql> 

相关文章

  • Oracel_子查询

    SQL子查询 子查询语法 子查询 (内查询) 在主查询之前一次执行完成。 子查询的结果被主查询(外查询)使用 。 ...

  • Oracle | 子查询和伪列

    1. 子查询 (1)单行子查询 (2)多行子查询 1)ANY子查询 2)ALL 子查询 2. 伪列...

  • 《SQL必知必会》第 11 课 使用子查询

    目标: 11.1 子查询 11.2 利用子查询进行过滤 11.3 作为计算字段使用子查询 11.1 子查询 查询(...

  • MySQL 子查询

    什么是子查询 为什么要使用子查询 子查询的分类 怎样使用子查询 关联子查询 要使用的数据表 1. 什么是子查询? ...

  • 数据库第七天

    子查询 查询里面还有查询注意: 子查询优先于主查询执行 最好子查询用括号 查询比ALLEN工资高的员工信息 单行子...

  • SQL查询_高级查询

    SQL查询_高级查询 一、子查询 子查询出现的位置一般为条件语句,oracle会先执行子查询,再执行父查询,子查询...

  • 17/12/6 子查询

    17/12/6 子查询 单行子查询 括号内的查询叫做子查询,也叫内部查询,先于主查询的执行。 子查询可以嵌入1.w...

  • MySql(七)子查询与虚表

    一、子查询 子查询在主查询前执行一次 主查询使用子查询的结果 子查询要用括号括起来 将子查询放在比较运算符的右边 ...

  • 数据分析之SQL子查询

    文章阅读路线: SQL子查询概念 独立子查询实例 相关子查询实例 SQL子查询常见玩伴 1.SQL子查询概念 子查...

  • MySql基础-子查询

    一、子查询定义 定义: 子查询允许把一个查询嵌套在另一个查询当中。 子查询用()括起来 子查询,又叫内部查询,相对...

网友评论

      本文标题:子查询

      本文链接:https://www.haomeiwen.com/subject/ywmhdctx.html