子查询转换成连接查询又可以分为两种情况,一种是不带聚合的子查询转换,另一种就是带有聚合函数的转换
一、不带聚合函数的子查询转换:
以下是一组测试数据:
- use mytest;
- drop table if exists jobs;
- CREATE TABLE jobs(
- employee varchar(30),
- title varchar(30)
- );
- drop table if exists ranks;
- CREATE TABLE ranks(
- title varchar(30),
- rank varchar(30)
- );
- drop table if exists salary;
- CREATE TABLE salary(
- rank varchar(30),
- payment int(11)
- );
-
- insert into jobs values('张三','经理'),('李四','总经理'),('王五','总经理助理');
- insert into ranks values('经理','三'),('总经理','一'),('总经理助理','二');
- insert into salary values('一',20000),('二',8000),('三',7000),('四',7000);
建立了三个表,分别是jobs员工工作表,记录了员工的工作,第二表ranks是岗位等级表,记录每一个工作岗位的等级,第三个表slary自然就是HR为每一个等级的定的薪资标准了。
现在要知道张三的工资是多少,就需要使用三张表才能得到数据,
使用子查询的方法如下:
- select payment from salary
- where rank=(
- SELECT rank from ranks
- where title=(
- SELECT title from jobs
- where employee='张三')
- );
转换为连接查询的步骤大致有如下几点:
1、使用表名或者表别名标记所有的列,如显jobs.employee 或者j.employee;
2、将几个子查询的From子名中使用的相同的表用同一个名字或同一别名;
3、将几个Form子句放在一起;
4、将Select及查询的列删除;
5、将第一个之后的Where替换成AND
最后得到如下结果:
- select payment from salary s,ranks r,jobs j
- where j.employee='张三'
- and j.title = r.title
- and s.rank = r.rank;
对于需要排除某些条件的查询,如查询岗位等级表中在薪资表中没有工资级别的等级:
- select salary.rank
- from salary
- where rank
- not in(select rank from ranks);
使用not in、exists、not exists不失为一种好方法,但同样可以转换成连接查询。如以上的查询可以转换为:
- select salary.rank
- from salary left join ranks
- on salary.rank=ranks.rank
- where ranks.rank is null;
二、带聚合函数的子查询向连接查询转换
如下测试数据,有一个订单表,记录了销售人员每天的销售记录,测试数据如下:
- DROP TABLE if exists orders;
- create table orders(
- customer varchar(30),
- whn date,
- totalitems int(11)
- );
- insert into orders values('jj','2010-10-10',5),
- ('jj','2010-10-11',3),
- ('jj','2010-10-12',1),
- ('aa','2010-10-10',5),
- ('bb','2010-10-10',8),
- ('cc','2010-10-10',10);
需要查询每一个销售员最高销售额的日期及销售额时,必然用的聚合函数MAX,以下是最容易想到的查询方式:
- select customer,whn,totalitems
- from orders o1 where o1.totalitems=(
- SELECT max(totalitems)
- from orders o2
- where o1.customer = o2.customer
- );
此时需要对每一行订单都要进行子查询,因此代码运行速度会很慢,并且老版本的MySQL还不支持子查询,只有一个表,要改成连接查询自然就是自连接了,这里我们需要使用Having子句,
- select o1.* from orders o1 join orders o2
- on(o1.customer=o2.customer)
- group by o1.customer
- having o1.totalitems=max(o2.totalitems
- );
分享到:
相关推荐
SQL 子查询总结 SQL 子查询是一种在 SQL 语言中嵌套在另一个查询的查询条件中的查询语句。子查询总是写在圆括号中,可以用在使用表达式的任何地方,如 Select、Insert、Update 或 Delete 语句或其他子查询中。 子...
### 子查询在SQL中的应用 #### 一、子查询定义及分类 子查询是SQL语言中一种重要的查询方式,它允许将一条SELECT语句作为另一条SELECT语句的一部分使用。这种结构化的设计使得数据库查询更为灵活和强大。具体而言...
【SQL查询与子查询组合】 SQL (Structured Query Language) 是用于管理和处理数据库的标准语言,而SQL Server 2000是Microsoft提供的一款关系型数据库管理系统。在这个实验中,你将学习如何使用SQL Server 2000的...
### 子查询相关知识点 #### 一、子查询概述 子查询是指在一个SQL查询语句中包含另一个查询语句的情况。这种结构允许我们基于内层查询的结果来执行外层查询,从而实现更复杂的逻辑处理。例如,我们可以使用子查询来...
数据库连接查询和子查询 数据库连接查询和子查询是数据库查询语言中两个重要的概念。连接查询是指将两个或多个表连接起来,以便从多个表中检索数据。子查询是指在 WHERE 或 HAVING 子句中使用的SELECT语句。 连接...
### Oracle中的子查询详解 #### 一、子查询概述与应用场景 子查询是SQL语言中一项非常重要的功能,它允许我们在一个查询语句中嵌入另一个查询语句,以此来解决复杂的查询问题。子查询可以极大地提高SQL语言的灵活...
在SQL查询中,`IN`子查询是一种非常实用的技术,它允许我们筛选出满足特定条件的记录,这些条件是基于另一个查询的结果。本教程将深入探讨`IN`子查询的概念、用途以及如何在实际数据库操作中有效利用它。 首先,...
oracle笔记子查询,有子查询相关的知识点笔记和具体的案例代码!
在本篇文章中,我们将深入探讨MySQL子查询的用法,包括单行子查询、多行子查询、关联子查询以及它们在实际应用中的示例。 1. 单行子查询 单行子查询返回单个值,常用于WHERE子句中与外部查询的字段进行比较。例如,...
SQL 子查询应用 SQL 子查询是 SQL 语言中一种强大的功能,可以用来解决复杂的查询问题。在本篇文章中,我们将讨论如何使用 SQL 子查询来解决一个实际问题,即计算银行账户的累计值。 在银行账户系统中,每笔交易都...
Mybatis框架(子查询)
SQL之分组统计和子查询专题 李兴华老师的ORACLE数据库课程中,对分组统计和子查询进行了深入详解。本课程涵盖了分组统计的重点和难点、子查询的概念和应用场景,以及在实际开发中需要注意的细节。 分组统计 在SQL...
### MS_SQL Server 多表查询与子查询详解 #### 一、子查询概述 在 SQL 语言中,当一个查询语句被嵌套在另一个查询的查询条件之中时,我们称之为**子查询**(Subquery)。子查询总是被写在圆括号中,并且可以被用在...
高级查询技术,特别是子查询,是数据库管理员和开发者必须掌握的重要技能。子查询,也被称为嵌套查询,允许在一个查询语句内部嵌套另一个查询,以实现更复杂的逻辑和数据分析。在本讨论中,我们将深入探讨子查询的...
在SQL语言中,子查询是解决复杂数据查询问题的关键工具,尤其在高级SQL应用中扮演着重要角色。本讲主要围绕子查询的概念、类型、使用方法以及子查询的语法进行详细讲解。 首先,子查询能够解决的问题主要有两类:一...
在本话题中,我们将探讨数据库设计的基础,特别关注SELECT语句、子查询以及语句嵌套这三个核心概念。 首先,数据库设计不仅仅是创建表格,更重要的是理解和分析业务需求,以构建一个能够支持高效数据存储、检索和...
总结起来,普元EOS CriteriaType `_or` 结合子查询的使用,可以有效地处理复杂的数据查询需求,包括对多个条件的逻辑组合,以及通过子查询进行多表关联和数据筛选。这在处理大量数据和构建动态查询逻辑时具有很高的...
从给定的文件标题“分组函数&子查询”及其描述和部分内客中,我们可以提炼出关于SQL语言中分组函数(Group Functions)和子查询(Subqueries)的详细知识点。以下是对这些知识点的深入解析: ### 分组函数 #### 组...
【SQL子查询、内连接和外连接查询】 在SQL中,子查询、内连接和外连接是进行复杂数据检索的关键工具。这些概念的理解和熟练应用对于数据库管理与数据分析至关重要。 **子查询** 是一个嵌套在其他SQL语句中的查询,...