外连接

数据库--SQL进阶之多表查询

怎甘沉沦 提交于 2020-01-23 17:02:33
一. 合并结果集 要求被合并的表中,类的类型和列数相同 UNION,去除重复行 UNION ALL,不去除重复行 SELECT * FROM cd UNION ALL SELECT * FROM ab; 二. 连接查询 1.分类 内连接 外连接 左外连接 右外连接 全外连接(MySQL不支持) 自然连接 2.内连接 方言:SELECT * FROM 表1 别名1, 表2 别名2 WHERE 别名1.xx=别名2.xx; 标准: SELECT * FROM 表1 别名1 INNER JOIN 表2 别名2 WHERE 别名1.xx=别名2.xx; 自然: SELECT * FROM 表1 别名1 UATURAL JOIN 表2 别名2; 3. 外连接 左外:SELECT * FROM 表1 别名1 LEFT OUTER JOIN 表2 别名2 ON 别名1.xx=别名2.xx; 左表记录无论是否满足条件都会查询出来,而右表只有满足条件才能出来。左表中不满足条件的记录,右表部分都为NULL 左外自然:SELECT * FROM 表1 别名1 NATURAL LEFT OUTER JOIN 表2 别名2 ON 别名1.xx=别名2.xx; 右外:SELECT * FROM 表1 别名1 RIGHT OUTER JOIN 表2 别名2 ON 别名1.xx=别名2.xx;

SQL各种连接查询详解

不想你离开。 提交于 2020-01-23 11:18:12
一、交叉连接(cross join) 交叉连接(cross join):有两种,显式的和隐式的,不带on子句,返回的是两表的乘积,也叫笛卡尔积。 例如:下面的语句1和语句2的结果是相同的。 语句1:隐式的交叉连接,没有cross join。 select o.id, o.order_number, c.id, c.name from orders o , customers c where o.id=1; 语句2:显式的交叉连接,使用cross join。 select o.id,o.order_number,c.id,c.name from orders o cross join customers c where o.id=1; 语句1和语句2的结果是相同的,查询结果如下: 二、内连接(inner join) 内连接(inner join):有两种,显式的和隐式的,返回连接表中符合连接条件和查询条件的数据行。(所谓的链接表就是数据库在做查询形成的中间表)。 例如:下面的语句3和语句4的结果是相同的。 语句3:隐式的内连接,没有inner join,形成的中间表为两个表的笛卡尔积。 select o.id,o.order_number,c.id,c.name from customers c, orders o where c.id=o.customer_id; 语句4

面试题总结

感情迁移 提交于 2020-01-19 00:29:45
1 数据库 1.1 内连接、外连接区别? 内连接:只查询满足连接条件的数据,连接条件以外的数据被过滤。 集合:A交B SQL语句: select a.c1,b.c2 from A a,B b where a.pk=b.fk select a.c1,b.c2 from A a join B b on a.pk=b.fk 外连接:不满足连接条件数据,连接条件以外的数据也查询出来。 外连接分为左外连接、右外连接和全外连接。 左外连接:A select a.c1,b.c2 from A a left join B b on a.pk=b.fk select a.c1,b.c2 from A a right join B b on a.pk=b.fk 1.2 索引的作用和缺点 作用:加速字段的检索效率,快速定位; 缺点:对表中数据进行增删改操作时,需要同时修改索引数据,降低效率;索引本身占用空间。 1.3 什么是事务 事务将一组SQL语句作为一个整体,所有SQL语句操作成功,事务整体蔡成功;任何一个语句操作失败那么整个操作失败,回滚到操作前状态。 事务具有四个特性:ACID。即原子性、一致性、隔离性和持久性。 1.4 事务的隔离级别 多个事务并行操作时,可能引发数据访问冲突,包括:藏读、不可重复读和幻读; 为了避免数据访问冲突,需要对并行的事务进行隔离,而完全隔离优惠降低操作效率。

Oracle 外连接和 (+)号的用法

