很多程序员认为SQL是一头难以驯服的野兽。它是为数不多的声明性语言之一,也因为这样,其展示了完全不同于其他的表现形式、命令式语言、 面向对象语言甚至函数式编程语言(虽然有些人觉得SQL 还是有些类似功能)。
我每天都写SQL,我的开源软件JOOQ中也包含SQL。因此我觉得有必要为还在为此苦苦挣扎的你呈现SQL的优美!下面的教程面向于:
已经使用过但没有完全理解SQL的读者
已经差不多了解SQL但从未真正考虑过它的语法的读者
想要指导他人学习SQL的读者
本教程将重点介绍SELECT 语句。其他 DML 语句将在另一个教程中在做介绍。接下来就是…
1、SQL是声明性语言
首先你需要思考的是,声明性。你唯一需要做的只是声明你想获得结果的性质,而不需要考虑你的计算机怎么算出这些结果的。
SELECT first_name, last_name FROM employees WHERE salary > 100000
这很容易理解,你无须关心员工的身份记录从哪来,你只需要知道谁有着不错的薪水。
从中我们学到了什么呢?
那么如果它是这样的简单,会出现什么问题吗?问题就是我们大多数人会直观地认为这是命令式编程。如:“机器,做这,再做那,但在这之前,如果这和那都发生错误,那么会运行一个检测”。这包括在变量中存储临时的编写循环、迭代、调用函数,等等结果。
把那些都忘了吧,想想怎么去声明,而不是怎么告诉机器去计算。
2、SQL语法不是“有序的”
常见的混乱源于一个简单的事实,SQL语法元素并不会按照它们的执行方式排序。语法顺序如下:
SELECT [DISTINCT] FROM WHERE GROUP BY HAVING UNION ORDER BY |
为简单起见,并没有列出所有SQL语句。这个语法顺序与逻辑顺序基本上不同,执行顺序如下:
FROM WHERE GROUP BY HAVING SELECT DISTINCT UNION ORDER BY |
这有三点需要注意:
1、第一句是FROM,而不是SELECT。首先是将数据从磁盘加载到内存中,以便对这些数据进行操作。
2、SELECT是在其他大多数语句后执行,最重要的是,在FROM和GROUP BY之后。重要的是要理解当你觉得你可以从WHERE语句中引用你定义在SELECT语句当中的时候,。以下是不可行的:
SELECT A.x + A.y AS z
FROM A
WHERE z = 10 -- z is not available here!