mysql SQL优化之嵌套查询-遁地龙卷风

(-1) 写在前面

  这篇随笔的数据使用的是http://blog.csdn.net/friendan/article/details/8072668#comments里的,里面有一些常见的select查询练习题。

  我使用的是mysql自带的命令行

(1)数据准配

student 表

+---------+-----------+------+------+--------------+

| sno     | Sname     | Ssex | Sage | Sdept        |

+---------+-----------+------+------+--------------+

| 9512101 | 李勇      | 男   |   19 | 计算机系     |

| 9512102 | 刘晨      | 男   |   20 | 计算机系     |

| 9512103 | 王敏      | 女   |   20 | 计算机系     |

| 9521101 | 张力      | 男   |   22 | 信息系       |

| 9521102 | 吴宾      | 女   |   21 | 信息系       |

| 9521103 | 张海      | 男   |   20 | 信息系       |

| 9531101 | 钱小力    | 女   |   18 | 数学系       |

| 9531102 | 王大力    | 男   |   19 | 数学系       |

+---------+-----------+------+------+--------------+

course表

+-----+--------------------+-------+

| Cno | Cname              | Hours |

+-----+--------------------+-------+

| c01 | 计算机文化学       |    70 |

| c02 | VB                 |    90 |

| c03 | 计算机网络         |    80 |

| c04 | 数据库基础         |   108 |

| c05 | 高等数学           |   180 |

| c06 | 数据结构           |    72 |

+-----+--------------------+-------+

SC表

+---------+------+-------+

| Sno     | Cno  | Grade |

+---------+------+-------+

| 9512101 | C01  |    90 |

| 9512101 | C02  |    86 |

| 9512101 | C06  |  NULL |

| 9512102 | C02  |    78 |

| 9512102 | C01  |    82 |

| 9512102 | C02  |    75 |

| 9512102 | C04  |    92 |

| 9512102 | C05  |    50 |

| 9521103 | C02  |    68 |

| 9521103 | C06  |  NULL |

| 9531101 | C01  |    80 |

| 9531101 | C05  |    95 |

| 9531102 | C05  |    85 |

+---------+------+-------+

(2)问题及解答

查询计算机系男生修了"数据库基础"的学生的姓名、性别、成绩。

第一种方式:

SELECT Sname 姓名,Ssex 性别,SC.Grade 成绩

desc select distinct student.sno,student.ssex,SC.cno,SC.grade from studen t,SC,course where

       student.sdept="计算机系" and student.ssex="男" and

           student.sno = SC.sno and SC.cno = (select cno from course where cname = "数据库基础") \G;

第二种方式

desc select b.sno,b.ssex,a.grade from (select sno,ssex,sname from student) as b,

(select sno,grade from SC where

cno = (select cno from course where cname= "数据库基础") ) as a where a.sno = b.sno \G;

(3) 总结

  通常嵌套查询推荐使用join...on...语句,这样会减少临时表的创建,因为select子句会创建临时表

  上述语句虽然都没使用join...on...语句,第二种方式还是比第一种方式少创建了一张临时表,

并且第二种方式将筛选条件具体到单表上,思路清晰,条件明确,可读性也非常好,性能也是优于第一种方式的。

时间: 2024-09-28 20:35:07

mysql SQL优化之嵌套查询-遁地龙卷风的相关文章

逆水行舟 —— SQL优化之慢查询和explain以及性能分析

性能优化的思路 首先需要使用慢查询功能,去获取所有查询时间比较长的SQL语句 使用explain去查看该sql的执行计划 使用show profile去查看该sql执行时的性能问题 MySQL性能优化之慢查询 数据库的查询速度是影响项目性能的重要因素,除了添加缓存中间件外,对于查询本身的优化带来的性能也是不容小觑 要想优化查询SQL,就应该先找打需要被优化的SQL语句,MySQL提供了这么一个功能可以帮助我们快速定位带查询慢的SQL MySQL的慢查询日志功能:默认关闭,需要手动开启 查看是否开

18.Mysql SQL优化