允我心安 提交于 2020-01-18 03:32:03
对于外连接,Oracle中可以使用“(+)”来表示,9i可以使用LEFT/RIGHT/FULL OUTER JOIN,下面将配合实例一一介绍。 1. LEFT OUTER JOIN:左外关联 SELECT e.last_name, e.department_id, d.department_name FROM employees e LEFT OUTER JOIN departments d ON (e.department_id = d.department_id); 等价于 SELECT e.last_name, e.department_id, d.department_name FROM employees e, departments d WHERE e.department_id = d.department_id( + ); 结果为:所有员工及对应部门的记录,包括没有对应部门编号department_id的员工记录。 2. RIGHT OUTER JOIN:右外关联 SELECT e.last_name, e.department_id, d.department_name FROM employees e RIGHT OUTER JOIN departments d ON (e.department_id = d.department_id); 等价于 SELECT

ORACLE 左连接 右连接 内连接 区别

纵饮孤独 提交于 2020-01-18 02:54:00
要旨: 左连接显示左边全部的和右边与左边相同的 右连接显示右边全部的和左边与右边相同的 内连接是只显示满足条件的 Oracle左连接,右连接 数据表的连接有: 1、内连接(自然连接): 只有两个表相匹配的行才能在结果集中出现 2、外连接: 包括 (1)左外连接 (左边的表不加限制) (2)右外连接(右边的表不加限制) (3)全外连接(左右两表都不加限制) 3、自连接(连接发生在一 张基表内) sql标准语法: select table1.column,table2.column from table1 [inner | left | right | full ] join table2 on table1.column1 = table2.column2; inner join 表示内连接;left join表示左外连接;right join表示右外连接;full join表示完全外连接; on子句用于指定连接条件。注意,如果使用from子句指定内、外连接,则必须要使用on子句指定连接条件; 如果使用(+)操作符指定外连接,则必须使用where子句指定连接条件。 如果主表的主键列和从表的外部键列名称相同,那么可以使用 natural join 关键字自动执行内连接操作。 select dname,ename from dept natural join emp; select a

oracle03-内外连接

本小妞迷上赌 提交于 2020-01-18 02:44:50
原文地址:http://www.cnblogs.com/rootq/archive/2008/09/08/1287150.html 数据表的连接有: 1、内连接(自然连接): 只有两个表相匹配的行才能在结果集中出现 2、外连接: 包括 (1)左外连接(左边的表不加限制) (2)右外连接(右边的表不加限制) (3)全外连接(左右两表都不加限制) 3、自连接(连接发生在一张基表内) s elect a.studentno, a.studentname, b.classname from students a, classes b where a.classid(+) = b.classid; STUDENTNO STUDENTNAM CLASSNAME ---------- ---------- ------------------------------ 1 周虎 一年级一班 2 周林 一年级二班 一年级三班 以上语句是右连接: 即"(+)"所在位置的另一侧为连接的方向,右连接说明等号右侧的所有 记录均会被显示,无论其在左侧是否得到匹配。也就是说上例中,无 论会不会出现某个班级没有一个学生的情况,这个班级的名字都会在 查询结构中出现。 反之: select a.studentno, a.studentname, b.classname from students a, classes

内连接与外连接

孤者浪人 提交于 2020-01-18 02:12:04
数据表的连接有: 1、内连接(自然连接): 只有两个表相匹配的行才能在结果集中出现 2、外连接: 包括 (1)左外连接(左边的表不加限制) (2)右外连接(右边的表不加限制) (3)全外连接(左右两表都不加限制) 3、自连接(连接发生在一张基表内) select a.studentno, a.studentname, b.classname from students a, classes b where a.classid(+) = b.classid; STUDENTNO STUDENTNAM CLASSNAME ---------- ---------- ------------------------------ 1 周虎 一年级一班 2 周林 一年级二班 一年级三班 以上语句是右连接: 即"(+)"所在位置的另一侧为连接的方向,右连接说明等号右侧的所有 记录均会被显示,无论其在左侧是否得到匹配。也就是说上例中,无 论会不会出现某个班级没有一个学生的情况,这个班级的名字都会在 查询结构中出现。 反之: select a.studentno, a.studentname, b.classname from students a, classes b where a.classid = b.classid(+); STUDENTNO STUDENTNAM CLASSNAME -

