每个Web开发人员都应该了解SQL。尽管它自20世纪70年代就已经存在,但仍被广泛使用,没有它,您将无法构建严肃的应用程序。大多数全栈框架都具有用于处理 SQL 复杂性的库- ActiveRecord,Doctrine,Hibernate 等。但是通常您需要动手编写低级 SQL。
这就是为什么我们准备了有关SQL基础知识的简短介绍。在本文中,您将找到我们的交互式编辑器,用于编写和执行代码。不要害怕尝试它们并尝试完成奖励任务。
让我们开始!
在SQL中创建新表时,将CREATE TABLE调用该语句。它期望将表中我们想要的所有列及其数据类型作为参数。
在这里,我们正在创建一个简单的表,称为months。它由3列组成:
这是各个SQL的样子:
CREATE TABLE months (id int, name varchar(10), days int);
同样,在创建表时,建议向其中一列添加主键。这将有助于保持条目的唯一性,并加快选择查询的速度。在本课程中,我们不会涉及它们,但是您可以在此处阅读有关它们的信息。
现在,让我们用几行信息填充月份。通过该INSERT语句将条目添加到表中。有两种不同的使用方式:
第一种方法不指定要在其中插入数据的列名,它仅期望值并将其留给开发人员以正确的顺序提供所有数据。
INSERT INTO 月 VALUES(1,'月',31);
上面的内容比较短,但是存在一个主要问题-如果以后再添加其他列,查询将会中断。编写此代码的首选方法是包括以下各列:
INSERT INTO 个月(ID,姓名,天)VALUES(2,'二月',29);
您可以尝试在下面的编辑器中运行这些命令。
奖励:写一条INSERT声明可以增加更多月份。
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包含名称,种族和爱好列。
您学习了如何仅选择特定的列,但是如果仅需要获取某些行该怎么办。该WHERE条款的目的是为了挽救我们,使我们可以根据条件过滤数据。
在此查询中,我们仅从字符表中选择那些使用手枪与坏人作战的条目。
奖励:创建一个SELECT查询,以获取“ Wookiees”角色的名称,种族和爱好。
WHERE在逻辑运算符(AND,OR)和类似数学的比较(=,<,>,<=,> =,<>)的帮助下,可以根据需要将条件设置为特定。
在这里,我们有一个表格,其中包含有史以来销量最高的4张专辑。让我们选择其中一些被分类为岩石且销量低于5000万张的唱片。通过将AND运算符放在两个语句之间,可以轻松完成此操作。
奖励:尝试编写一个SQL查询,以返回1975年以后发行的销量不到6000万张专辑。
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年之后发行的专辑。
要获取表中的最新年份,我们可以运行:
奖励:尝试SUM与WHERE子句合并,获取所有摇滚专辑的合并销售额。
在上一点中,我们学习了如何对数据进行简单的计算。如果我们想实际使用这些计算的结果,通常需要嵌套查询(也称为sub select)。比方说,我们想要得到的艺术家,专辑和发行年份的最古老的表中的专辑。
我们知道如何获取这些特定的列:
SELECT artist, album, released FROM albums;
我们还知道如何获得最早的年份:
SELECT MIN(released) FROM album;
现在需要做的就是在WHERE的帮助下将两者结合起来:
奖励:修改上面的语句以返回最新专辑的专辑,类型和年份。
在更复杂的数据库中,大多数情况下,有几个表以某种方式相互连接。例如,下面的编辑器中有两个有关视频游戏和视频游戏开发人员的表格。
在video_games表中,有一个开发人员列,但是它包含一个整数而不是开发人员的名称。这个数字代表的ID从各开发商的game_developers表,逻辑连接两片,允许我们使用在同一时间存储在他们两人的信息。
如果我们想创建一个查询,该查询返回我们需要了解的有关游戏的所有信息,则可以用来INNER JOIN从两个表中获取列。
这是最简单,最常见的JOIN。还有其他两种选择,但是它们适用于频率较低的场景。SQL连接图
如果查看前面的示例,您会注意到有两列称为name。这是混淆,所以让我们改变它的别名设置为重复列之一:名字来自game_developers将显示为开发者。
我们还可以通过为表名设置别名来大大缩短查询时间:video_games成为游戏,game_developers成为devs。
通常,我们不得不更改某些行中的数据。在SQL中,这是通过UPDATE语句完成的。
UPDATE的用法包括这是有史以来收视率最高的电视连续剧的表格。尽管有一个小问题,但《权力的游戏》节目被描述为喜剧,但显然不是。让我们解决这个问题!
奖励: 假设《绝命毒师》续订了一个新赛季。编写一条SQL语句,将still_running列更改为yes。
通过SQL删除表行是一个非常简单的过程。所有需要做的就是选择正确的表和要删除的行。
重要提示:编写DELETE语句时请务必小心,并确保WHERE附有子句。没有它,所有表行将被删除!
如果要删除所有行,但保留表本身,则正确的命令是TRUNCATE:
TRUNCATE TABLE table_name;
在实际上我们想删除表的所有痕迹的情况下,DROP命令就会起作用:
DROP TABLE table_name;
这些命令要非常小心。没有撤消!
这总结了我们的SQL教程!还有很多内容需要介绍,但是以上内容足以让您在Web开发职业中拥有一些实用技能。
有关SQL的更多信息,请查看以下重要资源:
Codeacademy SQL课程- 这里 SQL Fiddle:用于测试和共享SQL的在线工具- 此处