10个简单步骤全面理解SQL

1、 在工作中会用到 SQL 但是对它并不完全了解的人。2、 能够熟练使用 SQL 但是并不了解其语法逻辑的人。3、 想要教别人 SQL 的人。我们从哪儿学习到

很多朋友对于10个简单步骤全面理解SQL和不太懂,今天就由小编来为大家分享,希望可以帮助到大家,下面一起来看看吧!

如果SQL语言如此简单,那么是什么让人们“对SQL感到兴奋”呢?

主要原因是我们下意识地按照命令式编程的思维方式来思考问题。就像这样:“计算机,先执行这一步,然后执行那一步,但在此之前检查条件A 和条件B 是否满足。”比如使用变量传递参数、使用循环语句、迭代、调用函数等都是这种命令式编程的思维习惯。

2. SQL语法不按语法顺序执行。

SQL语句有一个让大多数人感到困惑的特点:SQL语句的执行顺序与其语句的语法顺序不一致。 SQL语句的语法顺序为:

SELECT[DISTINCT]FROMWHEREGROUP BYHAVINGUNIONORDER BY 为了方便理解,上面没有列出所有的SQL语法结构,但足以说明SQL语句的语法顺序与其执行顺序完全不同。以上面的语句为例,其执行顺序为:

FROMWHEREGROUP BYHAVINGSELECTDISTINCTUNIONORDER BY 关于SQL语句的执行顺序,有三点值得我们注意:

1、FROM是SQL语句执行的第一步,而不是SELECT。数据库执行SQL语句的第一步就是将数据从硬盘加载到数据缓冲区中以便进行操作。 2. SELECT 在大多数语句执行完毕后执行。严格来说是在FROM和GROUP BY之后执行的。理解这一点非常重要,这就是为什么不能在WHERE 中使用在SELECT 中别名的字段作为条件。 SELECT A.x + A.y AS z FROM A WHERE z=10 — z 在这里不可用,因为SELECT 是最后执行的语句!如果您想重用别名z,您有两个选择。或者重写z 表示的表达式:

SELECT A.x + A.y AS z FROM A WHERE (A.x + A.y)=10 或诉诸派生表、通用数据表达式或视图以避免别名重用。

3. 无论是语法还是执行顺序,UNION 始终排在ORDER BY 之前。很多人认为每个UNION段都可以使用ORDER BY进行排序,但根据SQL语言标准以及各个数据库中SQL的实现差异,事实并非如此。虽然有些数据库允许SQL语句对子查询或派生表进行排序,但这并不意味着排序会保持UNION操作后的排序顺序。注意:并非所有数据库都以相同的方式解析SQL 语句。例如,MySQL、PostgreSQL 和SQLite 将不会执行上述第二点中提到的操作。我们学到了什么?

既然并非所有数据库都以上述方式执行SQL,那么我们得到了什么?

我们的要点是永远记住:SQL 语句的语法顺序与其执行顺序不一致,这样我们就可以避免常见的错误。如果你能记住SQL语句的语法顺序和执行顺序之间的区别,你就可以轻松理解一些非常常见的SQL问题。

当然,如果一种语言被设计成使得语法顺序直接反映其语句的执行顺序,那么这种语言对于程序员来说是非常友好的。这种编程语言层面的设计理念被微软应用到了LINQ语言中。

3. SQL语言的核心是表引用。

由于SQL语句的语法顺序和执行顺序的差异,很多同学认为SELECT中的字段信息才是SQL语句的核心。其实真正的核心在于对表格的引用。

根据SQL标准,FROM语句定义为:

from 子句:=FROM 表引用[ { 逗号表引用}. ] FROM 语句的“输出”是一个联合表,该联合表由特定维度上所有引用表的并集产生。我们慢慢分析一下:

FROM a, b 上面FROM语句的输出是一个联合表,它将表a和表b连接起来。如果a表有3个字段,b表有5个字段,则“输出表”有8个(=5+3)个字段。

