MySQL 子查询与多表联合查询

子查询:就是一个查询的结果作为另一个查询的数据源或者条件。

如何查询出工资最大的人的姓名?

mysql> select max(sal) from emp;   --查询出工资最大值
+----------+
| max(sal) |
+----------+
|  5000.00 |
+----------+
1 row in set (0.00 sec)

mysql> select ename,sal from emp where sal = (select max(sal) from emp);--可以将工资的最大值最为一个筛选条件,select ename,sal from emp执行完之后赋值给sal sal = (select max(sal) from emp);
+-------+---------+
| ename | sal     |
+-------+---------+
| KING  | 5000.00 |
+-------+---------+
1 row in set (0.32 sec)

mysql> select ename,sal from emp where sal = (select min(sal) from emp);--查询最小工资
+-------+--------+
| ename | sal    |
+-------+--------+
| SMITH | 800.00 |
+-------+--------+
1 row in set (0.00 sec)

子查询情况;将查询结果作为另一个查询的条件

查询出公司都有那些人是经理人;看那些对应的的empno出现在mgr字段中,谁就是经理人

mysql>  select mgr from emp;   查询
+------+
| mgr  |
+------+
| 7902 |
| 7698 |
| 7698 |
| 7839 |
| 7698 |
| 7839 |
| 7839 |
| 7566 |
| NULL |
| 7698 |
| 7788 |
| 7698 |
| 7566 |
| 7782 |
| NULL |
+------+
15 rows in set (0.00 sec)

mysql> select distinct mgr from emp;   --去重
+------+
| mgr  |
+------+
| 7902 |
| 7698 |
| 7839 |
| 7566 |
| NULL |
| 7788 |
| 7782 |
+------+
7 rows in set (0.00 sec)

mysql>  select distinct mgr from emp where mgr is not null;    --去掉null空值,通过这条语句得到的信息就是都有哪些empno出现在mgr字段中
+------+
| mgr  |
+------+
| 7902 |
| 7698 |
| 7839 |
| 7566 |
| 7788 |
| 7782 |
+------+
6 rows in set (0.01 sec)
mysql> select ename,empmo from emp where empmo in(select distinct mgr from emp);--查询公司都有哪些人是经理人in关键字
+-------+-------+
| ename | empmo |
+-------+-------+
| JONES |  7566 |
| BLAKE |  7698 |
| CLARK |  7782 |
| SCOTT |  7788 |
| KING  |  7839 |
| FORD  |  7902 |
+-------+-------+
6 rows in set (0.00 sec)
mysql> select ename,empmo from emp where empmo in(select distinct mgr from emp where mgr is not null);
+-------+-------+
| ename | empmo |
+-------+-------+
| JONES |  7566 |
| BLAKE |  7698 |
| CLARK |  7782 |
| SCOTT |  7788 |
| KING  |  7839 |
| FORD  |  7902 |
+-------+-------+
6 rows in set (0.00 sec)

注意:以上这两种情况都是将整个查询的一个结果作为另一个查询的条件,作为条件的时候这里用到了等值比较、in,其他的<\>\<=\>=都是可以的。查出平均工资最大的部门是那个?

1、每个部门的平均工资需要先查出来,组函数不可以嵌套

查询结果作为另一个查询的数据源,可以当成一张表。

注意:当成表的过程中必须起别名

mysql> select avg(sal),deptno from emp group by deptno;--查询平均工资和对应的部门编号
+-------------+--------+
| avg(sal)    | deptno |
+-------------+--------+
| 2356.540000 |   NULL |
| 2916.666667 |     10 |
| 2175.000000 |     20 |
| 1566.666667 |     30 |
+-------------+--------+
4 rows in set (0.00 sec)    

MySQL多表联合查询

查询员工的姓名和员工所在部门的名称

