加入收藏 | 设为首页 | 会员中心 | 我要投稿 湖南网 (https://www.hunanwang.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程 > 正文

10个简朴步调,完全领略SQL

发布时间:2019-06-04 00:50:34 所属栏目:编程 来源:IT技术圈
导读:多年前保藏在条记中的一篇文章,本日偶尔翻出,重读了一遍,依然大有收成。分享出来,各人一路切磋。 以本文是为了以下读者而专程编写的: 1、 在事变中会用到 SQL 可是对它并不完全相识的人。 2、 可以或许纯熟行使 SQL 可是并不相识其语法逻辑的人。 3、 想

尽量没有严酷的划定声名你何时应该行使 IN ,何时应该行使 EXISTS ,可是这些工作你照旧应该知道的:

  • IN比 EXISTS 的可读性更好
  • EXISTS 比IN 的表达性更好(更得当伟大的语句)

二者之间机能没有差别(但对付某些数据库来说机能差别会很是大) 由于行使 INNER JOIN 也能获得书名表中书所对应的作者信息,以是许多初学者机遇以为可以通过 DISTINCT 举办去重,然后将 SEMI JOIN 语句写成这样:

  1. -- Find only those authors who also have books 
  2. SELECT DISTINCT first_name, last_name 
  3. FROM author 
  4. JOIN book ON author.id = book.author_id 

这是一种很糟糕的写法,缘故起因如下:

  • SQL 语句机能低下:由于去重操纵( DISTINCT )必要数据库一再从硬盘中读取数据到内存中。
  • 这么写并非完全正确:尽量大概此刻这么写不会呈现题目,可是跟着 SQL 语句变得越来越伟大,你想要去重获得正确的功效就变得异常坚苦。

ANTI JOIN

这种毗连的相关跟 SEMI JOIN 恰恰相反。在 IN 可能 EXISTS 前加一个 NOT 要害字就能行使这种毗连。举个例子来说,我们列出版名内外没有书的作者:

  1. -- Using IN 
  2. FROM author 
  3. WHERE author.id NOT IN(SELECT book.author_id FROM book) 
  4.   
  5. -- Using EXISTS 
  6. FROM author 
  7. WHERE NOT EXISTS (SELECT 1 FROM book WHEREbook.author_id = author.id) 

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

CROSS JOIN

这个毗连进程就是两个毗连的表的乘积:即将第一张表的每一条数据别离对应第二张表的每条数据。我们之前见过,这就是逗号在 FROM 语句中的用法。在现实的应用中,很少有处所能用到 CROSS JOIN,可是一旦用上了,你就可以用这样的 SQL语句表达:

  1. -- Combine every author with every bookauthor CROSS JOIN book 

DIVISION DIVISION 简直是一个怪胎。简而言之,假如 JOIN 是一个乘法运算,那么 DIVISION 就是 JOIN 的逆进程。DIVISION 的相关很难用 SQL 表达出来,介于这是一个新手指南,表明 DIVISION 已经超出了我们的目标。

我们学到了什么?

学到了许多!让我们在脑海中再追念一下。 SQL 是对表的引用, JOIN 则是一种引用表的伟大方法。可是 SQL 说话的表达方法和现实我们所必要的逻辑相关之间是有区此外,并非全部的逻辑相关都能找到对应的 JOIN 操纵,以是这就要我们在平常多蕴蓄和进修相关逻辑,这样你就能在往后编写 SQL 语句中选择恰当的 JOIN 操纵了。

7、 SQL 中犹如变量的派生表

在这之前,我们进修到过 SQL 是一种声明性的说话,而且 SQL 语句中不能包括变量。可是你能写出相同于变量的语句,这些就叫做派生表:

说白了,所谓的派生表就是在括号之中的子查询:

  1. -- A derived table 
  2. FROM(SELECT * FROM author) 

必要留意的是有些时辰我们可以给派生表界说一个相干名(即我们所说的别名)。

  1. -- A derived table with an alias 
  2. FROM(SELECT * FROM author) a 

派生表可以有用的停止因为 SQL 逻辑而发生的题目。

举例来说:假如你想重用一个用 SELECT 和 WHERE 语句查询出的功效,这样写就可以(以 Oracle 为例):

  1. -- Get authors' first and last names, and their age in days 
  2. SELECT first_name, last_name, age 
  3. FROM( 
  4.  SELECT first_name, last_name, current_date- date_of_birth age 
  5.  FROM author 
  6. -- If the age is greater than 10000 days 
  7. WHEREage > 10000 

必要我们留意的是:在有些数据库,以及 SQL : 1990 尺度中,派生表被归为下一级——通用表语句( common table experssion)。这就应承你在一个 SELECT 语句中对派生表多次重用。

上面的例子就(险些)等价于下面的语句:

  1. WITH a AS( 
  2.  SELECT first_name, last_name, current_date- date_of_birth age 
  3.  FROM author 
  4. SELECT * 
  5. FROM a 
  6. WHERE age > 10000 

虽然了,你也可以给“ a ”建设一个单独的视图,这样你就可以在更普及的范畴内重用这个派生表了。

我们学到了什么?

我们重复夸大,概略上来说 SQL 语句就是对表的引用,而并非对字段的引用。要好好操作这一点,不关键怕行使派生表可能其他更伟大的语句。

8、 SQL 语句中 GROUP BY 是对表的引用举办的操纵

让我们再追念一下之前的 FROM 语句:

  1. FROM a, b 

此刻,我们将 GROUP BY 应用到上面的语句中:

  1. GROUP BY A.x, A.y, B.z 

(编辑:湖南网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

热点阅读