`
uule
  • 浏览: 6348833 次
  • 性别: 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。

分享到:
评论

相关推荐

    数据库子查询

    除了基本的子查询用法,文档中还提到了复杂的查询条件,比如分组查询和使用GROUP BY语句。例如,"根据部门和工作岗位进行分组,显示最大的薪水合计数以及它们对应的部门及岗位"要求先按照部门和工作岗位进行分组,...

    10.sql.server.2005.多表查询和子查询

    例如,如果你有一个`Employees`表和一个`Departments`表,你可以使用多表查询来找出每个部门的员工总数,或者使用子查询来找出薪水最高的员工所在的部门。这样的查询可能涉及到多个联接、嵌套子查询和聚合函数。 在...

    25.6 MySQL 子查询

    MySQL 子查询是一种在SQL查询语句中嵌套其他查询的方法,它允许我们在一个查询中使用另一个查询的结果。子查询可以作为SELECT语句的一部分,也可以出现在FROM或WHERE子句中,甚至可以在HAVING子句中使用。它们为...

    oracle讲义:子查询

    在学习Oracle子查询时,学员需要通过实践来熟悉不同场景下子查询的使用方法,掌握其返回的数据类型,以及如何在WHERE、HAVING、FROM子句中嵌入子查询,解决实际问题。同时,理解子查询返回空值对主查询的影响,以及...

    oracle子查询相关帮助

    在Oracle中,子查询是一个非常关键的概念,尤其对于初学者来说,理解和掌握子查询是提升SQL技能的基础。子查询,也称为嵌套查询,是在一个SQL语句中嵌入另一个查询,用于获取数据或对主查询进行条件判断。 1. **子...

    MySQL中表子查询与关联子查询的基础学习教程

    在处理大数据量时,应尽量避免使用关联子查询,转而使用JOIN、UNION或其他更高效的查询方式。然而,这并不意味着关联子查询没有用武之地,有时它们是解决特定问题的唯一方法。 总的来说,理解并熟练掌握MySQL中的表...

    浅析SQL中WHERE EXISTS子查询.pdf

    本文将重点剖析WHERE EXISTS子查询的语法、执行流程及使用离散数学知识辅助解决复杂查询的实现方法。 WHERE EXISTS子查询是SELECT语句中的一种常用的查询方式,它可以将一个查询块嵌入到另一个查询块中,以便实现...

    Oracle基础学习之子查询

    尽管不是常见的用法,但SELECT子查询可以在返回结果集中嵌套另一个查询,例如获取每个员工的部门名称: ```sql SELECT e.empno, e.ename, e.job, (SELECT d.dname FROM dept d WHERE d.deptno = e.deptno) FROM ...

    Oracle数据库应用教程--子查询与高级查询.pptx

    子查询是一种在主要查询(外部查询)内部嵌套另一个查询(内部查询或子查询)的方法,用于提供外部查询所需的数据或条件。子查询可以出现在SELECT、UPDATE或DELETE语句中,并在WHERE或HAVING子句中使用。 1. **子...

    mysql连接查询、联合查询、子查询原理与用法实例详解

    MySQL中的查询操作是数据库操作的核心,它包括连接查询、联合查询和子查询,这些方法都是在处理多表数据时非常重要的技术。 连接查询是将两个或更多表的数据结合在一起进行查询,主要有四种类型:内连接(INNER ...

    .9i10g_子查询语句(_70_页_).ppt

    子查询,也称为嵌套查询,是在一个SQL语句中嵌入另一个SQL查询,用于获取所需数据的一种方法。在Oracle 10g中,子查询可以用于多种场景,如比较、计算、联接等,以满足复杂的业务需求。 子查询可以在SELECT、FROM和...

    Laravel开发-eloquent-subquery-magic

    在Laravel的Eloquent中,可以使用`DB::raw()`方法创建子查询。Eloquent Subquery Magic则提供了更高级的API,使得子查询的使用更加简洁且直观。 2. `FromSubQuery` `FromSubQuery`允许你在构建查询时将子查询作为...

    数据库基础查询语句资料

    本文将深入探讨在数据库中执行基础查询语句的关键知识点,主要针对描述中的三个方面:基本查询语句及书写规则、别名的使用方法以及关键字的使用方法。 首先,让我们来看基本查询语句及书写规则。SQL(Structured ...

    thinkPHP简单实现多个子查询语句的方法

    那么可以参考网站提供的系列教程,如《ThinkPHP入门教程》、《thinkPHP模板操作技巧总结》、《ThinkPHP常用方法总结》等,这些教程不仅涵盖了ThinkPHP的基础使用,还涉及到了模板技术和框架的高级用法,能够帮助你更...

    MySQL数据库学习笔记(六)----MySQL多表查询之外键、表连接、子查询、索引

    合理设计数据库结构,正确使用外键以保证数据一致性,运用适当的表连接和子查询来获取所需信息,以及根据查询需求创建和管理索引,都将直接影响到系统性能。因此,深入理解并熟练掌握这些知识点,是成为合格的数据库...

    SQL查询语言及应用

    子查询是指在一个查询语句中嵌套另一个查询语句。子查询可以出现在SELECT、FROM或WHERE子句中。 ```sql SELECT * FROM table1 WHERE column IN (SELECT column FROM table2); ``` 2. **联结查询**: 联结...

    XML路径表达式中公共子查询的优化技术 (2005年)

    4. **查询优化:** 在查询处理阶段,对于识别出的公共子查询,只进行一次计算,并将结果存储起来供其他需要该子查询的查询使用,从而避免了重复计算。 #### 实验验证与分析 为了验证基于标注后缀树的公共子查询...

    SQL各种查询方法

    以上是SQL2000中的各种查询方法,这些基础知识对于理解和使用任何SQL数据库都是非常重要的。通过熟练掌握这些方法,你可以高效地从数据库中获取你需要的信息。在实际应用中,还可以结合存储过程、触发器、视图等高级...

Global site tag (gtag.js) - Google Analytics