mysql>  select ename,DNAME from emp,dept;
+------------+------------+
| ename      | DNAME      |
+------------+------------+
| SMITH      | ACCOUNTING |
| SMITH      | RESEARCH   |
| SMITH      | SALES      |
| SMITH      | OPERATIONS |
| ALLEN      | ACCOUNTING |
| ALLEN      | RESEARCH   |
| ALLEN      | SALES      |
| ALLEN      | OPERATIONS |
| WARD       | ACCOUNTING |
| WARD       | RESEARCH   |
| WARD       | SALES      |
| WARD       | OPERATIONS |
| JONES      | ACCOUNTING |
| JONES      | RESEARCH   |
| JONES      | SALES      |
| JONES      | OPERATIONS |
| MARTIN     | ACCOUNTING |
| MARTIN     | RESEARCH   |
| MARTIN     | SALES      |
| MARTIN     | OPERATIONS |
| BLAKE      | ACCOUNTING |
| BLAKE      | RESEARCH   |
| BLAKE      | SALES      |
| BLAKE      | OPERATIONS |
| CLARK      | ACCOUNTING |
| CLARK      | RESEARCH   |
| CLARK      | SALES      |
| CLARK      | OPERATIONS |
| SCOTT      | ACCOUNTING |
| SCOTT      | RESEARCH   |
| SCOTT      | SALES      |
| SCOTT      | OPERATIONS |
| KING       | ACCOUNTING |
| KING       | RESEARCH   |
| KING       | SALES      |
| KING       | OPERATIONS |
| TURNER     | ACCOUNTING |
| TURNER     | RESEARCH   |
| TURNER     | SALES      |
| TURNER     | OPERATIONS |
| ADAMS      | ACCOUNTING |
| ADAMS      | RESEARCH   |
| ADAMS      | SALES      |
| ADAMS      | OPERATIONS |
| JAMES      | ACCOUNTING |
| JAMES      | RESEARCH   |
| JAMES      | SALES      |
| JAMES      | OPERATIONS |
| FORD       | ACCOUNTING |
| FORD       | RESEARCH   |
| FORD       | SALES      |
| FORD       | OPERATIONS |
| MILLER     | ACCOUNTING |
| MILLER     | RESEARCH   |
| MILLER     | SALES      |
| MILLER     | OPERATIONS |
|   zhang    | ACCOUNTING |
|   zhang    | RESEARCH   |
|   zhang    | SALES      |
|   zhang    | OPERATIONS |
+------------+------------+
60 rows in set (0.29 sec)

笛卡尔积

(14*4)emp的每一条数据与dept表的每一条数据组合。也就是56条数据。

多表联合查询

两个表中的deptno是相等的

mysql>  select ename,DNAME from emp,dept where emp.deptno = dept.deptno;
+--------+------------+
| ename  | DNAME      |
+--------+------------+
| SMITH  | RESEARCH   |
| ALLEN  | SALES      |
| WARD   | SALES      |
| JONES  | RESEARCH   |
| MARTIN | SALES      |
| BLAKE  | SALES      |
| CLARK  | ACCOUNTING |
| SCOTT  | RESEARCH   |
| KING   | ACCOUNTING |
| TURNER | SALES      |
| ADAMS  | RESEARCH   |
| JAMES  | SALES      |
| FORD   | RESEARCH   |
| MILLER | ACCOUNTING |
+--------+------------+
14 rows in set (0.01 sec)

  

关键字join= 联和 on = 条件;查询ename和dname在emp表和dept表查询,查询对应的数据on emp.deptno = dept.deptno

mysql> select ename,dname from emp join dept on emp.deptno = dept.deptno;
+--------+------------+
| ename  | dname      |
+--------+------------+
| SMITH  | RESEARCH   |
| ALLEN  | SALES      |
| WARD   | SALES      |
| JONES  | RESEARCH   |
| MARTIN | SALES      |
| BLAKE  | SALES      |
| CLARK  | ACCOUNTING |
| SCOTT  | RESEARCH   |
| KING   | ACCOUNTING |
| TURNER | SALES      |
| ADAMS  | RESEARCH   |
| JAMES  | SALES      |
| FORD   | RESEARCH   |
| MILLER | ACCOUNTING |
+--------+------------+
14 rows in set (0.00 sec)

查询某个人的姓名、所在的部门、工资的等级

mysql> select ename,DNAME,GRADE from emp join dept join salgrade on emp.deptno = dept.deptno and emp.sal between losal and hisal;
+--------+------------+-------+
| ename  | DNAME      | GRADE |
+--------+------------+-------+
| SMITH  | RESEARCH   |     1 |
| ADAMS  | RESEARCH   |     1 |
| JAMES  | SALES      |     1 |
| WARD   | SALES      |     2 |
| MARTIN | SALES      |     2 |
| MILLER | ACCOUNTING |     2 |
| ALLEN  | SALES      |     3 |
| TURNER | SALES      |     3 |
| JONES  | RESEARCH   |     4 |
| BLAKE  | SALES      |     4 |
| CLARK  | ACCOUNTING |     4 |
| SCOTT  | RESEARCH   |     4 |
| FORD   | RESEARCH   |     4 |
| KING   | ACCOUNTING |     5 |
+--------+------------+-------+
14 rows in set (0.01 sec)

  

原文地址:https://www.cnblogs.com/rdchenxi/p/12683749.html

时间: 2024-08-26 20:16:38

MySQL 子查询与多表联合查询的相关文章

oracle数据库的高级查询方法 多表联合查询

oracle查询 一,简单查询 order by 1,2 select t.sno, t.sname, t.ssex from STUDENT t order by 1,2,3 group by 增强版 SELECT p.toma, p.ptype, SUM(p.lastcou) FROM product p GROUP BY rollup(p.toma, p.ptype) 二,高级查询(多表连接查询) 笛卡尔积的概念: 所谓笛卡尔积,通俗点说就是指包含两个集合中任意取出两个元素构成的组合的集合

