多表之间的数据查询(join)
多个表之间关系:一对多|(多对一) 多对多 一对一 3种
表与表之间数据的完整性:
1. 关系的完整性约束:实体完整性、参照完整性、用于定义的完整性。 必
须满足实体完 整性和参照完整性.
2. 实体完整性:规定了字段|属性的约束
3. 参照完整性:关系与关系之间的引用 某个字段的约束 外键
备注:实体完整性及参照完整性是任何关系数据库必须满足的条件。
4. 用户定义完整性:举例:在学生表中 学生的年龄不能够大于60(用户
自定义的条件)
以员工表与部门表为例:(一对多的关联)
部门表:
-- Create table
create table DEPT
(
DEPTNO NUMBER(2) not null,
DNAME VARCHAR2(14),
LOC VARCHAR2(13)
)
tablespace SYSTEM
pctfree 10
pctused 40
initrans 1
maxtrans 255
storage
(
initial 64
minextents 1
maxextents unlimited
);
-- Create/Recreate primary, unique and foreign key constraints
alter table DEPT
add constraint DEPT_PRIMARY_KEY primary key (DEPTNO)
using index
tablespace SYSTEM
pctfree 10
initrans 2
maxtrans 255
storage
(
initial 64K
minextents 1
maxextents unlimited
);
员工表:
-- Create table
create table EMP
(
EMPNO NUMBER(4) not null,
ENAME VARCHAR2(10),
JOB VARCHAR2(9),
MGR NUMBER(4),
HIREDATE DATE,
SAL NUMBER(7,2),
COMM NUMBER(7,2),
DEPTNO NUMBER(2) not null
)
tablespace SYSTEM
pctfree 10
pctused 40
initrans 1
maxtrans 255
storage
(
initial 64
minextents 1
maxextents unlimited
);
-- Create/Recreate primary, unique and foreign key constraints
alter table EMP
add constraint EMP_PRIMARY_KEY primary key (EMPNO)
using index
tablespace SYSTEM
pctfree 10
initrans 2
maxtrans 255
storage
(
initial 64K
minextents 1
maxextents unlimited
);
alter table EMP
add constraint EMP_FOREIGN_KEY foreign key (DEPTNO)
references DEPT (DEPTNO);
alter table EMP
add constraint EMP_SELF_KEY foreign key (MGR)
references EMP (EMPNO)
disable;
基本连接查询
在emp表与dept表之间存在着多对一的关联关系(现实中还有其他的关联),往往我们希望查询出更多信息,这时候我们就要用到连接查询。
//查询员工及部门的详细信息 但是会产生一个笛卡尔积的效果
SQL> select * from emp,dept;
//怎么避免笛卡尔积呢?加入where查询条件 引用关系的比较
SQL> select * from emp ,dept where emp.deptno = dept.deptno;
//别名查询 为表起别名 采用别名查询
SQL> select * from emp e,dept d where e.deptno=d.deptno;
//注意 以下写法是有问题的:ORA-00918: 未明确定义列
SQL> select e.empno,e.ename,deptno,d.dname from emp e,dept d where e.deptno=d.deptno;
备注说明:deptno在两个表中都存在,所以一定要使用前缀区分。
SQL> select e.empno,e.ename,e.deptno,d.dname from emp e,dept d where e.deptno=d.deptno;
综上所述 创建连接查询时应遵循如下规则:
from子句应当包括所有的表名
where子句应定义连接条件 两个表1一个等值条件 三个表 2个等值条件…依次类推。
备注:连接 n个表,至少需要 n-1个连接条件。 例如:连接三个表,至少需要两个连接条件。
当列名为多个表共有时,列名必须被限制。
使用join连接查询
语法:
From join_table join_type join_table on join_condition
备注: Join_table连接的表名 join_type连接的类型
Join_type连接类型分类如下:
内连接:(inner join)
内连接根据所使用的比较方式不同,把内连接分为了:
等值连接:在连接条件中使用等于号(=)运算符比较被连接列的列值,其查询结果中列出被连接表中的所有列,包括其中的重复列。
SQL> select * from emp e inner join dept d on e.deptno = d.deptno;
不等连接:在连接条件使用除等于运算符以外的其它比较运算符比较被连接的列的列值。这些运算符包括>、>=、<=、<、!>、!<和<>。
SQL> select * from emp e inner join dept d on e.deptno>d.deptno;
自然连接:在连接条件中使用等于(=)运算符比较被连接列的列值,但它使用选择列表指出查询结果集合中所包括的列,并删除连接表中的重复列。
SQL> select * from emp natural join dept;
SQL> select e.*,d.dname,d.loc from emp e inner join dept d on e.deptno = d.deptno;
SQL> select d.*,e.ename,e.empno,e.job,e.mgr,e.hiredate,e.sal,e.comm from emp e inner join dept d on e.deptno=d.deptno;
备注:Distinct是去掉重复的行,而自然连接是去掉重复的列。
外连接
内连接的查询结果都是满足连接条件的记录。但是,有时我们也希望输出那些不满足连接条件的记录的信息。比如,我们想知道这个部门中所有员工的情况,也包括没有员工的部门,这时就需要使用外连接。外连接是只限制一张表中的数据必须满足连接条件,而另一张表中的数据可以不满足连接条件的连接方式。3种外连接:
1) 左外连接(LEFT OUTER JOIN)
如果在连接查询中,连接表左端的表中所有的记录都列出来,并且能在右端的表中找到匹配的记录,那么连接成功。如果在右端的表中,没能找到匹配的记录,那么对应的记录是空值(NULL)。这时,查询语句使用关键字 LEFT OUTER JOIN,也就是说,左外连接的含义是限制连接关键字右端的表中的数据必须满足连接条件,而不关左端的表中的数据是否满足连接条件,均输出左端表中的内容。
例如:要查询所有部门的员工信息查询语句为
SQL> select * from dept d left outer join emp e on e.deptno=d.deptno order by d.deptno; 左外连接查询中左端表中的所有记录的信息都得到了保留。
备注:部门表中记录保留,如果部门中没有员工,部门显示 员工记录用null补充。
2)右外连接(RIGHT OUTER JOIN)
右外连接与左外连接类似,只是右端表中的所有元组都列出,限制左端表的数据必须满足连接条件,而不管右端表中的数据是否满足连接条件,均输出表中的内容。
例如:同上例内容,查询语句为
SQL> select * from emp e right outer join dept d on e.deptno=d.deptno order by d.deptno;
右外连接查询中右端表中的所有元组的信息都得到了保留。
3)全外连接(FULL OUTER JOIN)
全外连接查询的特点是左、右两端表中的记录都输出,如果没能找到匹配的记录,就使用NULL来代替。
例如:同左外连接例子内容,查询语句为
SQL> select * from emp e full outer join dept d on e.deptno=d.deptno order by d.deptno;
全外连接查询中所有表中的元组信息都得到了保留。
备注:一定分清:左与右 在join后边的是右
交叉联接(cross join)
交叉连接即笛卡儿乘积,是指两个关系中所有记录的任意组合。一般情况下,交叉查询是没有实际意义的。
SQL> select * from emp e cross join dept d;
备注:可以添加where子句筛选出有意义的数据。建议不使用。
自连接查询(natural join)
如果在一个连接查询中,涉及到的两个表都是同一个表,这种查询称为自连接查询。同一张表在FROM字句中多次出现,为了区别该表的每一次出现,需要为表定义一个别名。自连接是一种特殊的内连接,它是指相互连接的表在物理上为同一张表,但可以在逻辑上分为两张表。
例如:要求检索出员工编号为7369的上司的详细信息,查询语句为
SQL> select e1.* from emp e inner join emp e1 on e.mgr=e1.empno where e.empno=7369;
注意:对于连接查询中使用到的 inner outer是可以省略的。但为规范最好不要省略。
提高部分:
SQL> select * from emp e inner join dept d on e.deptno(+)=d.deptno;的理解?
使用外连接可以查询不满足连接条件的数据。
外连接的符号是 (+)。
2、
在NATURAL JOIN 子句创建等值连接时,可以使用 USING 子句指定等值连接中需要用到的列。
使用 USING 可以在有多个列满足条件时进行选择。
不要给选中的列中加上表名前缀或别名。
NATURAL JOIN 和 USING 子句经常同时使用。
SQL> select * from emp e join dept d using(deptno);
分享到:
相关推荐
在 SQL Server 中,有时我们需要更新多个表中的数据,尤其是在这些表之间存在某种关联的情况下。本文将详细介绍如何使用 `UPDATE` 语句结合 `JOIN` 来实现对多个表的更新操作。 #### 1. 基本概念与语法 在 SQL ...
项目通过 Hibernate Criteria API 展示了如何进行多表连接查询,并结合分页功能,有效地获取和展示相关数据。项目源码会详细展示如何创建 Criteria 查询,如何设置 JOIN 条件,以及如何实现分页。 **具体步骤** 1....
在数据库操作中,连接(Join)是一种非常重要的操作,用于组合两个或多个表中的数据。根据连接的方式不同,可以分为几种类型:`INNER JOIN`、`LEFT JOIN`、`RIGHT JOIN`以及`FULL OUTER JOIN`。下面将详细解释这些...
它允许我们从多个表中提取数据,基于这些表之间的关联字段,来获取更全面、更有深度的信息。例如,一个公司可能有员工表、部门表和项目表,通过关联查询,我们可以找出某个部门的所有员工参与的项目,或者查看特定...
这是因为TEZ引擎在转换多个MapJoin为单个操作时,可能会限制输入数据的最大大小,从而导致数据的丢失。 #### 四、解决方案 针对上述问题,可以通过以下几种方式进行解决: 1. **调整bucketing_version**: - 通过...
在SQL(Structured Query Language)中,多表查询是数据库操作中的一个重要概念,它允许我们从不止一个表中获取数据,从而实现更复杂的数据分析和整合。这个“SQL数据库多表查询练习题”旨在帮助你深化对这一核心...
标题与描述中的“from多张表等于left join其他表”主要涉及的是SQL查询语句中两种...通过本次分析,我们可以看到,在复杂的查询中,合理运用这些连接方式,能够帮助我们更灵活地处理多表之间的关系,提取出所需的数据。
MySQL数据库中Join操作的使用及优化是一项重要的技能,它涉及到数据库中表与表之间的关联查询。在执行Join操作时,数据库管理系统需要按照某种算法将多个表中的数据记录联合起来,并返回查询结果。Join操作的主要...
MapReduce提供了一种分布式计算模型,能够高效地处理大规模数据集,但面对多表关联,尤其是多个Job之间的依赖和参数传递,开发者需要掌握特定的策略和技术。以下将详细阐述这些知识点。 首先,理解MapReduce的基本...
多表查询可以使用 INNER JOIN、LEFT JOIN、RIGHT JOIN、FULL JOIN 等方式来实现。多表查询可以用于解决复杂的业务问题,例如统计、报表、数据分析等。 5. 关系表的定义和约束:关系表是数据库的基本结构单元。关系...
在SQL中,JOIN操作是用来合并来自两个或更多表的数据,基于这些表之间的相关列的匹配。这个过程在处理复杂的数据关系时非常有用,特别是在数据库设计中涉及到多表关联的情况。以下是一个详细的解释和示例,关于如何...
【数据库应用技术】中的SQL JOIN多表查询是数据库操作中常用的一种高级查询技巧,它能够有效地结合多个数据表,获取更复杂的数据信息。在数据库设计中,常常需要将多个相关表的数据整合在一起进行分析,而JOIN操作...
- **JOIN**: JOIN用于连接两个或更多表,基于这些表之间的关联。例如,`SELECT * FROM table1 JOIN table2 ON table1.id = table2.id;` 这会返回所有table1和table2中id匹配的行。 - **INNER JOIN**: INNER JOIN...
在SQL中,联合查询是将两个或多个表的数据组合在一起的机制,通常基于这些表之间的公共字段。例如,如果你有一个“员工”表和一个“部门”表,你可以通过它们的公共字段(如部门ID)来联接这两个表,从而获取每个...
多表查询通常涉及到表间的连接(JOIN),包括内连接(INNER JOIN)、左连接(LEFT JOIN)、右连接(RIGHT JOIN)和全连接(FULL JOIN)。连接操作使得不同表中的相关数据能够相互匹配,形成一个综合的结果集。 二、...
多表关联查询是指从两个或多个表中检索数据的查询方式,包括子查询、连接关联查询、JOIN…ON连接查询语句等。 子查询是指在SELECT语句中嵌套另一个关系表的SELECT查询结果集。子查询的基本格式为:SELECT <目标列>...
在SQL(结构化查询语言)中,JOIN操作是用于合并两个或多个表的数据,以便根据它们之间的关联性创建新的结果集。JOIN关键字是SQL查询中的关键部分,它允许我们在不同的表之间建立联系,以获取更丰富的信息。在这个...
在SQL查询中,JOIN操作是连接两个或多个表的关键部分,用于从这些表中提取相关数据。本篇文章将深入探讨LEFT JOIN、RIGHT JOIN以及INNER JOIN的用法,并通过实例进行对比,帮助理解它们之间的差异。 1. LEFT JOIN...
在实际项目开发中,我们经常需要处理复杂的数据库查询,特别是涉及到多个表之间的关联查询。Hibernate作为一款流行的Java持久层框架,提供了一种非常便捷的方式来处理这些问题。本文将详细介绍如何利用Hibernate进行...