十年网站开发经验 + 多家企业客户 + 靠谱的建站团队
量身定制 + 运营维护+专业推广+无忧售后,网站问题一站解决
select e.empno, e.ename, d.deptno, d.dname
成都创新互联专注于滨城网站建设服务及定制,我们拥有丰富的企业做网站经验。 热诚为您提供滨城营销型网站建设,滨城网站制作、滨城网页设计、滨城网站官网定制、重庆小程序开发服务,打造滨城网络公司原创品牌,更为您提供滨城网站排名全网营销落地服务。
from emp e, dept d
where e.deptno = d.deptno;
在之前所使用的查询操作之中,都是从一张表之中查询出所需要的内容,那么如果现在一个查询语句需要显示多张表的数据,则就必须应用到多表查询的操作,而多表查询的语法如下:
SELECT [DISTINCT] * | 字段 [别名] [,字段 [别名] ,…] FROM 表名称 [别名], [表名称 [别名] ,…] [WHERE 条件(S)] [ORDER BY 排序字段 [ASC|DESC] [,排序字段 [ASC|DESC] ,…]]。
扩展资料:
Oracle 常用的关联查询:
Oracle外连接:
(1)左外连接 (左边的表不加限制)。
(2)右外连接(右边的表不加限制)。
(3)全外连接(左右两表都不加限制)。
outer join则会返回每个满足第一个(顶端)输入与第二个(底端)输入的联接的行。它还返回任何在第二个输入中没有匹配行的第一个输入中的行。
外连接分为三种: 左外连接,右外连接,全外连接。 对应SQL:LEFT/RIGHT/FULL OUTER JOIN。 通常我们省略outer 这个关键字。 写成:LEFT/RIGHT/FULL JOIN。
在左外连接和右外连接时都会以一张表为基表,该表的内容会全部显示,然后加上两张表匹配的内容。 如果基表的数据在另一张表没有记录。 那么在相关联的结果集行中列显示为空值(NULL)。
---关联查询
/**
等值连接:关联表中存在相同列
非等值连接:表中没有相同的列名,但是一个表中列,在另外表中存在某种关系,比如在范围内
外连接:左外连接(左边显示全部记录)和右外连接(右边显示全部记录)
自连接:自己关联自己查询
*/
select * from emp;
select * from dept;
-- 笛卡尔积
select * from emp,dept;
-- 关联查询
select * from emp,dept where emp.deptno = dept.deptno;
-- 查询雇员的名称和部门的名称
select ename,dname from emp,dept where emp.deptno = dept.deptno;
select * from salgrade;
--查询雇员名称和薪水等级
select e.ename,g.grade from emp e,salgrade g where e.sal between g.losal and g.hisal;
-- 需要将雇员表中的数据全部显示,利用等值连接,只能把关联到的数据显示出来,这就需要外连接
select * from emp e,dept d where e.deptno = d.deptno; --等值连接
select * from emp e,dept d where e.deptno = d.deptno(+); --左外连接(左数据要显示全,右表补空)
select * from emp e,dept d where e.deptno(+) = d.deptno; --右外连接(右数据要显示全,左表补空)
-- 自连接,把一张表自己关联自己
-- 将雇员和他的经理查出来 e表示雇员表,m也表示雇员表 匹配的e.mgr的经理是哪个雇员
select e.ename,m.ename from emp e,emp m where e.mgr = m.empno;
-- 不加任何连接条件 笛卡尔积
select * from emp e,dept d;
--以上是sql 92语法问题
-- 关联查询条件放到where子句中,而where语句还负责对结果集进行条件过滤,
-- 意味着将连接条件和过滤条件写在一起,可读性差,不符合单一职责
sql 99 语法
cross join 等价 92语法笛卡尔积
select * from emp cross join dept;
select * from emp cross join dept;
-- natural join 相当于等值连接,但是不需要等值条件,会做动找相同列左连接
-- 如果两表中没有相同列,相当于笛卡尔积
-- 有相同的列,会自动做等值连接
select * from emp e natural join dept d;
-- 没有相同的列,相当于笛卡尔积
select * from emp e natural join salgrade;
--on 子句,添加连接条件
-- on子句等值连接,相连接当于92语法等值连接
select * from emp e join dept d on e.deptno = d.deptno;
--on 子句非等值连接,相当于92语法非等值连接
select * from emp e join salgrade sg on e.sal between sg.losal and sg.hisal;
-- left outer join ,其中outer可省略 99语法左外连接 会把左表记录显示全,右表无对应记录,显示空
select * from emp e left outer join dept d on e.deptno = d.deptno;
-- 92语法 左外连接
select * from emp e,dept d where e.deptno = d.deptno(+);
-- right outer join ,其中outer可省略 99语法右外连接
select * from emp e right outer join dept d on e.deptno = d.deptno;
-- 92语法 右外连接
select * from emp e,dept d where e.deptno = d.deptno;
-- full outer join 99语法独有相当于同时满足左外连接和右外连接
select * from emp e full outer join dept d on e.deptno = d.deptno;
-- inner join 就是表连接
select * from emp e inner join dept d on e.deptno = d.deptno;
-- 省略inner
select * from emp e join dept d on e.deptno = d.deptno;
--using,除了使用on作为连接条件,也可使用using作为连接条件
--此时查出的deptno不属于任何一张表
select * from emp e join dept d using(deptno);
-- 发现会出现两列deptno,分别属于两张表
select * from emp e join dept d on e.deptno = d.deptno;
99语法和92语法,实际开发中都可使用,建议使用99语法,可读性更强
-- 检索雇员名字、所在单位、薪水等级
select e.ename,d.loc,sg.grade from emp e join dept d on e.deptno = d.deptno join salgrade sg on e.sal between sg.losal and sg.hisal;
SELECT
FROM A LEFT JOIN B ON A.列=B.列
LEFT JOIN C ON B.列=C.列
1、等值连接是最常见的一种连接查询,通常是在主外键关联关系的表间建立,并将连接条件设定为有关系的列,使用“=”连接相关的表。
2、非等值连接是指在多个表中使用非等号连接,查询在多个表中有非等值关联关系的数据,非等值连接操作符包括、=、、=、以及BETWEEN...AND、LIKE、IN等。
3、自连接是一种比较特殊的连接查询,数据来源是一个表。
4、左外连接是内连接的一种扩展,不止会返回满足连接条件的记录,还会返回那些不满足连接条件的操作符左边表的其他记录。
5、右外连接和左外连接相似,右外连接不止会返回满足连接条件的记录,还会返回那些不满足连接条件的操作符右边表的其他记录。
只要是两张以上的表关联查询的时候,就会返回一个笛卡尔乘积,数据库会去掉那些冗余的数据,只返回有用的数据.我们用左连接和右连接查询的时候就会把那些冗余的数据也查询出来,还有双向连接也是.
Oracle数据库的左连接和右连接
在Oracle PL-SQL中,左连接和右连接以如下方式来实现
查看如下语句:
SELECT emp_name,dept_name FORM Employee,Department WHERE Employee.emp_deptid(+) = Department.deptid
此SQL文使用了右连接,即“(+)”所在位置的另一侧为连接的方向,右连接说明等号右侧的所有记录均会被显示,无论其在左侧是否得到匹配,也就是说上例中无论会不会出现某个部门没有一个员工的情况,这个部门的名字都会在查询结果中出现.
反之:SELECT emp_name,dept_name FORM Employee,Department WHERE Employee.emp_deptid = Department.deptid(+)
则是左连接,无论这个员工有没有一个能在Department表中得到匹配的部门号,这个员工的记录都会被显示
一般的相等连接
select * from a,b where a.id = b.id;
这个是内连接