表连接查询分类

通过连接运算符可以实现多个表查询。连接是关系数据库模型的主要特点,也是它区别于其它类型数据库管理系统的一个标志。

在关系数据库管理系统中,表建立时各数据之间的关系不必确定,常把一个实体的所有信息存放在一个表中。当检索数据时,通过连接操作查询出存放在多个表中的不同实体的信息。连接操作给用户带来很大的灵活性,他们可以在任何时候增加新的数据类型。为不同实体创建新的表,尔后通过连接进行查询。

连接可以在SELECT 语句的FROM子句或WHERE子句中建立,似是而非在FROM子句中指出连接时有助于将连接操作与WHERE子句中的搜索条件区分开来。所以,在Transact-SQL中推荐使用这种方法。

SQL-92标准所定义的FROM子句的连接语法格式为:

FROM join_table join_type join_table

[ON (join_condition)]

其中join_table指出参与连接操作的表名,连接可以对同一个表操作,也可以对多表操作,对同一个表操作的连接又称做自连接。

join_type 指出连接类型,可分为三种:内连接、外连接和交叉连接。内连接(INNER JOIN)使用比较运算符进行表间某(些)列数据的比较操作,并列出这些表中与连接条件相匹配的数据行。根据所使用的比较方式不同,内连接又分为等值连接、自然连接和不等连接三种。

外连接分为左外连接(LEFT OUTER JOIN或LEFT JOIN)、右外连接(RIGHT OUTER JOIN或RIGHT JOIN)和全外连接(FULL OUTER JOIN或FULL JOIN)三种。与内连接不同的是,外连接不只列出与连接条件相匹配的行,而是列出左表(左外连接时)、右表(右外连接时)或两个表(全外连接时)中所有符合搜索条件的数据行。

交叉连接(CROSS JOIN)没有WHERE 子句,它返回连接表中所有数据行的笛卡尔积,其结果集合中的数据行数等于第一个表中符合查询条件的数据行数乘以第二个表中符合查询条件的数据行数。

连接操作中的ON (join_condition) 子句指出连接条件,它由被连接表中的列和比较运算符、逻辑运算符等构成。
无论哪种连接都不能对text、ntext和image数据类型列进行直接连接,但可以对这三种列进行间接连接。

(一)内连接

内连接查询操作列出与连接条件匹配的数据行,它使用比较运算符比较被连接列的列值。内连接分三种:

1、等值连接:在连接条件中使用等于号(=)运算符比较被连接列的列值,其查询结果中列出被连接表中的所有列,包括其中的重复列。

2、不等连接: 在连接条件使用除等于运算符以外的其它比较运算符比较被连接的列的列值。这些运算符包括>、>=、<=、<、!>、!<和<>。

3、自然连接:在连接条件中使用等于(=)运算符比较被连接列的列值,但它使用选择列表指出查询结果集合中所包括的列,并删除连接表中的重复列。

例,下面使用等值连接列出authors和publishers表中位于同一城市的作者和出版社:

SELECT *

FROM authors AS a INNER JOIN publishers AS p

ON a.city=p.city



又如使用自然连接,在选择列表中删除authors 和publishers 表中重复列(city和state):

SELECT a.*,p.pub_id,p.pub_name,p.country

FROM authors AS a INNER JOIN publishers AS p

ON a.city=p.city


(二)外连接

内连接时,返回查询结果集合中的仅是符合查询条件( WHERE 搜索条件或 HAVING 条件)和连接条件的行。而采用外连接时,它返回到查询结果集合中的不仅包含符合连接条件的行,而且还包括左表(左外连接时)、右表(右外连接时)或两个边接表(全外连接)中的所有数据行。

外联接可以是左向外联接、右向外联接或完整外部联接。
在 FROM 子句中指定外联接时,可以由下列几组关键字中的一组指定:LEFT JOIN 或 LEFT OUTER JOIN;RIGHT JOIN 或 RIGHT OUTER JOIN;FULL JOIN 或 FULL OUTER JOIN。

 (1)左向外联接:左向外联接的结果集包括 LEFT OUTER 子句中指定的左表的所有行,而不仅仅是联接列所匹配的行。如果左表的某行在右表中没有匹配行,则在相关联的结果集行中右表的所有选择列表列均为空值。

(2)右向外联接:右向外联接是左向外联接的反向联接。将返回右表的所有行。如果右表的某行在左表中没有匹配行,则将为左表返回空值。

(3)完整外部联接:完整外部联接返回左表和右表中的所有行。当某行在另一个表中没有匹配行时,则另一个表的选择列表列包含空值。如果表之间有匹配行,则整个结果集行包含基表的数据值。

仅当至少有一个同属于两表的行符合联接条件时,内联接才返回行。内联接消除与另一个表中的任何行不匹配的行。而外联接会返回 FROM 子句中提到的至少一个表或视图的所有行,只要这些行符合任何 WHERE 或 HAVING 搜索条件。将检索通过左向外联接引用的左表的所有行,以及通过右向外联接引用的右表的所有行。完整外部联接中两个表的所有行都将返回。

如下面使用左外连接将论坛内容和作者信息连接起来:

SELECT a.*,b.* FROM luntan LEFT JOIN usertable as b

ON a.username=b.username



下面使用全外连接将city表中的所有作者以及user表中的所有作者,以及他们所在的城市:

