`
uule
  • 浏览: 6311410 次
  • 性别: Icon_minigender_1
  • 来自: 一片神奇的土地
社区版块
存档分类
最新评论

[基础] 子查询的用法

 
阅读更多

Mysql子查询

 

子选择基本用法 

1、用子选择来生成一个参考值 

在这种情况下,用内层的查询语句来检索出一个数据值,然后把这个数据值用在外层查询语句的比较操作中。

 

select * from xxx where col=[any|all](select * from xxxx);

该句法可分为加关键词和不加关键词的写法,

当不加关键词的时候,子查询语句返回的是一个离散值(注意是一个),查询语句将以子查询语句的结果作为自己where子句的条件进行查询,

该句法可以在子查询语句前加入any、all、some等关键字,此时子查询语句返回的是一组离散值。any则表示,查询语句是以子查询返回的值作为一个范围,在此值范围内进行查询,其与in关键字相像;all关键不太好了解,表示起全部匹配啥的。

 

比如说,如果要查询表中学生们在某一天的测验成绩,就应该使用一个内层查询先找到这一天的测验的事件号,然后在外层查询语句中用这个事件号在成绩表里面找到学生们的分数记录。具体语句为: 

select * from score where  

id=(select event_id from event where date='2002-03-21' and type='Q'); 

需要注意的是:在应用这种内层查询的结果主要是用来进行比较操作的分法时,内层查询应该只有一个输出结果才对。看例子,如果想知道哪个美国总统的生日最小,构造下列查询 

select * from president where birth=min(birth) 

这个查询是错的!因为MySQL不允许在子句里面使用统计函数!min()函数应该有一个确定的参数才能工作!所以我们改用子选择: 

select * from president where birht=(select min(birth) from presidnet); 

 

 

2、exists 和 not exists 子选择 

上一种用法是把查间结果由内层传向外层、本类用法则相反,把外层查询的结果传递给内层。看外部查询的结果是否满足内部查间的匹配径件。

这种“由外到内”的子迭择用法非常适合用来检索某个数据表在另外一个数据表里面有设有匹配的记录 

 

 

找两个表内都存在的数据 

select i1 from t1 where exists(select * from t2 where t1.i1=t2.i2); 

 

找t1表内存在,t2表内不存在的数据 

select i1 form t1 where not exists(select * from t2 where t1.i1=t2.i2); 

 

 

3、 in 和not in 子选择 

找两个表内都存在的数据 

select i1 from t1 where i1 in (select i2 from t2); 

 

找t1表内存在,t2表内不存在的数据 

select i1 form t1 where i1 not in (select i2 from t2);

 

 

4、select.... from (select.....) as name where ......

该句法,在平时用的比较少,而且并不好理解。其实是这么一回事,通过子查询执行的结果来构造一张新的表(这个表是一张衍生数据表,是一张虚拟的表),其用来作为主句的查询的对象,该句法功能非常强大,在一些复杂的查询中会经常用到。?

子查询虽然挺方便,但其有不少缺点,其不支持limit,而且经实验证明其执行效率相当不理想,在一般的情况下,还是不推荐是用子查询

 

 

把子选择查询改写为关联查询的方法 

1,匹配型子选择查询的改写 

下例从score数据表里面把学生们在考试事件(T)中的成绩(不包括测验成绩!)查询出来。 

Select * from score where event_id in (select event_id from event where type='T'); 

 

这个子查询可以被改写为一个简单的关联查询: 

Select score.* from score, event where score.event_id=event.event_id and event.event_id='T'; 

 

下例可以用来找出所有女学生的成绩。 

Select * from score where student_id in (select student_id form student where sex = ‘f'); 

可以把它转换成一个如下所示的关联查询: 

Select * from score,student 

Where student_id =student.student_id and student.sex ='f'; 

 

把匹配型子选择查询改写为一个关联查询是有规律可循的。下面这种形式的子选择查询: 

Select * from tablel 

Where column1 in (select column2a from table2 where column2b = value); 

可以转换为一个如下所示的关联查询: 

Select tablel. * from tablel,table2 

Where table.column1 = table2.column2a and table2.column2b = value;

 

 

非匹配(即缺失)型子选择查询的改写 

子选择查询的另一种常见用途是查找在某个数据表里有、但在另一个数据表里却没有的东西。正如前面看到的那样,这种“在某个数据表里有、在另一个数据表里没有”的说法通常都暗示着可以用一个left join 来解决这个问题。请看下面这个子选择查询,它可以把没有出现在absence数据表里的学生(也就是那些从未缺过勤的学生)给查出来: 

Select * from student 

Where student_id not in (select student_id from absence); 

 

这个子选择查询可以改写如下所示的left join 查询: 

Select student. * 

From student left join absence on student.student_id =absence.student_id 

Where absence.student_id is null; 

 

把非匹配型子选择查询改写为关联查询是有规律可循的。下面这种形式的子选择查询: 

Select * from tablel 

Where column1 not in (select column2 from table2); 

可以转换为一个如下所示的关联查询: 

Select tablel . * 

From tablel left join table2 on tablel.column1=table2.column2 

Where table2.column2 is null; 

注意:这种改写要求数据列table2.column2声明为not null。

分享到:
评论

相关推荐

    计算机sql语言的基础用法和常见用法

    本教程介绍了 SQL 的基础语法和常见用法,包括创建表格、插入数据、查询数据、更新数据、删除数据、连接表格、聚合函数、分组、子查询和窗口函数。SQL 是一种强大的语言,可以用于管理和分析各种关系型数据库。

    Mysql 基础练习大全(建表到基本查询)​

    查询语法示例:MySQL查询练习可以提供一系列查询语法示例,包括SELECT语句的基本用法、使用WHERE子句进行条件过滤、使用ORDER BY子句进行排序、...这些练习题目可以涉及更复杂的查询场景,如子查询、窗口函数的使用、跨

    精通sql结构化查询语句

    10.3.3 使用EXISTS子查询实现两表并集 10.3.4 使用NOT EXISTS的子查询 10.4 相关子查询 10.4.1 使用IN引入相关子查询 10.4.2 使用比较运算符引入相关子查询 10.4.3 在HAVING子句中使用相关子查询 10.5 UNIQUE子查询...

    Oracle-SQL基础到存储过程下载(第二阶段)

    022.sql高级查询_子查询.mp4 023.sql高级查询_关联之通用写法002.mp4 024.sql高级查询_子查询套关联.mp4 025.sql高级查询_关联之oracle特有写法.mp4 026.sql基础练习_经典18题.mp4 027.sql高级查询_伪列rowid.mp4 ...

    数据库查询相关知识点

    数据库Mysql查询基础知识点 文章目录数据库Mysql查询基础知识点重点:整个语句的执行过程如下:一.基础查询1.SELECT 子句的规定2. 为列起别名的操作3.... COUNT的用法八 .DISTINCT的使用方法与注意补: where ,gro

    mysql DDL DML DCL基础语法总结练习

    该文档基于windows DOS命令行环境下进行DDL,DCL,DML基础语法练习,包括数据库,表的创建,删除,修改,子查询,表连接,用户创建,授权等。

    SQL语句的基本用法案例.pdf

    除了基础的增删改查操作,文档还深入介绍了子查询、连接表以及窗口函数等高级用法。这些功能在实际应用中非常常见,能够帮助用户解决更为复杂的数据处理问题。 此外,文档还提供了清晰的代码示例和注释,使得读者...

    海量数据库解决方案_韩国_李华植

    第2部分中主要介绍提高数据读取效率的具体战略方案,在这部分中介绍与数据读取效率相关的局部范围扫描的原理和具体应用方法,以及对被认为是提高数据库使用效率基础的表连接的所有类型予以详细说明。  《海量...

    oracle知识点介绍(基础)

    本文档为个人所学整理,有oracle基本知识和常用用法的详细说明,与初学者常见的错误举例。包括举例说明——安装与访问、oracle简单查询、单行函数、分组聚合函数、多表查询、子查询、DML(增删改)等知识点。

    轻松学Oracle数据库

    表,SQL语言基础,子查询与高级查询,PL/SQL基础,存储过程、触发器与程序包,其他模式对象,用户权限与安全,数据的加载与传输以及使用RMAN工具备份与恢复等,最后还介绍了一个综合案例——手机话费消费系统。

    快速学习MySQL基础知识

    这篇文章主要梳理了 SQL 的基础用法,会涉及到以下方面内容: SQL大小写的规范 数据库的类型以及适用场景 SELECT 的执行过程 WHERE 使用规范 MySQL 中常见函数 子查询分类 如何选择合适的 EXISTS 和 IN 子...

    Microsoft SQL Server 2008技术内幕:T-SQL查询(第二卷)

    主要内容包括SQL的基础理论、查询优化、查询算法及复杂度,以及在使用子查询、表表达式、排名函数、数据聚合和透视转换、TOP和APPLY、数据修改、分区表、特殊数据结构等实际应用时会遇到的各种高级查询问题和解决...

    Microsoft+SQL+Server+2008技术内幕:T-SQL查询_源代码及附录 中文版

    主要内容包括SQL的基础理论、查询优化、查询算法及复杂度,以及在使用子查询、表表达式、排名函数、数据聚合和透视转换、TOP和APPLY、数据修改、分区表、特殊数据结构等实际应用时会遇到的各种高级查询问题和解决...

    中职学校《计算机应用基础》课程标准.pdf

    灵活的运用现代办公中的文字处理、 表格设计、演示文稿、网上浏览、电子邮件通信等常用软件的使用方法。从而加强学生对计算机的认识,提高学生的计算机应用能力和技巧,为全面提 高学生的素质,形成综合职业能力和...

    计算机应用基础综合实训指导书.doc

    建议总学时:30学时 训练学时:30学时 学习领域:计算机应用基础 学习情境:综合运用 学习目标:具有使用计算机进行实际工作的处理能力 学习内容: 学会在生活、学习和工作中利用计算机获取和处理信息的基本方法 ...

    SQL Server2005基础教程

     12.1 子查询   12.2 APPLY运算符  12.3 公用表表达式  12.4 透视数据  12.5 排名函数  12.6 使用MAX数据类型  12.7 小结  第13章 触发器  13.1 什么是触发器  13.2 DML触发器  13.3 针对DML...

    程序员的SQL金典6-8

     9.3.4 CowNewSQL的使用方法 第10章 高级话题  10.1 SQL注入漏洞攻防  10.1.1 SQL注入漏洞原理  10.1.2 过滤敏感字符  10.1.3 使用参数化SQL  10.2 SQL调优  10.2.1 SQL调优的基本原则  10.2.2 索引  ...

    程序员的SQL金典7-8

     9.3.4 CowNewSQL的使用方法 第10章 高级话题  10.1 SQL注入漏洞攻防  10.1.1 SQL注入漏洞原理  10.1.2 过滤敏感字符  10.1.3 使用参数化SQL  10.2 SQL调优  10.2.1 SQL调优的基本原则  10.2.2 索引  ...

    程序员的SQL金典.rar

     9.3.4 CowNewSQL的使用方法 第10章 高级话题  10.1 SQL注入漏洞攻防  10.1.1 SQL注入漏洞原理  10.1.2 过滤敏感字符  10.1.3 使用参数化SQL  10.2 SQL调优  10.2.1 SQL调优的基本原则  10.2.2 索引  ...

Global site tag (gtag.js) - Google Analytics