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
原文地址:https://www.cnblogs.com/Scorpicat/p/12298562.html