zoukankan      html  css  js  c++  java
  • 15 SQL语言——SQL99联合查询

    SQL99(SQL1999)多表连接查询

    普通方式

    我们使用普通方式查询,格式如:

    select 列名 
    from 表1,表2
    [where] 表1.连接列=表2.连接列(通常是主键)
    

      其中,列出两个表中都有的列(连接列)时,要使用表名.列名的方式否则会报错。

    当我们不使用where时,得到的结果是一个笛卡尔积,如:

    select ename,dept.deptno,dname from emp,dept;
    

      

    结果:

     我们看到员工命名不是其它部门的,却重复的列出了该员工在其他部门的记录,这是没有必要的。

    所以我们使用:where 表1.表2的主键 = 表2.表2的主键 的方式消除冗余记录。这个例子中是:where emp.deptno = dept.deptno;效果如下:

    join方式

    交叉连接

    交叉连接语法示例

    select ename,emp.deptno,dname 
    from emp 
    cross join dept;
    

      

    它与普通连接且没有where过滤的效果一致,都是两个表关于连接列的笛卡尔积。

    自然连接

    需要两个表有同名字段(相同的列),根据所有的同名字段进行等值连接(所有同名字段的值相等)。

    自然连接语法示例

    select ename,deptno,dname 
    from emp 
    natural join dept; 

    它的效果与普通连接跟上 'where 表1.表2的主键 = 表2.表2的主键' 的效果一致

    Using连接

    • using(xx)中可以接多个列,它是一种等值连接,可以转换为 join ... on (x=y and xx=y);
    • using(xx)中的列不可以接表名或别名等限定语,默认就是指共同列,不能指定表名;
    • 在使用using的语句中,select * 可以使用,* 被扩展的顺序为using中的列,左表中的其它列,右表中的其它列
    • 如果表有别名t,select t.* from table1 t , table2 using(xx),t.* 不可以使用,using中的列不能加限定词
    • left join, right join, inner join, full outer join 可以和using一起使用,它就是简单的等值连接
    • 以上5项转自:https://www.cnblogs.com/hyang0/p/10597934.html

    用在什么时候呢?答:用在不希望参照两个表的所有同名列进行等值连接时(自然连接就是这么做的)。

    语法:

    select 列名1,...
    from 表名1
    join 表名2
    using(同名列1,同名列2);
    

      

    On子句

    • 自然连接的条件是基于表中所有同列名的等值连接
    • 为了设置任意的连接条件或者指定连接的列,需要使用on子句
    • 连接条件与其它的查询条件分开书写
    • 使用on子句使查询语句更容易理解
    select ename,dname from emp join dept on emp.deptno=dept.deptno where emp.deptno=30;
    select ename,dname from emp join dept on (emp.deptno=dept.deptno and emp.deptno=30);
    

      上面两句结果一致。

    SQL92

    外连接

    外连接省略了outer关键字,写不写都成。

    左外连接:select 内容 from 表名 left outer join 表名 on 筛选条件

    • ---查询员工姓名,工作,薪资,部门名称以及没有部门的员工信息
    • select * from emp e left outer join dept d on d.deptno=e.deptno;

    右外连接:select 内容 from 表名 right outer join 表名 on 筛选条件

    • ---查询员工姓名,工作,薪资,部门名称以及没有员工的部门
    • select * from emp e right outer join dept d on d.deptno=e.deptno;

    全外连接:select 内容 from 表名 fill outer join 表名 on 筛选条件

    • select * from emp e full outer join dept d on d.deptno=e.deptno;

    自连接

    查询员工姓名,工作,薪资,以及上级领导姓名

    • select e1.*,e2.ename from emp e1 inner join emp e2 on e1.mgr=e2.empno
  • 相关阅读:
    系统集成项目管理工程师计算题(成本管理计算)
    系统集成项目管理工程师计算题(进度管理计算)
    系统集成项目管理工程师计算题(期望值)
    系统集成项目管理工程师计算题(三点估算)
    系统集成项目管理工程师计算题(沟通渠道)
    Asp.net core web Api 应用Jwt 验证
    Linux vmstat命令
    关于Java集合的小抄
    @Resource和@Autowire
    Servlet是线程安全的吗?
  • 原文地址:https://www.cnblogs.com/Scorpicat/p/12298562.html
Copyright © 2011-2022 走看看