SQL编程也同Java和Python一样,都应该有较为标准的规范

        今天的博文不会讲sql技巧,而是从我们的根源出发,从我们自己的编程习惯出发,就像我们以前学习JAVA和PYTHON一样,都有自己的规范,虽然说SQL还不是被大多数人所看重,但是我们也要有自己的SQL规范。

        下面会从多个角度进行讲解SQL的规范

注释:

        注释也是一个比较有争议的话题,可能有人认为,你们这些臭写SQL的还需要注释呀,其实不然,就算不是SQL,用其他的语言也要写注释。毕竟项目不是一个人做的,是沟通交流的,如果我们偏要按照自己的来,会给其它的伙伴带来阅读上的困难。

  SQL中的注释有两种

-- 单行注释 -- 
从 SomeTable 中查询 col_1 SELECT col_1 FROM SomeTable;



/* --多行注释 --
从someTable 中查询col_1 SELECT col_1 FROM SomeTable;

        我们有单行和多行注释,多行注释就像我们写JAVA时的注释

缩进:

        提到缩进,如果为了整体的美观,缩进是必不可少的,就像python,强制的缩进。如果没有缩进,代码一团糟,看上去一大片,换做是我,我就当场不想看了。下面来介绍一下SQL中的缩进

--好的示例 
select col_1, col_2, col_3 From tbl_A where col_1 = "哈哈"



--不好的示例
 select col_1,col_2,col_3 from tbl_A where col = "哈哈"

        很明显,看到上面那个,我就感觉我能看下去,看到下面那个,我就无语了。虽然有点打脸,但我还是要说一下,我就是第二种的那个。要啥就往一行里面放,不管你有多少,我就一行。需要改改这个毛病了

空格 :

        说到空格,我就想到了java.

                a=2

                a = 2

        上面两个肯定是下面更好拉,再java里面我就是选择的下面那个,这样我们的代码很整洁。不至于让我们看一样看不清。

-- √好的示例
SELECT col_1
  FROM  tbl_A A, tbl_B B
 WHERE ( A.col_1 >= 100 OR A.col_2 IN ( 'a', 'b' ) )
   AND A.col_3 = B.col_3;



-× 坏的示例
SELECT col_1
  FROM tbl_A A,tbl_B B
 WHERE (A.col_1>=100 OR A.col_2 IN ('a','b'))
   AND A.col_3=B.col_3;

        不得不说,看了上面两个代码,我们看到最后一行,加上空格的时候,我们很明显的知道是两个字段的比较,可以很容易的区分要素。到了下面,稍不留神就会看错了。以为是一个要素。

大小写:

        说到大小写,真的很重要。先让大家看一下博主平时的sql

select t.a,min(case when t.rn = 2 then c else null end) min_c,
max(case when t.nn = 2 then c else null end) max_c
from (select a,b,c,row_number() over(partition by a order by b) rn,
row_number() over(partition by a order by b desc) nn
from test_1) t
where t.rn = 2 or t.nn = 2
group by t.a

        要不是SQL中的关键字和函数都有颜色提示,还能看出来。

        这个我要是整理到hive命令行里面,我那要是出错了,都不容易看出来。每次出错都要看老半天,要是我在idea远程连接hive。那么最起码关键字会有颜色提示,也不至于命令行清一色的黑色字体。

        下面,我们加上大小写

-- √大小写有区分,易读
SELECT col_1, col_2, col_3,
       COUNT(*)
  FROM tbl_A
 WHERE col_1 = 'a'
   AND col_2 = ( SELECT MAX(col_2)
  FROM tbl_B
 WHERE col_3 = 100 )
 GROUP BY col_1, col_2, col_3;

赏心悦目,没的说

逗号:

        博主写sqL的时候,习惯“col_,col_2,col_3”先写xol_1再写逗号再写下面的。但是有时候删除一个字段的话,可能会忘记删除逗号,这样导致报错。后来,博主更改了格式。

--以前的习惯 

select a,b,c,d from t 
--现在的习惯
 SELECT     a
         ,  b 
         ,  c 
   FROM t

这种前置逗号有两个好处

删除c字段的时候,顺带就删除了逗号

每个逗号都出现在同一列,满足了强迫症患者

不使用通配符

不使用通配符,指的是不用*。我们用select *来获取所有的列,但是我们 并不是真的需要所有的列,应该需要什么我们就写什么。

order by中不使用列编号

ORDER BY 子句中,我们可以使用列的编号代替实际的列名,作为

排序的列来使用。在动态生成 SQL 等情况下,这是很有用的功能,但是

这样的代码可读性很不好

× 
SELECT col_1, col2 
FROM SomeTable 
ORDER BY 1, 2; 

√ 
SELECT col_1, col2 
FROM SomeTable 
ORDER BY col_1, col2;

总结;

有一个良好的编程习惯,不仅对我们好,也对他人的阅读好。

利人利己,让自己有一个好的印象。

不能一提到咱的名字,啊,那个谁谁谁就他每次不写注释,就他的编程格式最让人无语。都不想看他写的代码。