这个联合表中的数据是a*b,是a和b的笛卡尔积。换句话说,a表中的每一条数据都必须与b表中的每一条数据配对。如果a表有3条数据,b表有5条数据,那么联表就有15(=5*3)条数据。

FROM输出的结果经过WHERE语句的过滤,并经过GROUP BY语句的处理,形成新的输出结果。

如果我们从集合论(关系代数)的角度来看,数据库表就是一组数据元素关系的集合,每条SQL语句都会改变一个或几个关系,从而产生新的数据元素关系。 (即生成一个新表)。

我们学到了什么?

在思考问题时,从表的角度思考问题,这样就很容易理解SQL语句的“管道”上数据是如何变化的。

10个简单步骤全面理解SQL

4、灵活的表引用可以让SQL语句更加强大

灵活引用表使SQL语句更加强大。一个简单的例子是JOIN 的使用。

严格来说,JOIN语句不是SELECT的一部分,而是一种特殊的表引用语句。

SQL语言标准中表的连接定义如下:

表引用:=表名称|派生表|连接表以前面的示例为例:

FROM a, ba 可能会产生以下连接:

a1 JOIN a2 ON a1.id=a2.id 放在前面的例子中就变成:

FROM a1 JOIN a2 ON a1.id=a2.id, b 虽然使用逗号将连接表与另一个表连接起来并不常见,但您可以这样做。结果是最终输出表有a1+a2+b字段。

派生表在SQL语句中的应用甚至比表连接更强大,我们下面会讲到。

我们学到了什么?

在思考问题的时候,从表引用的角度出发,这样就很容易理解SQL语句是如何处理数据的,也可以帮助你理解那些复杂的表引用是做什么的。

更重要的是,了解JOIN 是用于构建连接表的关键字,而不是SELECT 语句的一部分,这一点很重要。某些数据库允许在INSERT、UPDATE 和DELETE 中使用JOIN。

5、建议在SQL语句中使用表连接

我们先看一下这句话:

FROM a, b 高级SQL程序员可能会给你建议:尽量不要用逗号代替JOIN来连接表。这将提高SQL 语句的可读性并避免一些错误。使用逗号来简化SQL 语句有时会引起混乱。想想下面的陈述:

从a, b, c, d, e, f, g, h 哪里a.a1=b.bxAND a.a2=c.c1AND d.d1=b.bc– 等等.我们可以很容易地看到使用JOIN 语句的好处是: 安全性。 JOIN 与正在连接的表非常接近,从而避免了错误。

对于更多的连接方式,JOIN语句可以区分外连接和内连接等。

我们学到了什么?

记住尽量使用JOIN来连接表,千万不要在FROM后面使用逗号来连接表。

6、SQL语句中不同的连接操作

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

EQUI JOINSEMI JOINANTI JOINCROSS JOINDIVISIONEQUI JOIN是最常见的JOIN操作,它包括两种连接方式:

10个简单步骤全面理解SQL

内连接(或连接)

外连接(包括:左、右、全外连接)

通过一个例子最容易说明这种差异:

— 此表引用包含作者及其书籍。– 每本书及其作者都有一条记录。– 不包括没有书籍的作者author JOIN book ON writer.id=book.author_id– 此表引用包含作者和他们的书- 每本书及其作者都有一条记录。 – .或者没有书的作者有一个“空”记录- (“空”意味着所有书列都是NULL)author LEFTOUTER JOIN book ON writer.id=book.author_idSEMI JOIN

SQL中有两种方式表达这种连接关系:使用IN,或者使用EXISTS。 “SEMI”在拉丁语中的意思是“一半”。该连接方法仅连接目标表的部分内容。这意味着什么?

IN比EXISTS更具可读性EXISTS比IN更具表现力(更适合复杂语句) SQL语句性能低:因为重复数据删除操作(DISTINCT)需要数据库反复将数据从硬盘读取到内存中。这并不完全正确:虽然现在可能不会引起问题,但随着SQL 语句变得越来越复杂,您很难在不重复的情况下获得正确的结果。反连接

交叉连接

