`
fantaxy025025
  • 浏览: 1279158 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类

Mysql_嵌套表查询_查询结果作为子表(临时表)

阅读更多

此功能同Oracle一样!

 

    许多人都觉得MySQL不支持嵌套查询,其实MySQl从4.11版后已经完全支持嵌套查询了,那么下面我举些简单的嵌套查询的例子吧(源程序来自MySQL User Manual):

    1. SELECT语句的子查询:
    语法: (注意:AS 可省略)

  CODE:
SELECT ... FROM (subquery) AS tableName ...


    先创建一个表:

  CODE:
CREATE TABLE t1 (s1 INT, s2 CHAR(5), s3 FLOAT);
INSERT INTO t1 VALUES (1,'1',1.0);
INSERT INTO t1 VALUES (2,'2',2.0);


    我们就可以进行以下的嵌套查询了:

  CODE:
SELECT sb1,sb2,sb3
       FROM (SELECT s1 AS sb1, s2 AS sb2, s3*2 AS sb3 FROM t1) AS sb
       WHERE sb1 > 1;


    结果是: 2, '2', 4.0.

    我们知道下面语句是不会得到正确结果的,因为对经过Group by排序的集合进行求均值是不能得到正确答案的:

  CODE:
SELECT AVG(SUM(column1)) FROM t1 GROUP BY column1


    所以我们可以通过下面的嵌套查询实现同样的效果:

  CODE:
SELECT AVG(sum_column1)
       FROM (SELECT SUM(column1) AS sum_column1
             FROM t1 GROUP BY column1) AS t1;


    2.行的子查询(Row Subquery):
    看下面的例子:

  CODE:
SELECT * FROM t1 WHERE ROW(1,2) = (SELECT column1, column2 FROM t2);


    这个查询是返回column1等于column2的结果行。Row函数中的1和2相当于构造参数。想必Blogjava上的同志对这些应该比较清楚,也不去详细介绍了。

    3.使用Exist和Not Exist参数
    这里的Exist和Not Exist用途及用法和在其他没有什么大的区别,我就简单举几个范例好了:

    范例一:

  CODE:
SELECT DISTINCT store_type FROM Stores
                    WHERE EXISTS (SELECT * FROM Cities_Stores
                                  WHERE Cities_Stores.store_type = Stores.store_type);


    范例二:

  CODE:
SELECT DISTINCT store_type FROM Stores
                       WHERE NOT EXISTS (SELECT * FROM Cities_Stores
                                   WHERE Cities_Stores.store_type = Stores.store_type);


    范例三:  这个例子中嵌套使用了Not Exist语法,稍微注意一下:

  CODE:
               SELECT DISTINCT store_type FROM Stores S1
                    WHERE NOT EXISTS (
                               SELECT * FROM Cities WHERE NOT EXISTS (
                                       SELECT * FROM Cities_Stores
                                                 WHERE Cities_Stores.city = Cities.city
                                                         AND Cities_Stores.store_type = Stores.store_type));


    4.条件关联关系查询:
    解释起来麻烦,直接看例子吧:

  CODE:
SELECT column1 FROM t1 AS x
     WHERE x.column1 = (SELECT column1 FROM t2 AS x
          WHERE x.column1 = (SELECT column1 FROM t3
               WHERE x.column2 = t3.column1));


    跟其他数据库做法是一样的。

    5.其他使用方法和注意:
除了上面这些还有很多很多,不过就不去细讲了,因为这些跟别的数据库差不多,只是为了给大家一个参考,提提就够了。

  CODE:
         SELECT (SELECT s1 FROM t2) FROM t1;
         SELECT (SELECT s2 FROM t1);

    注意:

            #1 这种用法是把select的结果“值”作为“字段值”使用

            #2 select “aValue” from tableX; //其实是从表中选择这个值与表行数关联
    支持子查询的语法有:SELECT,INSERT,UPDATE,DELETE,SET和DO。

    子查询可以使用任何普通查询中使用的关键词:如DINSTINCT,GROUP BY,LIMIT,ORDER BY,UNION,ALL,UNION ALL等。可以使用<,>, <=, >=, =, <>运算符进行比较,也可以使用ANY ,IN和SOME进行集合的匹配。

分享到:
评论

相关推荐

    mysql子查询的用法

    - 当子查询结果集过大时,考虑使用JOIN或其他方法优化。 通过以上介绍,我们可以看到MySQL子查询在数据查询和分析中的强大功能。正确理解和运用子查询能帮助我们编写出更加高效和灵活的SQL语句,解决复杂的数据库...

    25.6 MySQL 子查询

    优化子查询可以通过使用JOIN操作、临时表或者将子查询结果缓存到变量中来提高效率。如果子查询结果不会改变,可以考虑使用存储过程或视图来预先计算并存储结果。 5. **子查询与联接**: 在某些情况下,子查询可以...

    mysql数据库的多表设计和各种查询(连接查询\子查询\联合查询\报表查询),以及数据库备份和恢复

    2. 子查询(Subquery):子查询是在一个查询语句中嵌套另一个查询,用于获取临时结果,然后这个结果被外部查询使用。子查询可以出现在SELECT、FROM或WHERE子句中。 3. 联合查询(UNION):联合查询用于合并两个或更...

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

    子查询常用来筛选满足特定条件的数据,或者在不知道如何联接两个表时提供临时结果集。 索引(Index)是数据库管理系统中的一个重要组成部分,用于快速查找记录。MySQL支持多种类型的索引,包括B-Tree、Hash、R-Tree...

    mysql嵌套查询和联表查询优化方法

    5. **减少子查询的重复执行**:如果子查询会被多次调用,尝试将其结果存储在一个临时表中,然后在后续查询中使用这个临时表。 6. **预处理数据**:在插入数据时,可以预先计算好某些字段,如上述示例中item的随机...

    dbmove_sql语句转化.zip_MYSQL_dbmove_oracle

    Oracle的物化视图在MySQL中没有直接对应的概念,可能需要通过创建临时表或定期更新的视图来实现类似功能。 10. **索引优化**: Oracle支持位图索引、函数索引等高级特性,MySQL则相对较简单,但也有覆盖索引、...

    mysql多表查询准备

    - 子查询通常用于复杂逻辑或临时数据集的构建,可以作为过滤条件,也可以在联接查询中作为源。 4. **联接条件与ON子句**: - 在JOIN操作中,ON子句用于指定连接两个表的条件,这通常是基于两个表中某个字段的等值...

    MySQL子查询示例数据库

    2. **在FROM子句中**:子查询可以作为一个临时表,供主查询操作。这在处理复杂的多表关系时非常有用。例如,用子查询获取每个部门的最高薪水: ```sql SELECT department, MAX(salary) FROM (SELECT department, ...

    MYSQL子查询和嵌套查询优化实例解析

    第二种方法是将子查询结果与主查询合并,形成一个JOIN操作,这样可以减少对主表的扫描次数,提高查询速度。 ``` SELECT ps.* FROM cdb_playsgame ps, (select ps1.uid, ps1.gametag, MAX(credits) as credits ...

    MySQL嵌套查询实例详解

    子查询可以作为FROM子句的一部分,或者在WHERE、HAVING、SELECT或HAVING子句中作为表达式。例如,创建一个名为t1的表,并插入数据后,我们可以进行嵌套查询来选择s1大于1的记录并计算sb3(s3的两倍): ```sql ...

    MySql实现跨表查询的方法详解

    除了JOIN和子查询,还有其他跨表查询技术,如自连接、临时表和存储过程等。自连接是将一个表与自身进行连接,通常用于处理层次结构或自我参照的数据。临时表是在会话期间创建的临时存储区域,用于中间计算或存储结果...

    【大厂面试题】史上最详细的一线大厂Mysql面试题详解及其答案MySQL执行计划及SQL优化

    【大厂面试题】史上最详细的一线大厂Mysql面试题详解MySQL执行计划及...执行子查询时,MYSQL需要创建临时表,查询完毕后再删除这些临时表,所以,子查询的速 度会受到一定的影响,这里多了一个创建和销毁临时表的过程。

    MySQL多表查询(四).pdf

    **子查询**可以在 `SELECT`、`INSERT`、`UPDATE` 或 `DELETE` 语句中使用,用来嵌套查询以获取更复杂的结果。 - 示例:查询部门人数最多的部门及其人数。 ```sql SELECT d.name, COUNT(e.id) AS employee_count ...

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

    5. **考虑使用临时表**:对于复杂的子查询,可以先将结果存入临时表,然后再进行后续操作。 6. **使用LIMIT优化**:如果只需要满足条件的第一条记录,可以使用LIMIT 1来减少查询开销。 通过理解子查询的工作原理并...

    mysql所有的查询语句详解

    子查询允许在一个查询内部嵌套另一个查询,用于获取临时结果集: ```sql SELECT * FROM table_name WHERE column IN (SELECT column FROM another_table WHERE condition); ``` 五、视图 视图是虚拟表,基于一个...

    使用案例加深对MySQL SQL查询理解

    有时,可以使用JOIN或临时表来替代子查询,从而提高性能。 此外,GROUP BY和HAVING子句用于分组和筛选数据,它们常与聚合函数(如COUNT、SUM、AVG等)一起使用。在处理大量数据时,合理地使用GROUP BY和HAVING可以...

    day_04MySQL多表&事务_docx1

    子查询是多表查询的另一个重要组成部分,它可以嵌套在主查询中,用于提供临时的结果集。子查询可以作为选择条件,也可以用于计算或过滤数据。例如,找出工资高于部门平均工资的员工: ```sql SELECT * FROM emp ...

Global site tag (gtag.js) - Google Analytics