MySQL(二):逻辑查询

CREATE TABLE t(

a CHAR(5)

)ENGINE=INNODB;

INSERT INTO t(a) VALUES(‘a’),(NULL),(‘b’),(‘c’),(NULL);

SELECT * FROM t ORDER BY a;

//这也是一个小技巧,当想使用GROUP BY后,想统计各个组/块的数量,可以使用COUNT(1)

SELECT a,COUNT(1) FROM t GROUP BY a;

MySQL(二):逻辑查询_第1张图片

结果如上,很清楚可以看到order by会把值为null的排在一起,而GROUP BY会把NULL的规划在同一块上,也就证明了NULL = NULL。

所以Mysql判断逻辑会有三种表达式,TRUE、FALSE、UNKNOWN(UNKNOWN是根据情况为TRUE或者为FALSE)。

因此在产生虚拟表VT2时,会增加一个额外的列来表示ON过滤条件的返回值,返回值有TRUE、FALSE、UNKNOWN,会取出比较值为TRUE的记录,然后产生虚拟表VT2。

3、添加外部行

这一步只有在连接类型为OUTER JOIN时才会发生(因为只有发生外联结匹配的时候),比如LEFT OUTER JOIN、RIGHT OUTER JOIN、FULL OUTER JOIN。在很多时候,我们可以将OUTER关键字省略掉,但OUTER其实代表的就是外部行,LEFT OUTER JOIN把左表记为保留表,RIGHT OUTER JOIN把右表记为保留表,而FULL OUTER JOIN就是把左右表都记为保留表。

添加外部行的工作就是在VT2表的基础上添加保留表中被过滤条件过滤掉的数据,非保留表中的数据被赋予NULL值,最后生成虚拟表VT3。

4、应用WHERE过滤器

对上一步骤产生的虚拟表VT3进行WHERE条件过滤,只有符合的记录才会输出到虚拟表VT4中。

在当前应用WHERE过滤器时,有两种过滤是不被允许的。

  • 由于数据还没有分组,因此现在还不能在WHERE过滤器中使用,这类对统计的过滤,这也是因为顺序问题,聚合函数&#x

你可能感兴趣的:(程序员,mysql,android,数据库)