【Oracle】一个SQL语法分析

时间:2022-10-13 15:01:48

一、源代码:

SELECT a.datatime, count(1) FROM (
SELECT TO_CHAR(d.datatime, 'yyyy-mm-dd hh24:mi') AS datatime
FROM DATA d WHERE 1 = 1
AND d.DATATIME > TO_DATE('2017-08-02', 'yyyy-mm-dd')
AND d.DATATIME < TO_DATE('2017-08-02 23:59', 'yyyy-mm-dd hh24:mi')
) a
GROUP BY a.datatime
ORDER BY a.datatime;

二、解析:

①count(1)表示只统计查询表里的第一列;第一是方便,第二是快,只扫描第一列。如果用count(※)则会扫描所有列;第三点事:如果下面有null,count(1)则不计入统计这一项结果;但是如果是count(*)则会统计;(这里的※就是后面的星号,MarkDown两个星号会变斜体)
②TO_CHAR是把日期或者数字变成字符串,不能指定字符串长度;
使用TO_CHAR处理日期的格式为:
TO_CHAR(number,‘格式format’),例如,上面的例子中用到的:

TO_CHAR(d.datatime, 'yyyy-mm-dd hh24:mi')

③WHERE 1 = 1是全真条件,为了让后面的AND都能顺利执行,如果不是1=1这样的全真条件,AND就会直接跟到WHERE后面去,就会报错;
把number类型的时间变成格式化的CHAR;
④TO_DATE是把CHAR类型的时间,便是DATE类型;

TO_CHAR(d.datatime, 'yyyy-mm-dd hh24:mi')
  1. 这里的月份是mm,Mysql中是MM,注意区别;
  2. 这里需要注意的是,hh24表示24小时制;而Mysql中hh表示12小时制,HH表示24小时制;
  3. 这里的分钟,也不是Mysql中的mm,而是mi;

⑤这里的习惯是datatime小写的时间是CHAR格式的,DATATIME是时间格式的时间;
⑥GROUP BY a.datatime
表示分组,按照时间分组
⑦ORDER BY a.datatime;
表示排序,按照时间来排序;
⑧最重要的一点是:这里是嵌套语句,一个里面套另一个;分开来看就行;