10:40 2013-08-29
JOIN ON...AND

 A left join B on A.col1=B.col1 and A.col2=xx
A left join B on A.col1=B.col1 where A.col2=xx

前面一种情况A.col2=xx是作为与 B的关联条件,满足on条件的返回B值,否则B为NULL(只影响B是否为NULL)
后面一种情况A.col2=xx是作为where筛选条件,满足where条件的A才能作为左表(影响A的行数)
在left join和right join的时候on条件不会删减“主”表的数据

mysql> select * from t1;
+----+------+
| id | cnum |
+----+------+
| 1 | 100 |
| 2 | 200 |
| 3 | 300 |
| 4 | 400 |
+----+------+
mysql> select * from t2;
+----+--------+-------+
| id | weight | exist |
+----+--------+-------+
| 2 | 22 | 0 |
| 4 | 44 | 1 |
| 5 | 55 | 0 |
| 6 | 66 | 1 |
+----+--------+-------+
mysql> select * from t1 a
left join t2 b
on a.id=b.id
and b.weight!=44
and b.exist=0
where b.id is null;
+----+------+------+--------+-------+
| id | cnum | id | weight | exist |
+----+------+------+--------+-------+
| 1 | 100 | NULL | NULL | NULL |
| 3 | 300 | NULL | NULL | NULL |
| 4 | 400 | NULL | NULL | NULL |
+----+------+------+--------+-------+

EXISTS子查询
exists用于选择条件中一般都用作相关子查询
exists子句根据其内查询语句的结果集空或者非空,返回一个布尔值。

 select top 20 * from DB_1.dbo.MF_MO_Z
where not exists (select top 10 * from DB_1.dbo.MF_MO_Z)

上面子查询是无关子查询,根据语句not exists返回的是false,因此整个语句返回为空。
1、先判断是无关还是相关子查询
无关子查询:子查询本身能直接执行
相关子查询:子查询执行本身会报错,因为引用到了外部查询的表
2、按照下面的说明,分析语句返回结果
无关:只要后面有一条记录,条件就成立
相关:将外查询表的每一行,代入内查询作为检验,如果内查询返回的结果取非空值,则EXISTS子句返回TRUE,这一行可作为外查询的结果行,否则不能作为结果。
联接(Join)
嵌套循环(Nested Loops Join)
对于顶部(外部)输入的每一行,扫描底部(内部)输入,然后输出匹配的行。
算法复杂度:inner table*outer table;外部表executed一次,内部表executedcount(returned外部表)次
适用于:外部表较小,内部表在join key上有索引
合并联接(Merge Join)
从两个已进行了相应排序的输入表中, 使用其排序顺序对行进行匹配。
算法复杂度:最大是大的那个记录数;both inputs executed only once
适用于:There is an equality operator on the join predicate(联接谓词),and their inputs are sorted.
哈希匹配(Hash Join)
使用来自顶部(build 构建)输入的每一行生成哈希表,使用来自底部(probe 探针)输入的每一行探测该哈希表,然后输出所有匹配的行。
算法复杂度:build+probe;both inputs executed only once
适用于:输入数据集较大,且未排序

