oracle的多表查询与表的连接

一、多表查询

在任何多表查询中一定会产生笛卡尔积的问题,但是,笛卡尔积产生的结果对于用户来说是毫无意义的,是重复的无用数据。因此我们需要消除笛卡尔积,那么在多表查询的时候,就必须要有关联字段。

范例:emp.deptno=dept.deptno;两张表中的关联字段将消除笛卡尔积

SELECT * FROM emp, dept WHERE emp.deptno=dept.deptno;

多表的查询,建议多做些习题增加熟练度。

二、表的连接

内连接:之前利用了WHERE子句消除了笛卡尔积,这个是内连接。只有满足条件的数据才会显示。

外连接:分为左外连接、右外连接、全外连接。

为了更好的观察到连接的区别,现在已经在dept表中提供了一个没有雇员的部门40,同时在emp表中增加一个没有部门的雇员。

INSERT INTO emp (empno,ename,deptno) VALUES(8989,‘HELLO‘, null);

emp表目前如下:HELLO这个雇员没有部门

观察一:内连接实现效果

SELECT e.empno, e.ename, d.deptno, d.dname

FROM emp e, dept d

WHERE e.deptno = d.deptno;

此时没有部门的雇员以及没有雇员的部门信息都没有出现,因为null的判断不满足。

观察二:使用左(外)连接,希望所有的雇员信息都显示出来,即便他没有部门。

SELECT e.empno, e.ename, d.deptno, d.dname

FROM emp e, dept d

WHERE e.deptno = d.deptno(+);

此时出现了没有部门的雇员。也就是左表的数据全部显示了。

观察三:使用右(外)连接,将所有的部分信息都显示出来。

SELECT e.empno, e.ename, d.deptno, d.dname

FROM emp e, dept d

WHERE e.deptno(+) = d.deptno;

内连接指的就是所有满足关联条件的数据出现,不满足的不出现。外连接就是指定一张数据表中的数据全部都显示,但是没有对应的其他表数据,内容为null。

原文地址:https://www.cnblogs.com/Etude/p/9275286.html

时间: 2024-10-21 06:43:20

oracle的多表查询与表的连接的相关文章

单表查询,多表查询

单表查询 前期表准备 create table emp( id int not null unique auto_increment, name varchar(20) not null, sex enum('male','female') not null default 'male', #大部分是男的 age int(3) unsigned not null default 28, hire_date date not null, post varchar(50), post_comment

python开发mysql:单表查询&多表查询

一 单表查询,以下是表内容 1 一 having 过滤 2 1.1 having和where 3 select * from emp where id > 15; 4 解析过程;from > where 找到数据 > 分组(没有默认一个组)> select 打印 where是出结果之前 5 select * from emp having id > 15; 6 解析过程;from > where 找到数据(没有约束条件,就是整个表)) > 分组(没有默认一个组)&

mysql单表查询&&多表查询(职员表14+9)

dept(deptno,dname,loc) emp(empno,ename,job,mgr,hiredate,sal,COMM,deptno) salgrade(grade,losal,hisal) stu(sid,sname,age,gander,province,tuition) 单表查询题目 ==================================================== dept(deptno,dname,loc) emp(empno,ename,job,mgr

07_MySQL DQL_多表查询_等值内连接

#6:连接查询/*含义:多表查询,当查询的字段来自多个表 笛卡尔积: 表1,m行:表2,n行: 表1,表2 = m*n行发生原因:表1的每行和表2的n行拼接,形成n行,最终得到m*n行如何避免:增加连接条件 连接查询的分类: 按年代分类: sql92标准[mysql只支持该标准的内连接,一部分外连接] sql99标准[推荐]mysql支持内连接 外连接(左右连接) 交叉连接 按功能分类: 内连接 等值连接 非等值连接 自连接 外连接 左连接 右连接 全连接 交叉连接*/USE girls; #

inner join on 三表查询四表查询5表查询不管多少表都可以

一.创建三个表 1.hanshu 2.YingHu 3.text 二.关系图连接设主键 三.inner  join   on  使用语法 INNER JOIN 连接两个数据表的用法:SELECT * FROM 表1 INNER JOIN 表2 ON 表1.字段号=表2.字段号 INNER JOIN 连接三个数据表的用法:SELECT * FROM (表1 INNER JOIN 表2 ON 表1.字段号=表2.字段号) INNER JOIN 表3 ON 表1.字段号=表3.字段号 INNER JO

Oracle 中 根据值 查询 所在 表和字段

-------------------- -- 这里是查询 数字型字段值 /*declare CURSOR cur_query IS select table_name, column_name, data_type from user_tab_columns; a number; sql_hard varchar2(2000); vv number; begin for rec1 in cur_query loop a:=0; if rec1.data_type ='NUMBER' THEN

MongoDB 新建数据库和表 查询数据表

MongoDB语法是原生ORM,根本不存在sql语句 创建数据库:这里和一般的关系型数据库一样,都要先建立一个自己的数据库空间 新建数据库db1 > use db1 switched to db db1 显示当前使用数据库 > db db1 对数据库创建表(collection) db.<tablename> 创建一张user表 > db.user db1.user 在user表插入一条数据(collection) insert() 插入一条或者多条数据,需要带有允许插入多条

Oracle基础(五):多表查询

一.多表查询 (一)简单多表查询 1.多表查询的机制 1)SQL: SELECT * FROM emp; --14条记录 SELECT * FROM dept;--4条记录 SELECT * FROM emp,dept;--显示56条数据??为什么 2)分析: 先从 dept 选择一条记录(deptno=10).分别于 emp中的14条记录分别匹配.显示14条记录. 再从 dept 选择一条记录(deptno=20),分别于 emp中的14条记录分别匹配.显示14条记录. 依次类推. water

oracle 表查询(二)

1.使用逻辑操作符号问题:查询工资高于500或者是岗位为manager的雇员,同时还要满足他们的姓名首字母为大写的J?select * from emp where (sal > 500 or job = 'MANAGER') and ename like 'J%'; 2.使用order by字句 默认asc问题:如何按照工资从低到高的顺序显示雇员的信息?select * from emp order by sal;问题:按照部门号升序而雇员的工资降序排列select * from emp or