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;
总结;
有一个良好的编程习惯,不仅对我们好,也对他人的阅读好。
利人利己,让自己有一个好的印象。
不能一提到咱的名字,啊,那个谁谁谁就他每次不写注释,就他的编程格式最让人无语。都不想看他写的代码。