`
快乐让让
  • 浏览: 18389 次
  • 性别: Icon_minigender_1
  • 来自: 上海
最近访客 更多访客>>
社区版块
存档分类
最新评论

关于简单的SQL子查询改写成联合查询

SQL 
阅读更多
需求是在“雇员通信录”表里插入订单数超过100的员工信息。

子查询写法:
SELECT 雇员ID,姓氏,名字,邮政编码,城市,地址,家庭电话 FROM 雇员
WHERE 雇员ID IN
(
   SELECT 雇员ID FROM 订单
    GROUP BY 雇员ID
   HAVING COUNT(订单ID) > 100
)

改写成联合查询为:
SELECT
雇员.雇员ID,雇员.姓氏,雇员.名字,雇员.邮政编码,雇员.城市,雇员.地址,雇员.家庭电话
COUNT(订单.订单ID)
FROM 雇员
INNER JOIN 订单
ON 雇员.ID = 订单.雇员ID
GROUP BY  订单.雇员ID HAVING COUNT(订单ID) > 100

提问如下:
1.子查询和联合查询的区别有几点?
2.子查询改写成联合查询后的SQL语句是否错误?
3.在实际的操作过程中,我们如何写健壮的SQL语句?
分享到:
评论
4 楼 快乐让让 2008-11-12  
谢谢你的虔诚回复,不过在SQL方面我还要继续努力
3 楼 快乐让让 2008-11-12  
谢谢你的恢复
2 楼 armorking 2008-10-16  
引用

1.子查询和联合查询的区别有几点?
2.子查询改写成联合查询后的SQL语句是否错误?
3.在实际的操作过程中,我们如何写健壮的SQL语句?


1.两者的区别主要是在效率上,INNER JOIN通常效率比IN高许多
一般应当避免用IN
当两张表的关系是1:1的时候,可以直接将IN逻辑改写成为INNER JOIN
当两张表的关系是1:N的时候,直接改写为INNER JOIN就会导致迪卡尔积
从而得到重复记录
这时候应当采用以下形式
SELECT 
    雇员.雇员ID,
    雇员.姓氏,
    雇员.名字,
    雇员.邮政编码,
    雇员.城市,
    雇员.地址,
    雇员.家庭电话,
    X.CNT
FROM 雇员 
INNER JOIN (
    SELECT 
        订单.雇员ID,
        COUNT(*) AS CNT
    FROM 订单
    GROUP BY 订单.雇员ID 
    HAVING COUNT(*) > 100 
) X ON
    雇员.雇员ID = X.雇员ID


当然,当订单表中数据很多的时候,上面的这个SQL语句可能仍然有效率问题
最简单的解决办法是在雇员加一个“订单数”的字段
每次订单插入/删除的时候修改这个字段即可

3.在实际写联合查询语句的时候,为了写出正确的SQL语句
最要紧的就是理清表与表之间的关系,
在处理1:N,N:M关系的时候,注意避免迪卡尔积
1 楼 LucasLee 2008-10-16  
你这么写结果应该是不对的。
联合查询中你的COUNT(订单ID)应该都改为COUNT(DISTINCT 订单ID),否则数目会多很多。

据我所知,一般来说联合查询比子查询的效率要高,但是没有子查询用起来方便直接,比如你的例子,就要注意我上面提到的问题。

相关推荐

    对MySQL子查询的简单改写优化

    本文主要探讨了如何通过将子查询改写为关联查询来提高查询效率,避免不必要的计算和资源消耗。 首先,我们要理解MySQL在处理子查询时的策略。不同于某些其他数据库系统,如Oracle,MySQL的优化器可能并不总是选择...

    85提纲挈领的告诉你,SQL语句的执行计划和性能优化有什么关系?.pdf

    - SQL优化需要综合考虑多种因素,包括索引选择、查询改写、数据类型选择、查询语句的逻辑等。 二、SQL执行计划的具体内容 1. 表的访问顺序 - 执行计划会展示出表被访问的顺序,以及使用何种方式访问(全表扫描、...

    ORACLE培训SQL性能优化.pptx

    在解析阶段,ORACLE 会检查语法、语义和权限,并合并视图定义和子查询。然后,在绑定阶段,ORACLE 会查找绑定变量并赋值。在执行阶段,ORACLE 会应用执行计划并执行必要的 I/O 和排序操作。最后,在提取阶段,ORACLE...

    深入浅出 SQL (中文版).part1

    本书甚至回答了那个老问题:如何讲解无关联子查询而不会因此失去活下去的愿望?本书是正确的学习途径——快速、活泼,而且看上去很酷。内容简介 你将从本书学到什么? 在如今的世界,数据就是力量,但是成功的真正...

    SQL Server 2005 数据库简明教程

    1. **查询优化器**: 自动选择执行查询的最佳路径,但也可以通过索引、查询改写等方式手动优化。 2. **性能监视与调优**: 使用动态管理视图(DMV)和性能计数器监控数据库性能。 3. **资源管理**: 设置资源限制,避免...

    MySQL基础知识以及简单练习题

    - **数据查询**:`SELECT`语句的使用,包括单表查询、多表联合查询、子查询等。 5. **索引与优化** - **索引的作用**:提高查询速度,有主键索引、唯一索引、普通索引、全文索引等类型。 - **创建与删除索引**:...

    2021-2022计算机二级等级考试试题及答案No.2489.docx

    这涉及到子查询和条件查询的概念。 2. Windows2000的回收站:回收站是Windows操作系统中的一个特殊文件夹,用于存储被删除的文件或文件夹,并非像剪贴板那样是内存中的一块区域。因此,描述是错误的。 3. 软件开发...

    PageHelper分页插件

    4. 支持动态SQL:可以在Mapper接口中编写复杂的分页查询,如联合查询、子查询等。 5. 友好的API设计:使用简单,只需在Service层调用几行代码即可实现分页功能。 6. 分页参数自动封装:Page对象可以自动将请求参数...

    华中科大数据库系统原理课件

    2. SQL语言:SQL是数据库操作的标准语言,课件会详细讲解SQL的语法,包括数据查询、插入、更新和删除操作,以及更复杂的联接、子查询和聚合函数的使用。 3. 数据库设计:这部分内容会涵盖数据库的概念设计、逻辑...

    2021-2022计算机二级等级考试试题及答案No.1902.docx

    22. **SQL查询类型**:SQL查询主要包括选择查询、联合查询、子查询等,而 **A. 选择查询** 不属于SQL查询的一种类型。 ### 变量概念 23. **变量类型**:实例变量是类的成员变量;局部变量在使用前必须被初始化;...

    2021-2022计算机二级等级考试试题及答案No.17462.docx

    4. SQL查询中,选择查询、联合查询和子查询是常见类型,但数字定义查询不属于SQL查询。 5. 数据结构中,与所使用的计算机无关的是数据的逻辑结构,它描述了数据元素之间的关系,而存储结构和物理结构则涉及具体实现...

    DB2手册pdf

    `NOT EXISTS`子句用于过滤出不满足子查询条件的行。这种方法通常比`NOT IN`和`EXCEPT`更高效,因为它避免了对第二个表的全表扫描。 ### 其他系统和DB2的交互 DB2支持多种与其他系统的交互方式,包括通过ODBC、JDBC...

    2021-2022计算机二级等级考试试题及答案No.3626.docx

    一对多或一对一的关系是最常见的关联方式,它们允许有效地管理和查询相关联的数据。 #### 知识点16:计算机基础原理 - **题目描述**:电子计算机技术遵循的基本原理是由冯·诺依曼提出的。 - **解析**:现代计算机...

Global site tag (gtag.js) - Google Analytics