知识准备-JOIN/EXISTS的更多相关文章

  1. Java后台工程师面试杂记——不跳不涨工资星人跳槽经历

    经过接近一个月的时间,完成换工作这件“小事”,前后总计面试了多家公司,最后也没接到几个offer,不过最终总算尘埃落定,就对这个过程进行一个总结吧. 在某互联网公司工作了近一年的时间,但是频繁的业务需 ...

  2. python工具程序一、复制目录中指定扩展名的文件

    #!/usr/bin/env python # coding:utf-8 # xcopy Lib directory and rename all files to *d.lib import os ...

  3. 关于SQL IO的一些资料

      前些天在做优化的时候发现一个有意思的现象,单纯的SQL执行很快,秒级返回,但是页面响应却很慢,一直在想这是为什么呢?有点怀疑服务器的IO有问题,想了想做了个实验,模拟了同样的场景,通过优化SQL将 ...

  4. 《笨方法学Python》加分题17

    题目通过前学习的文件操作把一个文件中的内容拷贝到另一个文件中,并使用 os.path.exists 在拷贝前判断被拷贝的文件是否已经存在,之后由用户判断是否继续完成拷贝. 新知识os.path.exi ...

  5. 基于TensorFlow的简单验证码识别

    TensorFlow 可以用来实现验证码识别的过程,这里识别的验证码是图形验证码,首先用标注好的数据来训练一个模型,然后再用模型来实现这个验证码的识别. 生成验证码 首先生成验证码,这里使用 Pyth ...

  6. Flask学习-Flask app接受第一个HTTP请求

    一.__call__() 在Flask app启动后,一旦uwsgi收到来自web server的请求,就会调用后端app,其实此时就是调用app的__call__(environ,start_res ...

  7. Jinja2 简明使用手册

    @Jinja2 简明使用手册(转载) 介绍 Jinja是基于python的模板引擎,功能比较类似于于PHP的smarty,J2ee的Freemarker和velocity. 运行需求 Jinja2需要 ...

  8. sql语句in

    在今天之前sql一直用in语句,知道今天遇到一张数据量很大的表查了三分钟才查出来,这才意识到数据库优化有多重要.作为一名开发人员,首先从优化sql语句开始. 之前用in写sql是这样的 select ...

  9. 一条经典SQL语句优化实例

    1.概述 如下SQL语句发生严重消耗资源的问题,使得OS's load average会在30以上,一条语句需要执行上百秒. /*PIXPatient 184176条DomainPatient 184 ...

随机推荐

  1. ORACLE SEQUENCE用法

    引用自: http://www.cnblogs.com/hyzhou/archive/2012/04/12/2444158.html 在oracle中sequence就是序号,每次取的时候它会自动增加 ...

  2. Oracle创建自增字段方法-ORACLE SEQUENCE的简单介绍

    引用自 :http://www.2cto.com/database/201307/224836.html   Oracle创建自增字段方法-ORACLE SEQUENCE的简单介绍 先假设有这么一个表 ...

  3. Scrum会议1(Beta版本)

    组名:天天向上 组长:王森 组员:张政.张金生.林莉.胡丽娜 代码地址:HTTPS:https://git.coding.net/jx8zjs/llk.git SSH:git@git.coding.n ...

  4. html5+css3

    1,文件声明,<!Doctype>,不再有严格模式和混杂模式 2语意的标签 1,header 头 section中 nav导航(中上) aside侧边栏(中左) article内容(中右) ...

  5. ProtocalBuffers学习记录

    Google Protocol Buffer 的使用和原理 Google Protocol Buffers 概述 Google Protocol Buffers 入门 Protocol Buffers ...

  6. Setting property 'source' to 'org.eclipse.jst.jee.server

    警告: [SetPropertiesRule] Setting property 'source' to 'org.eclipse.jst.jee.server:project' did not fi ...

  7. Nginx 笔记与总结(4)配置 server 访问日志

    打开 nginx.conf: [root@localhost ~]# cd /usr/local/nginx/conf [root@localhost conf]# vim nginx.conf 在默 ...

  8. mobile cpu上禁用alpha test的相关总结

       因为,每家芯片的特性不同,根据向framebuffer写法的不同,分为tile-based的mobile cpu,如ImgTec PowerVR,ARM Mali,一部分老版本Qualcomm  ...

  9. kudu

    Kudu White Paper http://www.cloudera.com/documentation/betas/kudu/0-5-0/topics/kudu_resources.html h ...

  10. java,for循环中的穷举、迭代、冒泡例题

    1.100以内与7相关的数 //100以内与7相关的数: public static void main1(String[] args) { for(int i=1;i<=100;i++){ i ...