SELECT a.*,b.*

FROM city as a FULL OUTER JOIN user as b

ON a.username=b.username


(三)交叉连接

交叉连接不带WHERE 子句,它返回被连接的两个表所有数据行的笛卡尔积,返回到结果集合中的数据行数等于第一个表中符合查询条件的数据行数乘以第二个表中符合查询条件的数据行数。

例,titles表中有6类图书,而publishers表中有8家出版社,则下列交叉连接检索到的记录数将等

于6*8=48行。

SELECT type,pub_name

FROM titles CROSS JOIN publishers

ORDER BY type

 
<think>好的,用户需要关于Oracle多连接查询的示例教程,特别是使用JOIN ON的写法。我需要先理解用户的问题,然后根据提供的引用资料来组织回答。 首先,用户提到了四个引用,其中引用1和3提到了内连接、外连接以及使用逗号分隔的多查询。引用2讨论了子查询JOIN的性能对比,引用4提到了EXISTS子查询。用户明确要求的是JOIN ON的示例,所以可能需要重点放在引用1、3和2中的相关内容。 我需要先介绍多连接的基本概念,然后分别讲解内连接、左外连接、右外连接、全外连接以及自连接的用法,每个部分都需要给出具体的SQL示例,并且确保使用正确的LaTeX格式。同时,根据引用2,可能还需要提到性能优化的建议,比如数据量小时用子查询,大时用JOIN,并建议使用执行计划分析。 另外,用户提供的引用3提到逗号分隔的多查询,这可能涉及到旧式JOIN语法,需要和新式的JOIN ON进行对比,或者说明两者的区别。同时,引用4中的EXISTS子查询虽然不直接相关,但可以作为对比,说明何时使用JOIN,何时使用子查询。 需要注意的是,用户要求回答结构清晰,分步骤解决问题,所以可能需要将内容分成几个部分,每个连接类型单独成段,示例代码用代码块展示,并确保LaTeX公式正确。例如,数学达式如WHERE子句中的条件可能需要用$符号包裹。 可能的问题点:确保示例的正确性,比如在自连接部分,需要正确使用别名,并解释清楚。同时,性能建议部分要准确引用资料中的内容,特别是引用2提到的数据量大小对子查询JOIN选择的影响。 最后,生成相关问题时要围绕多连接的不同类型、性能优化、新旧语法对比等方面提问,确保问题覆盖用户可能感兴趣的领域。 总结步骤: 1. 介绍多连接的作用和类型。 2. 分类型讲解内连接、左外、右外、全外连接、自连接,每个类型给出示例SQL。 3. 提及性能优化建议,引用资料中的内容。 4. 生成相关问题,涵盖教程中提到的各个点。</think>### Oracle多连接查询示例教程(JOIN ON) #### 一、多连接基础 Oracle中多连接用于联合多个中的数据,常见的连接类型包括**内连接(INNER JOIN)**、**左外连接(LEFT JOIN)**、**右外连接(RIGHT JOIN)**、**全外连接(FULL JOIN)**和**自连接(SELF JOIN)**。 以下为具体示例: --- #### 二、内连接(INNER JOIN) 内连接返回满足连接条件的行。 **示例1**:查询员工及其所属部门名称 ```sql SELECT e.employee_id, e.name, d.department_name FROM employees e INNER JOIN departments d ON e.department_id = d.department_id; ``` **说明**:仅返回两`department_id`匹配的行[^1]。 --- #### 三、左外连接(LEFT JOIN) 左外连接返回左所有行,右不满足条件时填充`NULL`。 **示例2**:查询所有员工及其部门(包括未分配部门的员工) ```sql SELECT e.employee_id, e.name, d.department_name FROM employees e LEFT JOIN departments d ON e.department_id = d.department_id; ``` **说明**:即使员工未分配部门,仍会显示其信息,部门字段为`NULL`[^3]。 --- #### 四、右外连接(RIGHT JOIN) 右外连接返回右所有行,左不匹配时填充`NULL`。 **示例3**:查询所有部门及其员工(包括无员工的部门) ```sql SELECT d.department_name, e.employee_id FROM employees e RIGHT JOIN departments d ON e.department_id = d.department_id; ``` --- #### 五、全外连接(FULL JOIN) 全外连接返回两所有行,不匹配时填充`NULL`。 **示例4**:联合显示所有员工和部门信息 ```sql SELECT e.name, d.department_name FROM employees e FULL JOIN departments d ON e.department_id = d.department_id; ``` --- #### 六、自连接(SELF JOIN) 自连接用于与自身关联,常用于层级数据。 **示例5**:查询员工及其直属上级 ```sql SELECT e1.name AS employee, e2.name AS manager FROM employees e1 INNER JOIN employees e2 ON e1.manager_id = e2.employee_id; ``` --- #### 七、性能优化建议 1. **数据量较小**时优先使用子查询,例如: ```sql SELECT * FROM employees WHERE department_id IN (SELECT department_id FROM departments WHERE location = '上海'); ``` 2. **数据量较大**时优先使用`JOIN`,并通过`EXPLAIN PLAN`分析执行效率[^2]。 3. 使用`EXISTS`子查询优化复杂条件,例如: ```sql SELECT * FROM employees a WHERE EXISTS (SELECT 1 FROM jobs b WHERE b.job_id = a.job_id + 1)[^4]; ``` ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值