SQL内容小结

SQL一些常见的问题,这些就是坑,填坑的目的是以后不要再进坑。

01. SQL的执行顺序和语法顺序

    语法顺序:
        1.查询中用到的关键词主要包含六个,并且他们的顺序依次为 
            select--from--where--group by--having--order by 
        MySQL代码--执行顺序:
                    from... where...group by... having.... select ... order by...
        hive 语句执行顺序-大致顺序
                    from... where.... select...group by... having ... order by..
                hive语句和mysql都可以通过explain查看执行计划,这样就可以查看执行顺

02. MySQL的group by

对于group by在mysql中的使用和Oracle的差异性很大,准确的说不光和oracle和别的数据库差异性一样,这些有点不太遵循标准SQL。
我们知道常规的 sql,对于group by来说一定要结合聚合函数,而且选择的字段除了聚合函数外,还必须在group by中出现,否则报错,
但是在mysql中扩展了这样的功能
    首先对于不加聚合函数的sql来说,它的功能结合了limit来得出结果,仔细想想的时候有点Oracle分析函数的味道,limit的时候得到的并不是 最大最小的值,
    而是某一下group by结果集中第一行,也就是刚才说的相当与先group by, 然后在每个group by下面进行limit 1。

03. SQL中的数据类型以及数据类型的转换

    Cast(字段名 as 转换的类型 ),其中类型可以为:
    CHAR[(N)] 字符型 
    DATE  日期型
    DATETIME  日期和时间型
    DECIMAL  float型
    SIGNED  int
    TIME  时间型
Hive中
    Hive也包括隐式转换(implicit conversions)和显式转换(explicitly conversions)。
        SMALLINT类型的数据将会被隐式转换地转换为INT类型,任何整数类型都可以隐式地转换成一个范围更大的类型。
        TINYINT,SMALLINT,INT,BIGINT,FLOAT和STRING都可以隐式地转换成DOUBLE;
        是的你没看出,STRING也可以隐式地转换成DOUBLE!
        但是你要记住,BOOLEAN类型不能转换为其他任何数据类型!
    02.
        如果将浮点型的数据转换成int类型的,内部操作是通过round()或者floor()函数来实现的,而不是通过cast实现
        对于Date类型的数据,只能在Date、Timestamp以及String之间进行转换
        • 指定精度取整函数 : round
            语法: round(double a, int d)  返回值: DOUBLE 说明: 返回指定精度d的double类型
         • 向上取整函数 : ceiling 
            语法: ceiling(double a) 返回值: BIGINT 说明: 与ceil功能相同
        •正取余函数 : pmod
            语法: pmod(int a, int b),pmod(double a, double b) 返回值: int double 说明: 返回正的a除以b的余数
        最小值统计函数 : min       语法: min(col)    返回值: double 说明: 统计结果集中col字段的最小值

Hive 以及Mysql中,以下命令得到的结果是不一样的,所以对一定要明确数据的类型!!
      01. max  min   !!!***!!!
                select '800'  > '1000'  ;
                select cast('800' as  SIGNED ) > cast('1000' as SIGNED ) ;
                ##计算学生的课程数以及最大分数和最小分数等
                select  a.student,count( a.class), sum(a.score), min(a.score), max(a.score ), round(avg(a.score),3),  round(stddev(a.score),3)

        2. count(1) and count(字段)
        count
        count(1)统计的是结果集的总条数,
        count(字段名)统计的是该字段值不为null的总条数
        两者的主要区别是
            (1) count(1) 会统计表中的所有的记录数,包含字段为null 的记录
            (2)count(字段) 会统计该字段在表中出现的次数,许罗字段为null 的情况。即不统计字段为null 的记录。
    sum
            sum的时候null值就过滤了

04. Oracle中的一些概念

1.伪列
    Oracle系统为了实现完整的关系数据库功能,
    系统专门提供了一组称为伪列(Pseudocolumn)的数据库列,
    这些列不是在建立对象时由我们完成的,而是在我们建立时由Oracle完成的

        rowid 记录的唯一标识 
        rownum 限制查询结果集的数量--
                                            ROWNUM是对结果集加的一个伪列,
                                            即先查到结果集之后再加上去的一个列 (强调:先要有结果集)
                                            代表查询返回的行的编号
                                            rownum不支持>,>=,=,between...and,而都用<
        level   ---查询数据所对应的级

        oracle的伪表----dual 
    02. connect by level <=
        产生连续的值

05. Hive表的创建

01.SerDeSerialize/Deserilize的简称,目的是用于序列化和反序列化
02.hive中的NULL(hive空值处理)----NULL转化为空字符串--通过ROW FORMAT DELIMITED NULL DEFINED AS '' 
    如果没有指定 ROW FORMAT 或者 ROW FORMAT DELIMITED,将会使用自带的 SerDe
    行格式限定
    [ROW FORMAT row_format]
    [STORED AS file_format]
    [LOCATION hdfs_path]
    HIVE表中默认将NULL存为\N,文件中存储大量\N 这样造成浪费大量空间,NULL转化为空字符串

     FIELDS TERMINATED BY  '\t'  //声明文件分隔符
03.存储格式
    STORED AS
        |TEXTFILE
        | PARQUET
        | RCFILE  
        |SEQUENCEFILE
        | INPUTFORMAT input_format_classname OUTPUTFORMAT  output_format_classname
    例如:
        STORED AS INPUTFORMAT 
        'org.apache.hadoop.mapred.TextInputFormat' 
        OUTPUTFORMAT 
        'org.apache.hadoop.hive.ql.io.HiveIgnoreKeyTextOutputFormat'
    04. LOCATION 指定数据文件存放的地址,须是一个路径 ,不能指定单独的数据文件

06. SQL规范小结

1.层级清楚
    采用将SQL结构化表达
2.对表别名采取嵌套的方式的命名
    示例:
        第一层级:t1  t2
                第二层级:tt1  tt2
3.涉及引号的,使用单引号
4.注释说明的字段要和命令中的字段一一对应
5.恰当的使用字段的数据类型
6.注意小于等于号这些比较符号的使用      
2.SQL思路以及数据验证
        对数据量有个预估,第一次得到的数据量,和最终想要得到的数据量之间的关系。
                明确最终想要什么,然后不断调整思路

参考:

 hive高阶1--sql和hive语句执行顺序、explain查看执行计划、group by生成MR http://blog.csdn.net/longshenlmj/article/details/51569892
mysql中group by的时候字段不加聚合函数和distinct的情况 http://blog.csdn.net/wxwzy738/article/details/20636563
Count(*), Count(1) 和Count(字段)的区别: http://blog.csdn.net/fang_fang_2008/article/details/40422537

blogroll

social