zoukankan      html  css  js  c++  java
  • SQL连接查询

    1、SQL92语法

    连接查询:也可以叫跨表查询,需要关联多个表进行查询

    • 显示每个员工信息,并显示所属的部门名称
    select ename, dname from emp, dept;

    SQL> select ename, dname from emp, dept;

    ENAME      DNAME

    ---------- --------------

    SMITH      ACCOUNTING

    ALLEN      ACCOUNTING

    WARD       ACCOUNTING

    JONES      ACCOUNTING

    MARTIN     ACCOUNTING

    BLAKE      ACCOUNTING

    CLARK      ACCOUNTING

    SCOTT      ACCOUNTING

    KING       ACCOUNTING

    TURNER     ACCOUNTING

    ADAMS      ACCOUNTING

    JAMES      ACCOUNTING

    FORD       ACCOUNTING

    MILLER     ACCOUNTING

    SMITH      RESEARCH

    ALLEN      RESEARCH

    WARD       RESEARCH

    JONES      RESEARCH

    MARTIN     RESEARCH

    BLAKE      RESEARCH

    CLARK      RESEARCH

    SCOTT      RESEARCH

    KING       RESEARCH

    TURNER     RESEARCH

    ADAMS      RESEARCH

    JAMES      RESEARCH

    FORD       RESEARCH

    MILLER     RESEARCH

    SMITH      SALES

    ALLEN      SALES

    WARD       SALES

    JONES      SALES

    MARTIN     SALES

    BLAKE      SALES

    CLARK      SALES

    SCOTT      SALES

    KING       SALES

    TURNER     SALES

    ADAMS      SALES

    JAMES      SALES

    FORD       SALES

    MILLER     SALES

    SMITH      OPERATIONS

    ALLEN      OPERATIONS

    WARD       OPERATIONS

    JONES      OPERATIONS

    MARTIN     OPERATIONS

    BLAKE      OPERATIONS

    CLARK      OPERATIONS

    SCOTT      OPERATIONS

    KING       OPERATIONS

    TURNER     OPERATIONS

    ADAMS      OPERATIONS

    JAMES      OPERATIONS

    FORD       OPERATIONS

    MILLER     OPERATIONS

    已选择56行。

    以上输出,不正确,输出了56条数据,其实就是两个表记录的乘积,这种情况我们称为:“笛卡儿乘积”,出现错误的原因是:没有指定连接条件

    指定连接条件

    1 select ename, dname from emp, dept where emp.deptno=dept.deptno;
    2 --也可以使用别名(但是不能增加as关键字)
    3 select ename, dname from emp a, dept b where a.deptno=b.deptno;

    以上结果输出正确,因为加入了正确的连接

    以上查询也称为“内连接”,指查询相等的数据

    • 取得员工和所属的经理的姓名
    select a.ename, b.ename from emp a, emp b where a.mgr=b.empno;

     以上称为“自连接”,只有一张表连接,具体的查询方法,把一张表看作两张表即可,如以上示例:第一个表emp a代码了员工表,emp b代表了经理表,相当于员工表和部门表一样

    2、SQL99语法

    • (内连接)显示薪水大于2000的员工信息,并显示所属的部门名称
    1 --采用sql99语法:
    2 select ename, dname from emp a join dept b on a.deptno=b.deptno where sal>2000;
    3 --
    4 select ename, dname from emp a inner join dept b on a.deptno=b.deptno where sal >2000;
    5 --注释:inner关键字一般省略
    6 --采用sql92语法:
    7 select ename, dname from emp a, dept b where a.deptno=b.deptno and sal>2000;

     Sql92语法和sql99语法的区别:99语法可以做到表的连接和查询条件分离,特别是多个表进行连接的时候,会比sql92更清晰

    • (外连接)显示薪水大于2000的员工信息,并显示所属的部门名称,如果某一个部门没有员工,那么该部门也必须显示出来(关联的2个表存在主从关系的话,那么如果主表在join的左边,就使用左连接,如果在join的右边,就使用右连接)
    --右连接
    select a.ename, b.dname from emp a right join dept b on a.deptno=b.deptno;
    --同样可以使用左联接
    select a.ename, b.dname from dept b left join emp a on a.deptno=b.deptno;

     

    左联接和右连接都是外连接,左连接以左面的表为准和右边的表比较,和右面表相等的不相等都会显示出来,右连接恰恰相反,以上左连接和右连接也可以加入outer关键字,但一般不建议这种写法,如:

    --加入outer
    select a.ename, b.dname from dept b left outer join emp a on a.deptno=b.deptno;
    --加入outer
    select a.ename, b.dname from emp a right outer join dept b on a.deptno=b.deptno;

    左连接能完成的功能右连接一定可以完成

    使用SQL92语法完成左连接,右连接的相关查询:

    使用(+) ,放在主表的对面

    • 取得员工和所属的经理的姓名,如果没有上级经理,也要查询出来
    select e.empno, e.ename, e.mgr, m.ename from emp m , emp e where m.empno(+) = e.mgr ;

  • 相关阅读:
    (转)Too many open files
    Python小程序扫描清理Redis中的key
    spring-mvc接口返回json格式数据Long类型字段精度失真
    项目基础配置
    搭建Vue脚手架(vue-cli)并创建一个项目
    项目简介
    [技术学习]HTTP 常见状态码
    git 使用beyond compare 记录
    温故知新之架构图
    学年教学总结
  • 原文地址:https://www.cnblogs.com/duffy/p/4033434.html
Copyright © 2011-2022 走看看