MySQL-sql多表联合查询(sql92)

概述

多表联合查询又称之为 关联查询

SQL92 和 SQL99 是数据库的一个ANSI/ISO标准。它定义了一种语言(SQL)以及数据库的行为(事务、隔离级别等)。

多表联合查询在 SQL92 和 SQL99 有些不同,本文讲的是 SQL92

提出问题

查询员工所在部门名称、员工姓名、职务

部门名称在dept表,员工信息在emp表,为了完成上面的查询,就需要用到 多表联合查询,sql如下:

select dname,ename,job from emp,dept where emp.deptno=dept.deptno

结果

DNAME          ENAME      JOB
-------------- ---------- ---------
ACCOUNTING     CLARK      MANAGER
ACCOUNTING     KING       PRESIDENT
ACCOUNTING     MILLER     CLERK
RESEARCH       JONES      MANAGER
RESEARCH       FORD       ANALYST
RESEARCH       ADAMS      CLERK
RESEARCH       SMITH      CLERK
RESEARCH       SCOTT      ANALYST
SALES          WARD       SALESMAN
SALES          TURNER     SALESMAN
SALES          ALLEN      SALESMAN
SALES          JAMES      CLERK
SALES          BLAKE      MANAGER
SALES          MARTIN     SALESMAN

14 rows selected

笛卡尔积

笛卡尔积就是 笛卡尔乘积,是我们数学学的知识,两个集合的乘积

见下面的sql语句,from后面跟两个表名

select * from emp,dept

结果如下图:

从结果中可知,emp表的每一条记录,与dept表的每一条记录都一 一对应

所以查询结果的行数=emp表行数*dept表行数

注意:

  • 如果两个表的数据量很大,慎用笛卡尔积,否则会给数据库带来巨大压力

  • 在笛卡尔积中,很多数据没有意义,比如:名字是SMITH的员工,其部门编号是20,但该记录与dept表的每一条记录都有对应,其实只有dept表中部门编号是20的,才有意义,其他的对应记录都没有意义

等值连接

查询员工所在部门名称、员工姓名、职务,并且是 emp表中deptno 与 dept表中deptno 相等的记录

select dname,ename,job from emp,dept where emp.deptno=dept.deptno

注意:

  • OPERATIONS部门没有查询出来,因为该部门的deptno是40,而emp表中没有员工的deptno是40的,所以查询不到

  • 由于两个表中都有deptno,为了区分,所以在where后面加上了 表名 emp.deptno,dept.deptno

  • 如果select 后面的 列名,在两个表中都有,也要加上 表名 ,以示 区分,最好全都加上表名,如下:

    select emp.deptno,dept.dname,emp.ename,emp.job from emp,dept where emp.deptno=dept.deptno
    
  • 如果表名长度较长,可以给表名起 别名,然后用别名.列名,如下:

    select d.dname,e.ename,e.job from emp e,dept d where e.deptno=d.deptno
    

不等值连接

查询员工姓名、职务、工资、工资级别

工资级别在salgrade表中,

select e.ename,e.job,e.sal,s.grade from emp e,salgrade s where s.losal<=e.sal and e.sal<=s.hisal

自连接

查询员工姓名、职务、工资、上级领导姓名

在emp表中MGR是领导的编号,通过该编号查找emp表中的姓名,这种就是自己关联自己,sql如下:

select a.ename,a.job,a.sal,b.ename from emp a,emp b where a.mgr=b.empno

注意: 名字是KING的是董事长,没有领导,但查询结果里没有这条记录

练习

  1. 工资大于3000的,员工,所在的部门,工资

  2. 查询部门,并显示各部门的员工名称、薪资、奖金,以及和,按照部门名称排序

    select a.dname,b.ename,nvl(b.sal,0)+nvl(b.comm,0)   from dept a left join emp b on a.deptno=b.deptno  order by dname
    

原文出处:/show_1EF4uy2hGroF.html