SQL中的连接查询及其优化原则

  连接查询是SQL的主要任务,只有很好的掌握了连接查询及其优化方法才算是掌握了SQL的精髓所在。最近在面试中遇到了有关连接查询的问题,感觉回答的不是很好,总结一下。

具体示例请参考:http://www.w3school.com.cn/sql/sql_join.asp

总结:

连接查询原理与代码优化:假如要对table1和table2两个表进行连接查询,则DBMS首先会在table1中找到第一个元组,然后从头开始扫描table2表,逐一查找与table1第一个元组相对应的table2的元组,找到后就将table1的第一个元组和table2的第二个元组拼接起来,如果将table2扫描了一遍也没有找到,则开始匹配table1的第二个元组。直到table1也扫描完毕。返回查询到的连接表。通过连接查询的原理可以清楚,两个表的连接查询就是一个两层循环,如果table1的记录数为m,table2的记录数为n的话那么进行一次连接查询的时间复杂度应该是O(m*n)。可见连接查询是非常耗时的,如果表的记录数非常庞大查询效率就会变的很低。所以在写SQL语句特别是复杂的连接查询就要在代码层面对查询进行优化,优化的原则是把连接操作尽量放在最后,尽可能的把单表查询、选择操作放在前面这样就会在一定程度上减少连接查询表的记录数,提高执行效率。DBMS本身也会对SQL语句进行优化。

内连接、左外链接、右外链接:

inner join=join 可以理解为自然连接,是最常用的一种连接查询,返回匹配的行(至少有一个匹配才会返回)。

out join一般有left out join和right out join是和inner join相对的一种连接查询,其中left out join是指左边的表全部返回如果有对应的右边表的行则连接起来返回,否则设置为null。而right out join则相反。参考上面连接中的具体示例就很容易明白。

时间: 2024-10-02 11:14:51

SQL中的连接查询及其优化原则的相关文章

SQL 中的连接查询

关于SQL的应用,肯定离不开查询,而相对复杂的查询,总是离不开对表的连接,单个表操作的并不罕见,但是在应用环境大多数的查询都是针对2.3个表甚至更多的表7,至于连接,有内连接.外链接.交叉连接之分,每种连接方式都有各自的查询关键字去执行.此时犹记学时对这些概念含糊不分,不知所谓,总是认为课本的知识玄幻深奥,概念晦涩难懂,当然我也时常归咎于是本校师生随手“复印”的教材. 一. 内连接(通过关联信息匹配数据) 1.等值连接(=,有重复)  2.不等值连接(不等式.大小于)   3.自然连接(=,无重

SQL多表连接查询

SQL多表连接查询 本文主要列举两张和三张表来讲述多表连接查询. 新建两张表: 表1:student  截图如下: 表2:course  截图如下: (此时这样建表只是为了演示连接SQL语句,当然实际开发中不会这样建表,实际开发中这两个表会有自己不同的主键.) 一.外连接 外连接可分为:左连接.右连接.完全外连接. 1.左连接  left join 或 left outer join SQL语句:select * from student left join course on student.

oracle中的连接查询总结

连接查询: 连接查询是指基于多张表或视图的查询.使用连接查询时,应指定有效的查询条件,不然可能会导致生成笛卡尔积.如现有部门表dept,员工表emp,以下查询因查询条件无效,而产生笛卡尔积:   (各语句中字段不做解释,主要显示逻辑关系) select dept.dname,emp.ename from dept,emp where dept.name = 'sales'; 有效查询条件应该指定dept表与emp表之间的连接关系.表之间连接关系多如下: 1.相等连接(=) 相等连接主要用于查询主

Linq 中 表连接查询

1 public void Test(){ 2 3 var query = from a in A join b in B on A.Id equals B.Id into c 4 from d in c.DefaultIfEmpty() 5 select d; 7 } Linq 中 表连接查询,布布扣,bubuko.com

SQL Server中的连接查询

在查询多个表时,我们经常会用“连接查询”.连接是关系数据库模型的主要特点,也是它区别于其它类型数据库管理系统的一个标志. 什么是连接查询呢? 概念:根据两个表或多个表的列之间的关系,从这些表中查询数据. 目的:实现多个表查询操作. 知道了连接查询的概念之后,什么时候用连接查询呢? 一般是用作关联两张或两张以上的数据表时用的.看起来有点抽象,我们举个例子,做两张表:学生表(T_student)和班级表(T_class). T_student                            

sql大数据量查询的优化技巧

1.对查询进行优化,应尽量避免全表扫描,首先应考虑在 where 及 order by 涉及的列上建立索引. 2.应尽量避免在 where 子句中对字段进行 null 值判断,否则将导致引擎放弃使用索引而进行全表扫描,如: select id from xuehi.com where num is null 可以在num上设置默认值0,确保表中num列没有null值,然后这样查询: select id from xuehi.com where num=0 3.应尽量避免在 where 子句中使用

MySQL中使用连接查询

连接查询: 将多张表(可以大于2张)进行记录的连接(按照某个指定的条件进行数据拼接): 最终结果是: 记录数有可能变化, 字段数一定会增加(至少两张表的合并)! 连接查询的意义: 在用户查看数据的时候,需要显示的数据来自多张表. SQL中将连接查询分成四类:交叉连接,内连接,外连接和自然连接. 在介绍之前先创建两张表作为联系(my_stu,my_class) 1.交叉连接 cross join, 从一张表中循环取出每一条记录, 每条记录都去另外一张表进行匹配: 匹配一定保留(没有条件匹配), 而

SQL多表连接查询(详细实例)

转自: http://www.dedecms.com/knowledge/data-base/sql-server/2012/0709/2872.html 本文主要列举两张和三张表来讲述多表连接查询.新建两张表:表1:student  截图如下:表2:course  截图如下:(此时这样建表只是为了演示连接SQL语句,当然实际开发中我们不会这样建表,实际开发中这两个表会有自己不同的主键.)一.外连接外连接可分为:左连接.右连接.完全外连接.1.左连接  left join 或 left oute

linq to sql中修改连接字符串

如果在类库中在添加linq to sql并连接完数据库服务器后会自动生成settings.settings文件,app.config文件用于存储连接字符串(图一) 如要修改连接字符串要修改哪个还是要全部修改呢?经过我研究发现最简单只需要修改dbml一个文件即可,因为三者是关联的,dbml修改后其他两个文件会相应的修改,但是这是有顺序的:dbml.settings.settings和app.config,修改其中一个连接字符串会将之后文件中的连接字符串同步.否则逆向修改会麻烦一些比如修改了app.