这个连接过程是两个连接表的产物:第一个表中的每条数据对应第二个表中的每条数据。我们之前已经见过这一点,这就是在FROM 语句中使用逗号的方式。在实际应用中,CROSS JOIN很少使用,但是一旦使用,可以使用这样的SQL语句:

— 将每个作者与每个书作者结合起来CROSS JOIN bookDIVISION DIVISION 确实是一个怪胎。简而言之,如果JOIN 是乘法运算,那么DIVISION 就是JOIN 的逆运算。 DIVISION的关系很难用SQL表达。由于这是初学者指南,解释除法超出了我们的目的。

我们学到了什么?

学到了很多!让我们再次在脑海中回想一下。 SQL是对表的引用,JOIN是引用表的复杂方式。但是SQL语言的表达和我们实际需要的逻辑关系是有区别的。并不是所有的逻辑关系都能找到对应的JOIN操作,所以这就需要我们在日常生活中积累和学习更多的关系逻辑,以便你在以后编写SQL语句时能够选择合适的JOIN操作。

7、像SQL中的变量一样派生表

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

— 派生表FROM(SELECT * FROM 作者) 需要注意的是,有时我们可以为派生表定义一个相关的名称(我们称之为别名)。

— 带有别名的派生表FROM(SELECT * FROM 作者) 派生表可以有效避免SQL逻辑带来的问题。

例如:如果想复用SELECT和WHERE语句的查询结果,可以这样写(以Oracle为例):

— 获取作者的名字和姓氏,以及年龄(以天为单位)SELECT first_name, last_name,ageFROM( SELECT first_name, last_name, current_date- date_of_birthage FROMauthor)– 如果年龄大于10000 天WHEREage 10000 我们需要注意的事项是:在某些数据库中,以及在SQL:1990标准中,派生表被归类为下一级——公共表语句(common table exprossion)。这允许您在SELECT 语句中多次重用派生表。

上面的例子(几乎)相当于下面的语句:

WITH a AS( SELECT First_name, Last_name, current_date- date_of_birth Age FROMauthor)SELECT *FROM aWHERE Age 10000 当然,你也可以为“a”创建一个单独的视图,这样你就可以在更广泛的范围内重用它的派生表。

我们学到了什么?

我们一再强调,一般来说,SQL语句是对表的引用,而不是字段的引用。要利用这一点,不要害怕使用派生表或其他更复杂的语句。

8. SQL 语句中的GROUP BY 对表引用进行操作。

10个简单步骤全面理解SQL

让我们回想一下之前的FROM 语句:

FROM a, b 现在,我们将GROUP BY 应用于上面的语句:

GROUP BY A.x, A.y, B.z 上述语句的结果是生成对包含三个字段的新表的引用。我们仔细理解这句话:当应用GROUP BY时,SELECT后不使用聚合函数的列将出现在GROUP BY后。 (译者注:原文大致意思是“当你使用GROUP BY时,你可以进行下一级逻辑操作的列数将会减少,包括SELECT中的列”)。需要注意的是,其他字段可以使用聚合函数:

SELECT A.x, A.y, SUM(A.z)FROM AGROUP BY A.x, A.y 还有一点值得注意的是,MySQL 并不遵守这个标准,这确实很令人困惑。 (译者注:这并不是说MySQL没有GROUP BY功能)但是不要被MySQL愚弄了。 GROUP BY 改变了引用表的方式。您可以在SELECT 中引用字段并将其分组到GROUP BY 中,如下所示。

我们学到了什么?

GROUP BY 再次对表的引用进行操作,并将其转换为新的引用方法。

9. SQL语句中的SELECT本质上是关系的映射

我个人更喜欢“映射”这个词,尤其是在关系代数中使用时。 (译者注:原词是projection,这个词有两个意思,第一个意思是预测、规划、设计,第二个意思是投影、映射。经过反复考虑,我认为这里用映射可以更直观。来表达SELECT的功能)。一旦建立了对表的引用,就可以通过修改和转换将其逐步映射到另一个模型。

SELECT 语句就像一个“投影仪”。我们可以将其理解为将源表中的数据按照一定的逻辑转换为目标表中的数据的函数。

