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. 【iBoard电子学堂】【iCore双核心板】资料光盘A盘更新,版本号为A6

    _____________________________________ 深入交流QQ群: A: 204255896(1000人超级群,可加入) B: 165201798(500人超级群,满员) C ...

  2. 【iBoard电子学堂开发板例程】【12个 stm32 例程发布】

    _____________________________________ 深入交流QQ群: A: 204255896(1000人超级群,可加入) B: 165201798(500人超级群,满员) C ...

  3. 使用CodeDOM实现代码生成及动态编译

    参考资料: http://www.cnblogs.com/lichdr/category/12610.html http://www.cnblogs.com/whitewolf/category/25 ...

  4. git 使用钩子直接推送到工作目录

    远端机器 $ mkdir /www/teacherapi  # 创建工作目录 $ cd /data/git $ git init teacherapi.git --bare --shared Init ...

  5. 鼠标选择文字事件js代码,增加层问题

    在页面中增加一个js代码,当用户用鼠标选择文字(鼠标拖动涂蓝文字)时,会出现一个层,提示与这个选择文字有个的信息<script type="text/javascript"& ...

  6. sql_action

    CREATE TABLE w SELECT * FROM existing_table 2 日期x idm valuexm 日期x idn  valuexn 日期y idm  valueym 日期y ...

  7. 数据库CRUD操作:C:create创建(添加)、R:read读取、U:update:修改、D:delete删除;高级查询

    1.注释语法:--,#2.后缀是.sql的文件是数据库查询文件3.保存查询4.在数据库里面 列有个名字叫字段   行有个名字叫记录5.一条数据即为表的一行 CRUD操作:create 创建(添加)re ...

  8. .Net搭建的WebService测试页使用TextArea大文本框方便调试

    用.Net搭建的WebService,系统默认提供了测试页,供大家输入参数进行测试.但因为参数输入框使用的是单行input控件,导致无法输入换行文本,使得有些参数(如换行的xml)无法输入,及其不便. ...

  9. CSS的display属性,显示或隐藏元素

    <html> <head> <script type="text/javascript"> function removeElement() { ...

  10. OC文件大小的计算方法,多用于清理缓存

    OC文件大小的计算方法,一般多用于清理缓存.下载.统计 可以使用以下方法: #pragma mark Bt转换 + (NSString *)axcFileSizeWithToString:(unsig ...