18.SQL优化18.1 优化SQL语句的一般步骤 18.1.1 通过show status命令了解各种SQL的执行频率show [session|global] status; -- 查看服务器状态信息show session status; -- 查看session(当前连接)级别的服务器状态信息,默认session级别show global status; -- 查看global(数据库启动至今)级别的服务器状态信息show status like 'Com_%'; -- 查看当前sess

mysql sql优化

前言 有人反馈之前几篇文章过于理论缺少实际操作细节.这篇文章就多一些可操作性的内容吧. 注:这篇文章是以 MySQL 为背景,非常多内容同一时候适用于其它关系型数据库,须要有一些索引知识为基础. 优化目标 1.降低 IO 次数 IO永远是数据库最easy瓶颈的地方,这是由数据库的职责所决定的,大部分数据库操作中超过90%的时间都是 IO 操作所占用的,降低 IO 次数是 SQL 优化中须要第一优先考虑.当然,也是收效最明显的优化手段. 2.减少 CPU 计算 除了 IO 瓶颈之外,SQL优化中须

mysql sql优化及注意事项

sql优化分析 通过slow_log等方式可以捕获慢查询sql,然后就是减少其对io和cpu的使用(不合理的索引.不必要的数据访问和排序)当我们面对具体的sql时,首先查看其执行计划A.看其是否使用索引B.查看其查询的记录数C.确定索引的代价是否过高D.是否可以使用复合索引E.是否有“using temporary”F.是否有“using filesort” 创建高效索引 mysql的innodb有自己特殊的聚集索引(数据是按聚集索引的顺序存储的并和索引存储在一起),索引访问效率较高,次要索引是

mysql数据库优化 开启慢查询

Mysql数据库优化 一.sql及索引优化 如何发现有问题的sql?使用mysql慢查询日志对有效率问题的sql进行监控 //查看是否开启慢查询日志show variables like 'slow_query_log' set global slow_query_log =on;//开启慢查询 //设置保存慢查询日志路径set global slow_query_log_file = '/var/lib/mysql/slow_log.log'; //记录下没有使用索引的query,show v

Mysql SQL 优化

1. 查询缓存 多数MySQL服务器都开启了查询缓存,相同的查询被执行多次,查询结果会被放到一个缓存中,这样,后续的相同的查询就不用操作表而直接访问缓存结果了. // 查询缓存不开启 $r = mysql_query("SELECT username FROM user WHERE signup_date >= CURDATE()"); // 开启查询缓存 $today = date("Y-m-d"); $r = mysql_query("SELEC

超实用的SQL语句之嵌套查询

嵌套查询 什么是嵌套查询 . 嵌套查询的意思是,一个查询语句(select-from-where)查询语句块可以嵌套在另外一个查询块的where子句中,称为嵌套查询.其中外层查询也称为父查询,主查询.内层查询也称子查询,从查询. 嵌套查询的工作方式 先处理内查询,由内向外处理,外层查询利用内层查询的结果嵌套查询不仅仅可以用于父查询select语句使用.还可以用于insert.update.delete语句或其他子查询中. 子查询的组成 1.包含标准选择列表组件的标准select查询. 2.包含一

MySQL性能优化---定位慢查询

一.定位到查询慢的SQL语句 ##查询慢查询时间,mysql默认10s SHOW VARIABLES LIKE 'long_query_time'; ##查询慢查询的次数 SHOW STATUS LIKE 'slow_queries'; 二.怎么定位慢查询语句,启动慢查询日志 1.查询是否把索引的SQL记录到慢查询日志中 SHOW VARIABLES LIKE 'log_queries_%' 2.将查询到的值若为OFF,表示没有记录,就开启记录 ##修改OFF值为ON SET GLOBAL lo

SQL课堂笔记--嵌套查询

2017.11.15六:嵌套查询 嵌套查询概述:  一个select-from-where 语句称为一个查询块  将一个查询块嵌套在另一个查询块的where子句或having短语的条件中的查询称为嵌套查询   例1:查询选修了2号课程得学生姓名:  内连接:select sname from student,sc where student.sno=sc.sno and cno=2        或:select sname from student where sno in   --外层查询/