通过SELECT语句,可以对各个字段进行操作,通过复杂的表达式生成所需的数据。

SELECT 语句有许多特殊规则。至少您应该熟悉以下内容:

只能使用那些可以通过表引用获取的字段;如果有GROUP BY语句,则只能使用GROUP BY语句后面的字段或聚合函数;当你的语句中没有GROUP BY时,可以使用打开的窗口函数代替聚合函数;当你的语句中没有GROUP BY时,不能同时使用聚合函数和其他函数;有一些方法可以将普通函数封装在聚合函数中;一些更复杂的规则就足够了另写一篇文章。例如:为什么不能在没有GROUP BY 的SELECT 语句中同时使用普通函数和聚合函数? (以上第4 点)

原因如下:

直观上,这种方法没有逻辑意义。如果直觉不能说服你,语法肯定能说服你。 SQL : 1999 标准引入了GROUPING SETS,SQL:2003 标准引入了组集: GROUP BY()。每当语句中出现聚合函数并且没有显式GROUP BY 语句时,就会将不明确的空GROUPING SET 应用到SQL。因此,原有的逻辑顺序规则被打破,映射(即SELECT)关系首先会影响逻辑关系,其次影响语法关系。 (译者注:这一段原文比较难,但可以简单理解为:在一条同时有聚合函数和普通函数的SQL语句中,如果没有GROUP BY进行分组,那么SQL语句就会将聚合函数默认将整个表作为一组进行聚合统计,引用的表中的每条记录都失去了意义,使用其他函数进行统计是没有意义的。此时的每条记录)。使困惑?是的,我也是。让我们回过头来看一些更简单的事情。

我们学到了什么?

SELECT 语句可能是SQL 语句中最困难的部分,尽管它看起来很简单。其他语句的功能实际上是对表的不同形式的引用。 SELECT 语句将这些引用集成起来,并通过逻辑规则将源表映射到目标表。而且这个过程是可逆的,我们可以清楚地知道目标表中的数据是怎么来的。

如果想学好SQL语言,在使用SELECT语句之前必须了解其他语句。虽然SELECT是语法结构中的第一个关键字,但它应该是我们掌握的最后一个。

10、SQL语句中的几个简单关键字:DISTINCT、UNION、ORDER BY和OFFSET

学习完复杂的SELECT 之后,我们来看一些简单的:

集合操作(set operation):集合操作的主要操作是对集合的操作。其实就是指对表的操作。从概念上讲,它们很容易理解:

DISTINCT 对映射后的数据进行去重UNION 连接两个子查询并去重UNION ALL 连接两个子查询而不去重EXCEPT 从第一个子查询中删除第二个子查询中的结果INTERSECT 保留两个子查询的结果并删除排序操作:

用户评论

10个简单步骤全面理解SQL
满心狼藉

我一直在想办法学习 SQL,看到这个标题感觉真棒!终于有人可以帮我把这复杂的东西讲清楚了。一定要收藏一下,等我有时间好好看看这些步骤。

    有15位网友表示赞同!

10个简单步骤全面理解SQL
焚心劫

十个步骤就能完全理解 SQL?听起来简直太不切合实际了!SQL 这玩意儿可是精美的怪物,光语法就让人头疼不已,哪有那么容易懂的呀!

    有13位网友表示赞同!

10个简单步骤全面理解SQL
殃樾晨

其实没觉得 SQL 太难,只要你用心去看每一句指令,慢慢体味它的逻辑就可以了。我当年也是一步步摸索出来的,现在终于可以用 SQL 做一些简单的开发啦!这篇文章看起来很全面的样子,要仔细学习一下。

    有13位网友表示赞同!

10个简单步骤全面理解SQL
单身i

我一直认为 SQL 比其他数据库语言容易得多,因为它更像是一种编程语句,很容易理解。当然难度还是取决于你的实际应用场景和数据规模。 不过这篇文章肯定会有很多实用技巧和建议,值得一看!

    有20位网友表示赞同!