MySQL增删改查之【多表联合查询】

很多时候在实际的业务中我们不只是查询一张表. 在电子商务系统中,查询哪些用户没有购买过产品. 银行中可能查询违规记录,同时查询出用户的 查询中奖信息和中奖人员的基本信息. 以上只是列的情况我们就需要把两张表在一起进行查询. 而上述业务中需要多表联合在一起查询才能有结果,而多表联合查询的本质是:表连接. 表连接 当需要查询多个表中的字段时,就可以使用表连接来实现.表联接分为内连接和外连接. 内联结:将两个表中存在联结关系的字段符合联结关系的那些记录形成记录集的联结. 外连接:会选出其他不匹配的记录

MySQL DML操作--------多表联合查询实战

1. 背景 * 多表联合查询是把不同表的记录到一起的一种方式 * 在SQL标准中规划的联合(join)大致分内连接,外连接,全连接.其中外连接又分左外连接,右外连接. 2. 内连接例子 (inner join) [ 员工 --> 部门 ] * 查看员工表[ employees ]和部门表[ departments ]结构 mysql> desc employees; +-----------+---------------+------+-----+---------+------------

【Oracle】曾经的Oracle学习笔记(4-7)多表联合查询,子查询,动态条件查询

一.多表联合查询 二.子查询 三.动态条件查询 LESSON 4 Displaying Data from Multiple Tables-------------------------------------------------------- 查询s_emp表中最大的工资数,并且显示出这个最大工资数的员工名字 select last_name,max(salary)from s_emp; 多表查询 查询多张表的时候会产生笛卡尔积 为了防止笛卡尔积的产生,我们需要使用某些条件把两张表或多张

Oracle数据库-多表联合查询&amp;子查询

多表联合查询 当需要获取的数据分布在多张中,考虑使用联合查询1.SQL92方式2.SQL99方式 SQL92方式 1.笛卡尔积:将多个表的数据进行一一对应,所得到结果为多表的笛卡尔积. 结果的数量为所有表的数量的乘积. select * from emp,dept 2.等值连接筛选 概念:先做表的笛卡尔积,然后筛选,筛选条件为等值筛选. 注意:条件为字段的值相同来进行筛选,字段的名字可以不同 查询员工姓名,工作,薪资,部门名称 select * from emp,dept where emp.d

约束条件 ,表与表之间的关系 和多表联合查询***

一.约束条件    为了确保数据的完整性 可以给列加上约束条件    完整性的分类:        1.实体完整性        2.域完整性        3.引用完整性    1.实体完整性        实体:即表中的一行(一条)记录 代表一个实体 entity        实体完整性的作用:标识每一行数据不重复        约束类型:            1.1 主键约束(primary key)            1.2 唯一约束(unique)            1.3

一个多表联合查询引发的思考

朋友做一个项目,遇到一个多表联合查询的需求. A表SYSTEM_ID和B表SYSTEM_ID关联: C表中ROLE_LIST字段,存储多个B表中的ROLE_ID值: 需要一个sql,当A表中SYSTEM_ID值为123时,找到B表和C表的关联,当B表满足SYSTEM_ID值为123时,包含其中的ROLE_ID数据,显示C表中NAME数据.例如查询结果为:james.lucy. T_TABLE_A表 ID SYSTEM_ID 1 123 2 234 T_TABLE_B表 ID SYSTEM_ID

优先使用单表查询,而非联合查询

优先使用单表查询,而非联合查询 发表于2016/7/4 17:49:09  1866人阅读 分类: 研发架构  一.小雷的见解 1.编码规范 CRUD,命名规范,可以通用.  比如类名.方法名.变量名,都很接近. 2.开发效率 复制粘贴很方便. 自动化生成很爽. 标准API容易定义.  针对单表的链式操作框架,也很多. 3.代码简单易懂 一个表,再复杂的sql,很快也能看懂. 一般的sql,刚刚毕业的大学生,也看得懂,写得出来.     <select id="get" resu

SharePoint 列表多表联合查询

在SharePoint平台二次开发中,我们有时需要涉及多表关联查询展示多列表中的不同字段信息:SharePoint和Sql数据表一样,也支持多表联合查询,但是不像Sql语句那样简单,有一定的局限性,需要使用SPQuery的Joins属性来完成. 联合查询的前提条件: 1.子列表必须采用查阅项进行关联主表: 下面,我们通过一个简单的例子,为大家演示一下如何使用SPQuery通过查阅项字段来进行两个列表的联合查询. 1.创建主列表,City是城市:子列Address,是地址,子列表新增加查阅项Cit