20分钟入门 SQL

每个Web开发人员都应该了解SQL。尽管它自20世纪70年代就已经存在,但仍被广泛使用,没有它,您将无法构建严肃的应用程序。大多数全栈框架都具有用于处理 SQL 复杂性的库- ActiveRecord,Doctrine,Hibernate 等。但是通常您需要动手编写低级 SQL。

这就是为什么我们准备了有关SQL基础知识的简短介绍。在本文中,您将找到我们的交互式编辑器,用于编写和执行代码。不要害怕尝试它们并尝试完成奖励任务。

让我们开始!

1.创建表

在SQL中创建新表时,将CREATE TABLE调用该语句。它期望将表中我们想要的所有列及其数据类型作为参数。

在这里,我们正在创建一个简单的表,称为months。它由3列组成:

这是各个SQL的样子:

    
      CREATE TABLE months (id int, name varchar(10), days int);
    
    
同样,在创建表时,建议向其中一列添加主键。这将有助于保持条目的唯一性,并加快选择查询的速度。在本课程中,我们不会涉及它们,但是您可以在此处阅读有关它们的信息。

2.插入行

现在,让我们用几行信息填充月份。通过该INSERT语句将条目添加到表中。有两种不同的使用方式:

第一种方法不指定要在其中插入数据的列名,它仅期望值并将其留给开发人员以正确的顺序提供所有数据。

      
        INSERT  INTO  月 VALUES(1,'月',31);
      
    

上面的内容比较短,但是存在一个主要问题-如果以后再添加其他列,查询将会中断。编写此代码的首选方法是包括以下各列:

          
            INSERT  INTO  个月(ID,姓名,天)VALUES(2,'二月',29);
          
  
    
您可以尝试在下面的编辑器中运行这些命令。

奖励:写一条INSERT声明可以增加更多月份。

3.选择

当我们想从数据库中获取数据时,选择查询是我们最好的朋友。它们一直被使用,因此本课将花费大量时间来覆盖它们。 最简单的SELECT示例是该查询,它将返回字符表中的所有列和行:
              
    SELECT * FROM "characters"

星号(*)表示我们要获取所有列,而不排除任何内容。由于SQL数据库通常由一个以上的表组成,因此FROM需要关键字来指定我们要查找的表。

有时我们不希望表中的所有列。SQL允许我们选择并仅获取所需的内容:我们无需输入星号(*),而是编写所需列的名称。

              
    SELECT name, weapon FROM "characters"
    

同样,在许多情况下,我们希望结果以某种方式排序。在SQL中,我们可以使用ORDER BY.它进行操作。它可以采用可选的修饰符-ASC(默认)或DESC作为排序方向:

              
    SELECT name, weapon FROM "characters" ORDER BY name DESC
    

奖励:编写一个查询,其中SELECT包含名称,种族和爱好列。

4.哪里

您学习了如何仅选择特定的列,但是如果仅需要获取某些行该怎么办。该WHERE条款的目的是为了挽救我们,使我们可以根据条件过滤数据。

在此查询中,我们仅从字符表中选择那些使用手枪与坏人作战的条目。

奖励:创建一个SELECT查询,以获取“ Wookiees”角色的名称,种族和爱好。

5. AND / OR

WHERE在逻辑运算符(AND,OR)和类似数学的比较(=,<,>,<=,> =,<>)的帮助下,可以根据需要将条件设置为特定。

在这里,我们有一个表格,其中包含有史以来销量最高的4张专辑。让我们选择其中一些被分类为岩石且销量低于5000万张的唱片。通过将AND运算符放在两个语句之间,可以轻松完成此操作。

奖励:尝试编写一个SQL查询,以返回1975年以后发行的销量不到6000万张专辑。

6.In/Between/Like

WHERE语句还支持一些特殊命令,从而可以快速检查常用查询。他们是:

例如,如果我们要查询从表中选择流行和灵魂专辑,则可以使用 IN("value1","value2")。

              
    SELECT * FROM albums WHERE genre IN ('pop','soul');
    
如果我们要获取1975年至1985年之间发行的所有专辑,则可以这样写:
              
    SELECT * FROM albums WHERE released BETWEEN 1975 AND 1985;
奖励:将上述所有操作放在NOT前面都可以将其反转。尝试使用NOT BETWEEN来获取1975年之前和1985年之后发行的专辑。

7.功能

SQL包含执行各种有用内容的函数。以下是一些最常用的方法:

要获取表中的最新年份,我们可以运行:

奖励:尝试SUM与WHERE子句合并,获取所有摇滚专辑的合并销售额。

8.嵌套选择

在上一点中,我们学习了如何对数据进行简单的计算。如果我们想实际使用这些计算的结果,通常需要嵌套查询(也称为sub select)。比方说,我们想要得到的艺术家,专辑和发行年份的最古老的表中的专辑。

我们知道如何获取这些特定的列:

              
    SELECT artist, album, released FROM albums;
    

我们还知道如何获得最早的年份:

              
    SELECT MIN(released) FROM album;
    

现在需要做的就是在WHERE的帮助下将两者结合起来:

奖励:修改上面的语句以返回最新专辑的专辑,类型和年份。

9.联接表

在更复杂的数据库中,大多数情况下,有几个表以某种方式相互连接。例如,下面的编辑器中有两个有关视频游戏和视频游戏开发人员的表格。

在video_games表中,有一个开发人员列,但是它包含一个整数而不是开发人员的名称。这个数字代表的ID从各开发商的game_developers表,逻辑连接两片,允许我们使用在同一时间存储在他们两人的信息。

如果我们想创建一个查询,该查询返回我们需要了解的有关游戏的所有信息,则可以用来INNER JOIN从两个表中获取列。

这是最简单,最常见的JOIN。还有其他两种选择,但是它们适用于频率较低的场景。SQL连接图

10.别名

如果查看前面的示例,您会注意到有两列称为name。这是混淆,所以让我们改变它的别名设置为重复列之一:名字来自game_developers将显示为开发者。

我们还可以通过为表名设置别名来大大缩短查询时间:video_games成为游戏,game_developers成为devs。

11.更新

通常,我们不得不更改某些行中的数据。在SQL中,这是通过UPDATE语句完成的。

UPDATE的用法包括

这是有史以来收视率最高的电视连续剧的表格。尽管有一个小问题,但《权力的游戏》节目被描述为喜剧,但显然不是。让我们解决这个问题!

奖励: 假设《绝命毒师》续订了一个新赛季。编写一条SQL语句,将still_running列更改为yes。

12.删除行

通过SQL删除表行是一个非常简单的过程。所有需要做的就是选择正确的表和要删除的行。

重要提示:编写DELETE语

句时请务必小心,并确保WHERE附有子句。没有它,所有表行将被删除!

13.删除表

如果要删除所有行,但保留表本身,则正确的命令是TRUNCATE:

              
    TRUNCATE  TABLE table_name;
    
在实际上我们想删除表的所有痕迹的情况下,DROP命令就会起作用:
              
    DROP  TABLE table_name;
    

这些命令要非常小心。没有撤消!

结论

这总结了我们的SQL教程!还有很多内容需要介绍,但是以上内容足以让您在Web开发职业中拥有一些实用技能。

有关SQL的更多信息,请查看以下重要资源:

Codeacademy SQL课程- 这里 SQL Fiddle:用于测试和共享SQL的在线工具- 此处