10个简单步骤全面理解SQL
凉城°

我之前看过一些 SQL 教程,感觉都太复杂了,总是充满了 obscure 的语法和概念。希望这篇博文能用更通俗易懂的方式讲解,能让像我这种初学者也能轻松入门!🤞

    有19位网友表示赞同!

10个简单步骤全面理解SQL
烟花巷陌

学习任何新技术都需要坚持和耐心,不能急于求成。 就算这篇文章真的能让你快速理解 SQL,也要不断练习和积累经验。毕竟 SQL 用得越久你才能真正理解它的奥妙之处!👍

    有13位网友表示赞同!

10个简单步骤全面理解SQL
桃洛憬

我之前一直用的是一些 ORM 库开发数据库操作,觉得太依赖了,这次决定深入学习 SQL 本身,以便更全面的掌握数据库技术。 这篇文章正好可以帮到我了,谢谢分享!💯

    有16位网友表示赞同!

10个简单步骤全面理解SQL
将妓就计

十个步骤听起来确实简单,可实际执行起来难不难? 文章内容能否清晰地解释每个步骤的细节和操作方法才是关键吧! 期待详细教程!😎

    有17位网友表示赞同!

10个简单步骤全面理解SQL
命里缺他

这个标题太吸引人了!我对编程一直很感兴趣,最近也想学习 SQL ,这篇博文刚好能帮我开启这一段旅程。 祝作者写出更多好文章!🎉

    有18位网友表示赞同!

10个简单步骤全面理解SQL
不离我

我觉得SQL学习曲线并不陡峭,只要掌握了基本的语法规则和操作技巧很容易上手。这篇文章正好可以作为入门指南,推荐给想学习SQL的朋友们! 👍

    有11位网友表示赞同!

10个简单步骤全面理解SQL
江山策

我很认同数据库技术的重要性! 学习 SQL 能够提升我的开发能力,让我能更有效地管理数据。期待文章能深入讲解每个步骤,并分享一些实用例子!

    有17位网友表示赞同!

10个简单步骤全面理解SQL
﹎℡默默的爱

对于初学者来说,掌握 SQL 的基础语法非常重要。 这篇文章能否从基础入门开始讲解呢? 详细解释 JOIN 、 WHERE 等常用语句的用法, 这样更有帮助!

    有18位网友表示赞同!

10个简单步骤全面理解SQL
冷嘲热讽i

学习 SQL 主要看个人理解和实践能力。这篇文章虽然提供了一些步骤,但最终还是需要自己动手操作才能真正理解 SQL 的精髓! 👍

    有13位网友表示赞同!

10个简单步骤全面理解SQL
ヅ她的身影若隐若现

我一直认为学习数据库技术很重要,它不仅可以提高我的开发效率,还能让我更好地了解数据的运作机制。希望这篇博文能给我带来一些启发!💡

    有9位网友表示赞同!

10个简单步骤全面理解SQL
太易動情也是罪名

我觉得学习 SQL 最重要的是要多做练习才能提升 proficiency。 这篇文章的步骤虽然不错,但效果更取决于自己实际的操作和思考。 希望能附带一些代码示例让我参考!

    有16位网友表示赞同!

10个简单步骤全面理解SQL
余笙南吟

看到这个标题感觉挺欣喜的,我一直想学习 SQL 来处理一些数据分析任务,这样能让我对数据有更深入的理解。 文章一定要详细讲解每个步骤,希望能教会我如何写出高效的SQL语句!🔥

    有17位网友表示赞同!

10个简单步骤全面理解SQL
怀念·最初

这篇文章提供的 10个步骤听起来有吸引力,我觉得 学习 SQL 的过程中, 掌握数据库设计和优化技巧同样重要。 希望作者能在这方面也给予一些指导。💯

    有9位网友表示赞同!

原创文章,作者:小su,如若转载,请注明出处:https://www.sudun.com/ask/121588.html

(0)
小su's avatar小su
上一篇 2024年9月1日 下午2:44
下一篇 2024年9月1日 下午2:49

相关推荐

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注