MySQL数据库:多表查询,子查询

344 阅读2分钟

多表查询

多表查询是指基于两个和两个以上的表查询,在实际应用中,查询单个表可能不能满足我们的需求,因此我们需要使用到多表查询。

image.pngemp表

image.pngdept表

当我们同时查询emp表和dept表会查询到什么结果呢?

image.png 如上图,我们不加条件约束会查询到52个结果,正好是我们emp表行数乘以dept表行数,我们将这个称为笛卡尔集。 他是从第一张表中,取出一行和第二张表的每一行进行组合,返回的结果。

这里提出一个问题,大家思考一下,如何显示部门号为10的部门名,员工名和工资。

首先部门名和员工名来自两个不同的表,所以我们需要进行多表查询。

解决这个问题我们就需要进行条件过滤,找到两张表相关联的字段。 我们举例的这两张表相关联的字段是deptno,因此我们可以进行这样的过滤。

SELECT ename,dname,sal,emp.deptno
       FROM emp,dept
       WHERE emp.deptno = 10 AND dept.deptno = emp.deptno
      

这样我们就完成了上述问题。 这里其实还可以按照部门来分组,当然大家可以去自行尝试。

自连接: 在此基础上我们可以思考一下是不是能连接自己呢?当我们将一张表看成两张表来连接时,这个就叫做自连接

自连接的特点:
1.把同一张表当做两张表

2.需要给表取别名 : 表名 表别名

3.列名如果不明确,可以指定列名的别名, 表别名.列名 as 列的别名

自连接可以处理,我们需要一张表中的两个数据,他们之间又符合某种条件, 比如emp表,我们想查询员工名字和他的老板的名字

      SELECT worker.ename AS '员工名' ,boss.ename AS '上级名'
			FROM emp worker,emp boss
			WHERE worker.mgr = boss.empno;

当然实际工作中,自连接能解决的问题不止这些。

子查询

子查询是指嵌入在其他sql语句中的select语句,也叫嵌套查询。

单行子查询:只返回一行数据的子查询语句。

如何显示与SMITH同一部门的所有员工?

           SELECT *
	   FROM emp
           WHERE deptno = (
			   SELECT deptno
			   FROM emp	
                           WHERE ename = 'SMITH'
				);

多行子查询:返回多行数据的子查询

如何查询和部门10的工作相同的雇员的名字,岗位,工资,部门号,但是不含10部门自己的雇员?


           SELECT ename,job,sal,deptno 
                              FROM emp
			      WHERE job IN(
					SELECT DISTINCT job  
					FROM emp 
					WHERE deptno = 10
					) AND deptno <> 10;