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

来源:互联网 发布:nginx日志级别 编辑:程序博客网 时间:2024/05/16 07:48

原博客地址: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 zfrom Awhere z =10;   -- z在这里不可用,因为select是最后执行的语句

正确的语句表达为:

select A.x +A.y as zfrom Awhere (A.x +A.y)=10
  1. SQL 的核心是对表的引用
    思考问题的时候从表的角度来思考问题提,这样很容易理解数据如何在 SQL 语句的“流水线”上进行了什么样的变动。
  2. 灵活应用表会使sql语句变得强大
    应用join来连接表。
  3. sql语句中推荐是用表连接
    尽量用join,少用逗号
  4. 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 也能得到书名表中书所对应的作者信息,所以很多初学者机会认为可以通过 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, ageFROM (  SELECT first_name, last_name, current_date - date_of_birth age  FROM author)
  1. SQL语句中的group by是对表的引用进行的操作
SELECT A.x, A.y, SUM(A.z)FROM AGROUP BY A.x, A.y
  1. 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 是保证数据能够按照顺序排列的最有效的方式。其他所有的排序方式都有一定随机性,尽管它们得到的排序结果是可重现的。

原创粉丝点击