有这样两张表,如下图:

stu_info                                                                               stu_score

id                        name                                                        id            score       stu_id

1                          刘思宇                                                      1              99               2

2                          王康                                                          2              60               1

3                          费楠                                                          3              45               5

4                          欧凤奇                                                      4              99               3

5                          邱毅                                                          5              59               4

SQL语句下载

要实现这样一种查询:查询出成绩不及格的学生的姓名:

1、in:select si.name from stu_info si where si.id in (select stu_id from stu_score where score < 60 );

not in:select si.name from stu_info si where si.id not in (select stu_id from stu_score where score >= 60 );

2、exists:select si.name from stu_info si where exists (select stu_id from stu_score where score < 60 and si.id = stu_id);

not exists:select si.name from stu_info si where not exists (select stu_id from stu_score where score >= 60 and si.id = stu_id);

3、left join...on:select si.name from stu_info si left join stu_score ss on si.id = ss.stu_id where ss.score < 60;
                                    或
                                    select si.name from stu_info si left join stu_score ss on si.id = ss.stu_id and ss.score < 60  where ss.stu_id is not null;

select si.name from stu_info si left join stu_score ss on si.id = ss.stu_id and ss.score >= 60 where ss.stu_id is null;

上面1、2和3都可以实现这一查询效果,通常使用含有exists关键字的SQL语句——因为exists的SQL性能略优与in;最好使用left join...on SQL语句——因为左连接的SQL语句没有使用子查询,SQL性能最好;

扩展:将stu_scroe表结构做一修改:

stu_score

id       course_name        score       stu_id

1                 语文                     99              2

2                 语文                     60              1

3                 语文                     45              5

4                 语文                     99              3

5                 语文                     59              4

6                 数学                     89              2

7                 数学                     70              1

8                 数学                     45              5

9                 数学                     69              3

10               数学                     59              4

SQL语句下载

要实现这样一种查询:使用左连接查询 各科成绩 均不及格的学生的姓名:

如果这时还执行上面3条left join...on 语句你会发现前两条,即“select si.name from stu_info si left join stu_score ss on si.id = ss.stu_id where ss.score < 60;”和“select si.name from stu_info si left join stu_score ss on si.id = ss.stu_id and ss.score < 60  where ss.stu_id is not null;”会出现四条两两重复的数据,如下:

name

欧凤奇

欧凤奇

邱毅

邱毅

如果执行上面3条left join...on 语句中的第3条,即“select si.name from stu_info si left join stu_score ss on si.id = ss.stu_id and ss.score >= 60 where ss.stu_id is null;”则可以达到查询效果,其实如果你把该语句中的where条件查询去掉查询的记过如下:

name

刘思宇

刘思宇

王康

王康

费楠

费楠

欧凤奇

邱毅

即也出现了数据两两重复的现象;

总之一句话:再使用left join...on会出现数据两两重复的现象,为什么呢?如果讲上面三条含left join...on的SQL语句做一修改——添加一个distinct关键字:

select distinct si.name from stu_info si left join stu_score ss on si.id = ss.stu_id where ss.score < 60;
       或
       select distinct si.name from stu_info si left join stu_score ss on si.id = ss.stu_id and ss.score < 60  where ss.stu_id is not null;
       或
       select distinct si.name from stu_info si left join stu_score ss on si.id = ss.stu_id and ss.score >= 60 where ss.stu_id is null;

添加完该关键字后就会发现这时的查询结果才是我们想要的,可是上面为什么会出现数据两两重复的现象呢?为什么加上distinct关键字就可以了呢?呵呵呵,之所以出现数据两两重复的现象是因为那样的left join...on语句产生了笛卡尔积,而使用distinct关键字可以消除笛卡尔积 产生的影响。

笛卡尔积:

待续。。。

distinct:

待续。。。

SQL语句优化—in,not in,exists,not exists, left join...on相关推荐

  1. SQL语句优化技术分析

    SQL语句优化技术分析 操作符优化 IN 操作符 用IN写出来的SQL的优点是比较容易写及清晰易懂,这比较适合现代软件开发的风格. 但是用IN的SQL性能总是比较低的,从ORACLE执行的步骤来分析用 ...

  2. 优化数据库的方法及SQL语句优化的原则

    优化数据库的方法: 1.关键字段建立索引. 2.使用存储过程,它使SQL变得更加灵活和高效. 3.备份数据库和清除垃圾数据. 4.SQL语句语法的优化.(可以用Sybase的SQL Expert,可惜 ...

  3. 提高系统性能——对SQL语句优化的思考

    软件在研发的过程中自始至终都在留意着系统的可扩展性.但与此同一时候也在关注着系统的性能,SQL语句作为系统性能的一环不容忽视.从今天開始结合开发的经验,谈一下我对SQL语句优化的理解和认知: 1.在联 ...

  4. 【腾讯面试题】SQL语句优化方法有哪些?

    SQL语句优化 性能不理想的系统中,除了一部分是因为应用程序的负载确实超过了服务器的实际处理能力外,更多的是因为系统存在大量的SQL语句需要优化. 为了获得稳定的执行性能,SQL语句越简单越好.对复杂 ...

  5. mysql高效sql语句_高效SQL优化 非常好用的SQL语句优化34条

    高效SQL优化 非常好用的SQL语句优化34条 相关软件相关文章发表评论 来源:2011/2/13 9:38:43字体大小: 作者:佚名点击:576次评论:0次标签: 类型:电子教程大小:8.5M语言 ...

  6. php面试专题---MySQL常用SQL语句优化

    php面试专题---MySQL常用SQL语句优化 一.总结 一句话总结: 原理,万变不离其宗:其实SQL语句优化的过程中,无非就是对mysql的执行计划理解,以及B+树索引的理解,其实只要我们理解执行 ...

  7. 优化数据库的思想及SQL语句优化的原则

    优化数据库的思想: ================ 1.关键字段建立索引. 2.使用存储过程,它使SQL变得更加灵活和高效. 3.备份数据库和清除垃圾数据. 4.SQL语句语法的优化.(可以用Syb ...

  8. 【转】sql语句优化工具LECCO SQL Expert

    软件说明: 更优更快 人工智能自动SQL优化----------http://www.sina.com.cn 2001/12/12 17:48 中国电脑教育报文/SQL爱好者 所谓SQL,就是指Str ...

  9. MySQL数据库:SQL语句优化

    数据库最常用的优化方式有:SQL语句和索引.数据库表结构.系统配置.硬件. 优化效果:SQL语句和索引 < 数据库表结构 < 系统配置 < 硬件,成本也是递增的. 优化方法 设计符合 ...

  10. 一个系列搞懂Mysql数据库12:从实践sql语句优化开始

    Table of Contents 字段 索引 查询SQL 引擎 MyISAM InnoDB 0.自己写的海量数据sql优化实践 mysql百万级分页优化 普通分页 优化分页 总结 除非单表数据未来会 ...

最新文章

  1. 计算机原理基础知识pdf,计算机原理第一章.pdf
  2. 2 Powershell与Cmd以及Unix/Linux Shell
  3. 计算机视觉 | 计算机视觉相关算法及工具
  4. oclick vue 传参 函数_详解Vue计算属性和侦听属性
  5. 简短—揭开数学学科对于计算机应用的神秘面纱
  6. edite not the main type
  7. python程序如何执行死刑_「Python基础知识」Python生成器函数
  8. php fpm 日志级别,Php 错误日志级别
  9. 学习笔记-Speed-Win
  10. android的抓包工具,安卓Android无需ROOT的流量抓包工具:PacketCapture
  11. 服务器托管过程中勒索病毒的预防
  12. boost asio异步服务端实现步骤
  13. OnlyBill 简易记账软件(续)
  14. 在bluehost如何使用WHM面板和ssh链接添加附加IP
  15. 【转载】Microsoft 365 E5邮件API调用自动订阅无限续订服务
  16. 2017年05月13日勒索软件, 勒索病毒(WannaCry)肆虐全球, 中国安全防线严重受挫
  17. esp32--无线控制灯
  18. 声音处理用什么软件?3款软件让你的作品出圈!
  19. 编译小度deng wifi源码出错
  20. win10系统显示语言切换

热门文章

  1. 使用Socket通信实现Silverlight客户端实时数据的获取(模拟GPS数据,地图实时位置)...
  2. Azure Services Bus(服务总线)中的工作流(workflow)
  3. 大数据时代的可扩展性数据库集群技术
  4. 安徽出台医疗大数据应用发展实施意见
  5. Android实战简易教程-第二十八枪(Uri转String型实例)
  6. springMvc 使用ajax上传文件,返回获取的文件数据 附Struts2文件上传
  7. webpack配置信息说明
  8. Localtunnel(Node.js 版) 使用教程
  9. ABP理论学习之发布说明
  10. SQL Server 中位数、标准差、平均数