`
victorwmh
  • 浏览: 212772 次
  • 性别: Icon_minigender_1
  • 来自: 宇宙
社区版块
存档分类
最新评论

[转]mysql子查询

阅读更多

一、有 = <> > < >= <= 的子查询
格式:
SELECT col1 , col2 , col3
FROM tb
WHERE col = [ANY | SOME | ALL](
SELECT coln FROM tb WHERE ...
)

举例:
SELECT `ID`, `classname`
FROM `ydfzx_software_class`
WHERE `fatherid` = ANY(
SELECT `id`
FROM `ydfzx_software_class`
WHERE `fatherid`=13
)

在这个查询中,子查询返回一个离散值(一列一行),如果有ANY或ALL的修饰,可以返回一个离散值列表(一列多行) ,其实 col = ANY 就相当于col IN


二、IN 子查询
格式:
SELECT col1 , col2 , col3
FROM tb
WHERE col [NOT] IN(
SELECT coln FROM tb WHERE ...
)

在有IN谓词的这个子查询中,返回一个离散值列表(一列多行)



三、SELECT ROW 字查询,注意返回值是0或1
格式:
SELECT ROW(value1,value2,value3 ...) = [ANY | SOME] SELECT col1,col2,col3

如果第2条查询必须返回一组离散值(多列单行),如果有ANY和SOME谓词的修饰,返回一组离散值列表
举例:
SELECT ROW(1,'操作系统',1) = ANY (SELECT `ID`,`caption`,`status` FROM `ydfzx_software_class`)
在`ydfzx_software_class`里查找有没有`ID`=1,`caption`='操作系统',`status`=1的记录,有就返回1,没有就返回NULL 或 0


四、EXISTS 子查询
格式:
SELECT col1,col2 FROM a WHERE EXISTS(SELECT ...)
解释:
主查询先查询出数据,再逐条通过EXISTS子查询验证,只有子查询返回的记录数不为0时,主查询中的记录有效.这个查询开销比较大

users表
┏━━━┯━━━┯━━━━┓
┃ uid │ name │address ┃
┃ 1 │张荣 │中光 ┃
┃ 2 │晨曦 │fuyang ┃
┃ 3 │川湘 │中光 ┃
┃ 4 │张荣 │浙江 ┃
┗━━━┷━━━┷━━━━┛
xl表
┏━━━┯━━━┯━━━━┓
┃ uid │ xl │year ┃
┃ 1 │大专 │2007 ┃
┃ 1 │大本 │2008 ┃
┃ 1 │硕士 │2009 ┃
┃ 2 │小学 │2012 ┃
┃ 2 │初中 │2018 ┃
┃ 2 │高中 │2021 ┃
┃ 2 │大本 │2025 ┃
┃ 4 │大本 │2025 ┃
┃ 5 │大本 │2025 ┃
┃ 3 │大专 │1995 ┃
┃ 3 │大本 │2001 ┃
┗━━━┷━━━┷━━━━┛


举例:找出users表中那些在xl表中有xl=小学的记录,他们的共同键为id
SELECT *
FROM `users`
WHERE EXISTS (
SELECT *
FROM `xl`
WHERE `xl`.`uid` = `users`.`uid` AND xl = '小学'
)
等效于:
SELECT `users`. *
FROM `users` , `xl`
WHERE `xl`.`xl` = '小学' AND `users`.`uid` = `xl`.`uid`

得到的结果为:

┏━━━┯━━━┯━━━━┓
┃ uid │name │address ┃
┃ 2 │晨曦 │fuyang ┃
┗━━━┷━━━┷━━━━┛



五、衍生数据表子查询
格式: SELECT ... FROM (SELECT ...) AS name WHERE 。
首先执行子查询生成临时表,外层查询再到此临时表中获取数据。
举例:
SELECT `users`.`uid` , `users`.`name` , count( `xl`.`uid` ) AS lcount
FROM `users` , `xl`
WHERE `users`.`uid` = `xl`.`uid`
GROUP BY `users`.`uid`
ORDER BY `lcount` DESC

等效于:
SELECT *
FROM(
SELECT `users`.`uid` , `users`.`name` , count( `xl`.`uid` ) AS lcount
FROM `users` , `xl`
WHERE `users`.`uid` = `xl`.`uid`
GROUP BY `users`.`uid`
) AS `temp`
ORDER BY `lcount` DESC

 

使用举例

1、有一存储树形目录的表tb, 共有3个字段,ID,classname,fatherid,每个节点一条记录.ID字段为非重复字段,classname为此节点的名称,每个子节点的 fatherid等于其父节点的ID,如果fatherid为0,表示它为顶层节点,如何能一次就查询

出各顶层节点有没有子节点呢,经过调试,以下语句执行成功。

SELECT `ID` , `classname` , `fatherid` ,

IF(
(SELECT COUNT(`ID` )
FROM `tb`
WHERE `fatherid` = `main`.`ID`
) >0, 1, 0) AS `haveson`

FROM `tb` AS `main`
WHERE `fatherid` =0

 

2、一次性查询出某节点的兄弟节点
SELECT *
FROM `tb`
WHERE `fatherid`=(SELECT `fatherid` FROM `tb` WHERE `ID`=6)

3、一次性查询出某节点的父辈节点
SELECT *
FROM `tb`
WHERE `fatherid`=(
SELECT `fatherid`
FROM `tb`
WHERE `ID`=(SELECT `fatherid` FROM `tb` WHERE `ID`=13)
)

分享到:
评论

相关推荐

    mysql子查询的用法

    MySQL子查询是数据库查询中的一个重要概念,它允许在SQL语句内部嵌套其他查询,用于检索、比较或操作数据。子查询可以理解为一个独立的查询结果,它被用作外部查询的一部分,提供了灵活的数据处理能力。在本篇文章中...

    mysql子查询与连表查询的效率比较及优化

    ### MySQL 子查询与连表查询的效率比较及优化 #### 一、子查询与连表查询概述 在SQL查询语言中,子查询与连表查询是两种非常重要的查询技术,广泛应用于各种复杂的业务场景中。为了更好地理解这两种查询方式的特点...

    MySQL锁类型以及子查询锁表问题、解锁1

    在实际应用中,可能会遇到死锁问题,特别是在涉及子查询的更新语句中。如描述中所示,如果一个事务在更新时对子查询中的表进行锁定,可能导致其他事务尝试获取已被锁定的资源,从而引发死锁。MySQL在检测到死锁时会...

    25.6 MySQL 子查询

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

    MySQL子查询示例数据库

    MySQL子查询是数据库查询中的一个重要概念,它在SQL语句中嵌套了另一个查询,用于检索、比较或聚合数据。这个“MySQL子查询示例数据库”很可能是包含了一系列使用子查询的实际示例,帮助用户更好地理解和应用子查询...

    MySQL的子查询学习及练习代码.txt

    本txt文件包含MySQL数据库的子查询,附上练习代码,也有一些注释及讲解,虽然不多,但希望对有需要的童鞋有帮助。

    mysql子查询精炼版.pdf

    MySQL子查询是数据库查询中的重要概念,用于在一个查询语句中嵌套另一个查询语句,以获取更复杂的数据。在上述文档中,主要讲解了单行子查询、多行子查询以及相关子查询和不相关子查询的用法。 1. **单行子查询**:...

    MySQL 子查询(subquery)语法与用法实例.docx

    MySQL 子查询语法与用法实例 MySQL 子查询是一种将 SELECT 语句的查询结果作为中间结果,供另一个 SQL 语句调用的技术。 MySQL 支持 SQL 标准要求的所有子查询格式和操作,也扩展了特有的几种特性。 MySQL 子查询...

    MySQL数据库:相关子查询.pptx

    MySQL数据库中的相关子查询是一种高级查询技术,它在处理复杂的数据检索时非常有用。相关子查询的特点在于,其内部查询的执行与外部查询是紧密关联的,子查询的执行依赖于外部查询的某个属性值。这与嵌套子查询形成...

    pbootcms数据sqlite转mysql数据库

    2. **SQL语法差异**:例如,SQLite支持的子查询语法在MySQL中可能需要调整,还有一些特定函数的使用也可能不同。 3. **事务处理**:SQLite默认开启自动提交,而MySQL需要手动开启和提交事务,转换过程中需要注意这...

    Oracle Sql语句转换成Mysql Sql语句

    3. **连接查询**:Oracle的JOIN语法允许在ON条件中使用子查询,而在MySQL中,子查询通常需要移到FROM或WHERE子句中。 4. **游标**:Oracle SQL支持游标,MySQL则不直接支持,需要使用存储过程或临时表来实现类似...

    09mysql子查询(重点难点)

    这是我自己学习mysql时的学习笔记,每一个知识点都是自己动手写的,涵盖了mysql中的几乎全部的基础知识点,查询,子查询,分组,排序,常用函数,多表连接,视图,变量,存储过程,函数,分支结构,循环结构等等

    Oracle数据库sql转换mysql数据库工具

    1. **SQL语法转换**:Oracle SQL和MySQL SQL在语法上有区别,如数据类型、子查询、游标、触发器等。工具会识别Oracle SQL语句并转换为等效的MySQL语法。 2. **数据迁移**:除了转换SQL,工具可能还支持数据的迁移,...

    MySQL数据库查询优化

    从实践看,MySQL的子查询优化技术的内容和范围,明确掌握子查询优化手段 预计时间2小时,每小时一个课程段(子查询是SQL查询优化的重点内容,务必掌握好) 第5课 查询优化技术理论与MySQL实践(三)------视图重写...

    MySQL子查询的几种常见形式介绍

    mysql子查询的几种常见写法: 代码如下:select * from xxx where col = [any|all](select * from xxxx); 该句法可分为加关键词和不加关键词的写法,当不加关键词的时候,子查询语句返回的是一个离散值(注意是一个)...

    MySQL的子查询及相关优化学习教程

    MySQL的子查询是数据库查询中的一个重要概念,它允许在单个SQL语句中嵌套另一个查询,用于获取或处理数据。子查询可以在WHERE、FROM、HAVING等子句中使用,提供了一种灵活的方式来组合复杂的数据操作。在本教程中,...

    MySQL子查询用法实例分析

    MySQL子查询是数据库查询中的一个重要概念,它在处理复杂的数据查询时非常有用。子查询,顾名思义,就是在一个SQL语句中嵌套另一个SQL查询,用于获取数据或者作为外部查询的一部分来过滤数据。在本例中,我们讨论的...

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

    MySQL子查询优化是数据库性能调优的一个重要环节,尤其是在处理大数据量时,子查询的效率直接影响到整体查询的性能。本文主要探讨了如何通过将子查询改写为关联查询来提高查询效率,避免不必要的计算和资源消耗。 ...

    Mysql子查询IN中使用LIMIT应用示例

    但是,MySQL并不支持在`IN`、`ALL`、`ANY`或`SOME`子查询中直接使用`LIMIT`,导致了错误。 为了解决这个问题,开发者采取了另一种策略,即创建一个临时子查询来获取所需的`aid`值: ```sql WHERE mapply.aid IN ...

Global site tag (gtag.js) - Google Analytics