【数据库视频】--连接

时间秒杀一切 提交于 2020-01-17 02:25:05
数据库视频第七章,主要有两大部分,连接和查询。今天,咱们主要来讲一下连接的类型. SQLserver中的连接有:基本连接、内连接、左、右外连接、全连接、交叉连接、自连接。 基本连接 的格式:select 列名 from 两个或以上表名 where + 条件 内连接 的格式: 大家有没有神奇的发现?对! 内连接一般和基本连接是一样的,其效果相同,只是写法不同. 外连接 这是左外连接 这是右外连接 在左右外连接中区分主表和辅表,左连接中,a表是主表,右外连接中,b表是主表,两者都是获取主表中的全部信息,然后找到辅表的信息与之匹配。 上述分别是班级信息和学生信息表中的全部信息。 这是全连接的符合条件的筛查结果,包含左右外连接的所有结果。 交叉连接 交叉连接返回两个表格所有数据行的笛卡尔积,a表有5行,b表有2行,所以交叉连接后返回了10行。 自连接 字面意思理解,就是自己与自己连接,最后返回行数自然就是自己表格本身所包含数量。 来源: CSDN 作者: 郭静静--Jennica 链接: https://blog.csdn.net/weixin_43729166/article/details/104008024

MySQL 查询优化之 Block Nested-Loop 与 Batched Key Access Joins

眉间皱痕 提交于 2020-01-15 23:52:26
MySQL 查询优化之 Block Nested-Loop 与 Batched Key Access Joins 在MySQL中,可以使用批量密钥访问(BKA)连接算法,该算法使用对连接表的索引访问和连接缓冲区。 BKA算法支持 :内连接,外连接和半连接操作,包括嵌套外连接。 BKA的优点 :更加高效的表扫描提高了连接性能。 此外,先前仅用于内连接的块嵌套循环(BNL)连接算法现已扩展,可用于 外连接 和 半连接 操作,包括 嵌套外连接 。 以下部分讨论了连接缓冲区管理,它是原始BNL算法扩展,扩展BNL算法和BKA算法的基础。 有关半连接策略的信息,请参见 “使用半连接转换优化子查询,派生表和视图引用” Nested Loop Join 算法 Block Nested-Loop 算法 Batched Key Access 算法 BNL和BKA算法的优化器Hint Nested Loop Join算法 将外层表的结果集作为循环的基础数据,然后循环从该结果集每次一条获取数据作为下一个表的过滤条件去查询数据,然后合并结果。如果有多个表join,那么应该将前面的表的结果集作为循环数据,取结果集中的每一行再到下一个表中继续进行循环匹配,获取结果集并返回给客户端。 伪代码如下 : for each row in t1 matching range { for each row in t2

mysql 数据库 IV(多表查询)

℡╲_俬逩灬. 提交于 2020-01-14 19:04:16
1.今日内容 多表联合查询 内连接 (inner jion ...on ...) :只连接匹配的行 外连接:只连接匹配的行 左外连接 left jion ... on ... 右外连接 right jion ... on ... 全外连接 full jion select 字段列表 from 表1 inner|left|right join 表2 on 表1.字段 = 表2.字段 子查询 2.具体内容 数据准备 数据准备示例 mysql> use day41; Database changed # 建表 mysql> create table department( -> id int, -> name varchar(20) -> ); Query OK, 0 rows affected (0.05 sec) mysql> create table employee( -> id int primary key auto_increment, -> name varchar(20), -> sex enum('male','female') not null default 'male', -> age int, -> dep_id int -> ); Query OK, 0 rows affected (0.02 sec) # 插入数据 mysql> insert into