zoukankan      html  css  js  c++  java
  • MySQL的嵌套查询

    MySQL的嵌套查询

    最近在MySQL上做了点工作,发现很多人都在询问MySQL嵌套查询的问题,许多人都觉得MySQL不支持嵌套查询,其实MySQl从4.11版后已经完全支持嵌套查询了,那么下面我举些简单的嵌套查询的例子吧(源程序来自MySQL User Manual):

    1. SELECT语句的子查询:
    语法:     SELECT ... FROM (subquery) AS name ...

    先创建一个表:
    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);

    我们就可以进行以下的嵌套查询了:
    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排序的集合进行求均值是不能得到正确答案的:
    SELECT AVG(SUM(column1)) FROM t1 GROUP BY column1

    所以我们可以通过下面的嵌套查询实现同样的效果:
    SELECT AVG(sum_column1)
           FROM (SELECT SUM(column1) AS sum_column1
                 FROM t1 GROUP BY column1) AS t1;

    2.行的子查询(Row Subquery):
    看下面的例子:
    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用途及用法和在其他没有什么大的区别,我就简单举几个范例好了:

    范例一:      SELECT DISTINCT store_type FROM Stores
                        WHERE EXISTS (SELECT * FROM Cities_Stores
                                      WHERE Cities_Stores.store_type = Stores.store_type);
    范例二:   SELECT DISTINCT store_type FROM Stores
                           WHERE NOT EXISTS (SELECT * FROM Cities_Stores
                                       WHERE Cities_Stores.store_type = Stores.store_type);
    范例三:  这个例子中嵌套使用了Not Exist语法,稍微注意一下:
                   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.条件关联关系查询:
    解释起来麻烦,直接看例子吧:
    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.其他使用方法和注意:
    除了上面这些还有很多很多,不过就不去细讲了,因为这些跟别的数据库差不多,只是为了给大家一个参考,提提就够了。

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

    支持子查询的语法有:SELECT,INSERT,UPDATE,DELETE,SET和DO。

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

    文章来自 http://www.blogjava.net/chenpengyi

  • 相关阅读:
    PATA 1071 Speech Patterns.
    PATA 1027 Colors In Mars
    PATB 1038. 统计同成绩学生(20)
    1036. 跟奥巴马一起编程(15)
    PATA 1036. Boys vs Girls (25)
    PATA 1006. Sign In and Sign Out (25)
    读取web工程目录之外的图片并显示
    DOS命令
    java连接oracle集群
    servlet
  • 原文地址:https://www.cnblogs.com/asher/p/3634217.html
Copyright © 2011-2022 走看看