数据库多连表
1. ACCESS数据库中如何实现多表联合查询
1、Access 数据库多表联合查询,每次连接之前须将连接符前面的内容放在括号里面,示例如:select 表a.字段1,表b.字段1,表c.字段1,表d.字段1 from ((表a inner join 表b on 表a.字段=表b.字段) inner join 表c on 表c.字段=表a.字段)inner join 表d on 表a.字段=表d.字段
2、如果每个联合字段不止一个可将on后面条件加(),如:select 表a.字段1,表b.字段1,表c.字段1,表d.字段1 from (表a inner join 表b on (表a.字段1=表b.字段1 and 表a.字段2=表b.字段2)) inner join 表c on 表c.字段=表a.字段
3、如果要一次联合一个表多次,但条件不同,可以每次连接此表时给此表换个别名,用别名操作即可,如:select aa.字段1,表b.字段1,表c.字段1,bb.字段2 from ((表a as aa inner join 表b on aa.字段1=表b.字段) inner join 表c on 表c.字段=表a.字段)inner join 表a as bb on 表a.字段=bb.字段2.
2. 数据库中多表连接的原理实现
多变关联的实现方式有hash join,merge join,nested loop join 方式,具体使用那种内型的连接,主要依据:
1.当前的优化器模式(all_rows和rule)
2.取决于表的大小
3.取决于关联字段是否有索性
4.取决于关联字段是否排序
Hash join散列连接,优化器选择较小的表(数据量少的表)利用连接键(join key)在内存中建立散列表,将数据存储到hash列表中,然后扫描较大的表
select A.*,B.* from A left join B on a.id=b.id。
先是从A表读取一条记录,用on条件匹配B表的记录,行成n行(包括重复行)如果B表没有与匹配的数据,则select中B表的字段显示为空,接着读取A表的下一条记录,right join类似。
left join基本是A表全部扫描,在表关键中不建议使用子查询作为副表,比如select A.*,B.*from A left join (select * from b where b.type=1 )这样A表是全表扫描,B表也是全表扫描。若果查询慢,可以考虑关联的字段都建索引,将不必要的排序去掉,排序会导致运行慢很多。
主副表条件过滤:
table a(id, type):
id type
----------------------------------
1 1
2 1
3 2
表b结构和数据
table b(id, class):
id class
---------------------------------
1 1
2 2
sql语句1: select a.*, b.* from a left join b on a.id = b.id and a.type = 1;
执行结果为:
a.id a.type b.id b.class
----------------------------------------
1 1 1 1
2 1 2 2
3 2
a.type=1没有起作用
sql语句2:
select a.*, b.* from a left join b on a.id = b.id where a.type = 1;
执行结果为:
a.id a.type b.id b.class
----------------------------------------
1 1 1 1
2 1 2 2
sql语句3:
select a.*, b.* from a left join b on a.id = b.id and b.class = 1;
执行结果为:
a.id a.type b.id b.class
----------------------------------------
1 1 1 1
2 1
3 2
b.class=1条件过滤成功。
结论:left join中,左表(主表)的过滤条件在on后不起作用,需要在where中添加。右表(副表)的过滤条件在on后面起作用。
Mysql join原理:
Mysql join采用了Nested Loop join的算法,
###坐车 回去补充。
3. 关系数据库如何查询多表有联系数据
关联查询是日常工作中常用的查询方式,关联查询sql编写的思路一般如下:1、先确定所连接的表,2、再确定所要查询的字段,3、确定连接条件以及连接方式(表连接分类: 内连接、外连接、交叉连接、自连接)
1、内连接:[inner] join on
分类:等值连接、非等值连接
(1)等值连接: 指使用等号"=“比较两个表的连接列的值,相当于两表执行笛卡尔后,取两表连结列值相等的记录(自然连接是一种特殊的等值连接)(2)非等值连接:指使用”>“或”<"比较两个表的连接列的值,相当于两表执行笛卡尔后,取一个表大于或小于另一个表的连结列值的记录
2、外连接
分类:左外连接、右外连接、全外连接
(1)左外连接:left outer join
连接效果:查询结果包含左、右两个表需要查询的全部行,左侧的表中的全部数据都会被显示出来,但是右侧表的数据,只有和左侧匹配上的数据才会被查询出来!否则显示为null(2)右外连接:right outer join
连接效果:查询结果包含左、右两个表需要查询的全部行,右侧的表中的全部数据都会被显示出来,但是左侧表的数据,只有和右侧匹配上的数据才会被查询出来!否则显示为null(3)全外连接:full/all outer join,查询结果包含左、右两个表需要查询的全部行,对应字段没有值显示null
3、交叉连接
左表中的每一行与右表中的所有行组合,也叫表与表之间做笛卡尔积查询
4、自连接
当前表与自身的连接查询,关键点在于虚拟化出一张表,即给自身的表定义一个别名
4. SQL server数据库中的多表连接查询和子查询的区别
连接查询是
通过主外键
让多个表数据对应
成一个表数据,而子查询是查到的数据
利用这个数据再查别的
如查张三的年级ID
再用这个年级ID去查对应的年级名