您的位置:首页 > 数据库

十步学习sql(看伯乐在线博客记载)

2017-06-08 09:49 155 查看
原博客地址:http://blog.jobbole.com/55086/

1. sql是一种声明语言

计算机会根据声明从数据库里选出你所想要的数据

2. sql的语法并不是按照语法顺序执行的

sql的语法顺序是:

select

from

where

group by

having

union

order by

但是sql的执行顺序是:

from

where

group by

having

select

distinct

union

order by

关于sql语句的执行顺序,有三个值得注意的地方:

1. from才是执行sql的第一步,表明第一步是将数据从硬盘加载到数据缓存区,以便对这些数据进行操作。

2. select 实在大部分语句之后才执行的,这就是为什么不能再where中使用select中设定别名的制度按作为判断条件的原因。

例:

select A.x + A.y AS z
from A
where z =10;   -- z在这里不可用,因为select是最后执行的语句


正确的语句表达为:

select A.x +A.y as z
from A
where (A.x +A.y)=10


SQL 的核心是对表的引用

思考问题的时候从表的角度来思考问题提,这样很容易理解数据如何在 SQL 语句的“流水线”上进行了什么样的变动。

灵活应用表会使sql语句变得强大

应用join来连接表。

sql语句中推荐是用表连接

尽量用join,少用逗号

SQL 语句中,表连接的方式从根本上分为五种:

EQUI JOIN

SEMI JOIN

ANTI JOIN

CROSS JOIN

DIVISION

EQUI JOIN

这是一种最普通的 JOIN 操作,它包含两种连接方式:

INNER JOIN(或者是 JOIN )

OUTER JOIN(包括: LEFT 、 RIGHT、 FULL OUTER JOIN)

SEMI JOIN

这种连接关系在 SQL 中有两种表现方式:使用 IN,或者使用 EXISTS。“ SEMI ”在拉丁文中是“半”的意思。这种连接方式是只连接目标表的一部分。这是什么意思呢?再想一下上面关于作者和书名的连接。我们想象一下这样的情况:我们不需要作者 / 书名这样的组合,只是需要那些在书名表中的书的作者信息。

尽管没有严格的规定说明你何时应该使用 IN ,何时应该使用 EXISTS ,但是这些事情你还是应该知道的:

IN比 EXISTS 的可读性更好

EXISTS 比IN 的表达性更好(更适合复杂的语句)

二者之间性能没有差异(但对于某些数据库来说性能差异会非常大)

因为使用 INNER JOIN 也能得到书名表中书所对
4000
应的作者信息,所以很多初学者机会认为可以通过 DISTINCT 进行去重,然后将 SEMI JOIN 语句写成这样:

SELECT DISTINCT first_name, last_name

FROM author

JOIN book ON author.id = book.author_id

这是一种很糟糕的写法,原因如下:

SQL 语句性能低下:因为去重操作( DISTINCT )需要数据库重复从硬盘中读取数据到内存中。(译者注: DISTINCT 的确是一种很耗费资源的操作,但是每种数据库对于 DISTINCT 的操作方式可能不同)。

这么写并非完全正确:尽管也许现在这么写不会出现问题,但是随着 SQL 语句变得越来越复杂,你想要去重得到正确的结果就变得十分困难。

ANTI JOIN

这种连接的关系跟 SEMI JOIN 刚好相反。在 IN 或者 EXISTS 前加一个 NOT 关键字就能使用这种连接。举个例子来说,我们列出书名表里没有书的作者:

MySQL

– Using IN

FROM author

WHERE author.id NOT IN (SELECT book.author_id FROM book)

– Using EXISTS

FROM author

WHERE NOT EXISTS (SELECT 1 FROM book WHERE book.author_id = author.id)

– Using IN

FROM author

WHERE author.id NOT IN (SELECT book.author_id FROM book)

– Using EXISTS

FROM author

WHERE NOT EXISTS (SELECT 1 FROM book WHERE book.author_id = author.id)

关于性能、可读性、表达性等特性也完全可以参考 SEMI JOIN。

CROSS JOIN

这个连接过程就是两个连接的表的乘积:即将第一张表的每一条数据分别对应第二张表的每条数据。我们之前见过,这就是逗号在 FROM 语句中的用法。

7. sql中如同变量的派生表

SELECT first_name, last_name, age
FROM (
SELECT first_name, last_name, current_date - date_of_birth age
FROM author
)


SQL语句中的group by是对表的引用进行的操作

SELECT A.x, A.y, SUM(A.z)
FROM A
GROUP BY A.x, A.y


SQL 语句中的 SELECT 实质上是对关系的映射

SELECT 语句可能是 SQL 语句中最难的部分了,尽管他看上去很简单。其他语句的作用其实就是对表的不同形式的引用。而 SELECT 语句则把这些引用整合在了一起,通过逻辑规则将源表映射到目标表,而且这个过程是可逆的,我们可以清楚的知道目标表的数据是怎么来的。

想要学习好 SQL 语言,就要在使用 SELECT 语句之前弄懂其他的语句,虽然 SELECT 是语法结构中的第一个关键词,但它应该是我们最后一个掌握的。

10.SQL 语句中的几个简单的关键词: DISTINCT , UNION , ORDER BY 和 OFFSET
集合运算( DISTINCT 和 UNION )

排序运算( ORDER BY,OFFSET…FETCH)

集合运算( set operation):

集合运算主要操作在于集合上,事实上指的就是对表的一种操作。从概念上来说,他们很好理解:

DISTINCT 在映射之后对数据进行去重

UNION 将两个子查询拼接起来并去重

UNION ALL 将两个子查询拼接起来但不去重

EXCEPT 将第二个字查询中的结果从第一个子查询中去掉

INTERSECT 保留两个子查询中都有的结果并去重

排序运算( ordering operation):

排序运算跟逻辑关系无关。这是一个 SQL 特有的功能。排序运算不仅在 SQL 语句的最后,而且在 SQL 语句运行的过程中也是最后执行的。使用 ORDER BY 和 OFFSET…FETCH 是保证数据能够按照顺序排列的最有效的方式。其他所有的排序方式都有一定随机性,尽管它们得到的排序结果是可重现的。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: