程序员应该知道的13个最重要的SQL命令

数据库驱动着现代网络。每个大型或动态网站都以某种方式使用数据库,并且与结构化查询语言(SQL)结合使用时,处理数据的可能性确实是无限的。如果您已经知道SQL,请确保您检查了所有网站开发人员都应该了解的编程技能。

今天,我将向您展示一些您作为程序员需要了解的核心命令。

从数据库表返回的数据有很多名称。数据通常称为记录。我将在本文中互换使用这些术语。

前言

今天的所有示例均基于四个虚构的表格。 客户表包含客户的姓名和年龄:

高度表包含任何人的姓名和身高:

工作人员表包含工作人员的姓名和年龄-与客户表完全相同:

最终表称为 people 包含人员的姓名和年龄,就像客户和员工表:

1。 Select

select 语句是最简单的,您必须理解它,因为它几乎是所有其他命令的基础。最好使用大写形式编写保留的SQL字,因为这样会使命令更易于阅读和理解。

顾名思义,select用于 select 数据从数据库。这是最简单的用法:

SELECT * FROM table;

有两个部分。第一部分( SELECT * )指定您要选择的列。星号表示您希望选择表中的所有列。第二部分( FROM表)告诉您的数据库引擎您想从哪里检索此数据。用数据库表的名称替换“表"。

This select is known as “select star.” Using the asterisk is a good way to figure out what data is in a table, but I don’t recommend you use it for any production code. When using a select star, it’s up to the database engine to present you with the data you want. You don’t have any control over the order the data is returned, so if somebody adds a new column to the table, you may find your variables in your programming language no longer represent the correct data. Fortunately, there is a solution.

您可以明确声明要检索的列,例如:

SELECT age, name FROM people;

此查询检索“ age"和“人员"表中的“名称"列。如果您有大量数据,那么明确表示这一点可能会有点乏味,但是这样做可以减少将来的问题,并使您的SQL易于将来的程序员理解。

如果要选择

SELECT age, '1234' FROM people;

单引号内的任何字符串都将被返回,而不是与列名匹配。

2。在

中,select命令非常适合检索数据,但是如果您想进一步过滤结果怎么办?仅检索蓝眼睛的人怎么办?一月份出生的从事机械工作的人呢?这是 where 命令的来源。这使您可以将条件应用于选择,只需将其附加到语句的末尾即可:

SELECT age, name FROM people WHERE age > 10;

仅限于10岁以上的人。您可以使用 AND 运算符组合多个条件:

SELECT age, name FROM people WHERE age > 10 AND age < 20;

AND 命令的工作方式与英语完全相同:它将另一个条件应用于该声明。在此示例中,返回的数据将是任何年龄在10到20之间的记录。由于没有匹配的结果,因此不会返回任何数据。

与此结合使用的另一个命令是< strong> OR 。下面是一个示例:

SELECT age, name FROM people WHERE age > 10 OR name = 'Joe';

此查询返回年龄超过10岁或名称等于“ Joe"的记录。注意只有一个等号吗?大多数编程语言都使用双等于(==)来检查是否相等。绝大多数数据库引擎都不需要这样做(但是它可以针对每个环境使用,因此请仔细检查)。

3。 Order

order 命令用于对返回的结果进行排序。这是另一种易于使用的方法。只需将其附加到语句末尾即可。

SELECT name, age FROM people ORDER BY age DESC;

您需要指定列和顺序,可以升序为 ASC DESC 下降。您可以像这样按多列进行排序:

SELECT name, age FROM people ORDER BY name ASC, age DESC

ORDER BY 可能是与其他命令结合使用时最有用的。并非所有查询都将以逻辑或有序方式返回数据-此命令使您可以更改它。

4。联接

联接命令用于联接存储在一个或多个表中的相关数据。您将第二张表加入到第一张表,并指定数据的连接方式。这是一个基本示例:

SELECT age, name, height FROM people LEFT JOIN heights USING (name);

这里发生了一些事情。您必须从“ LEFT JOIN"语法开始,该语法指定您要使用left类型的联接来联接表。接下来,指定要联接的表(高度)。 USING(名称)语法指出,在两个表中都可以找到“名称"列,并将其用作将表连接在一起的键。

Don不用担心您的列在每个表中都有不同的名称。您可以使用“ ON"代替“ USING":

SELECT age, name, height FROM people LEFT JOIN heights ON (namea = nameb);

on语句明确声明要键入哪些列。联接的类型很多,每个联接的细节都需要花费很长时间,因此这里简要介绍了它们的用法:

  • (INNER)JOIN —返回两个表中都具有匹配项的行。
  • 左(外部)联接-返回左侧表中的所有行,以及右侧表中的所有匹配项。如果没有匹配项,则仍返回左表记录。
  • 右(外)联接 —这与左联接相反:右表中的所有行返回,以及左表中的所有匹配项。
  • 完全(外部)联接-返回任一表中具有匹配项的记录。
  • “ INNER"或“ OUTER"语法是可选的。

    5。它可以使事情更容易理解,但您不必在大多数时间内指定它。

    5。别名

    现在您已经了解了基本知识,让我们来看一下别名命令。这用于临时重命名表-绰号比什么都重要,因为这个新名称仅存在于您正在运行的单个事务中。使用方法如下:

    SELECT A.age FROM people A;

    您可以使用任何喜欢的有效名称,但我喜欢使用字母。在每个列名称之前,别名是前缀。别名在声明后立即分配给表。这与执行此操作完全相同:

    SELECT people.age FROM people;

    您不必键入很长的表名,而是可以键入一个简单易记的字母-但有什么用呢?好吧,如果您要从多个表中进行选择,则很容易混淆哪些列属于哪个表。如果两个表都碰巧具有相同名称的列,则在没有显式引用表名或别名的情况下,数据库查询甚至可能无法运行。这是一个有两个表的示例:

    SELECT staff.age, staff.name, customers.age, customers.name FROM staff, customers;

    这是带有别名的相同查询:

    SELECT A.age, A.name, B.age, B.name FROM staff A, customers B;

    职员表的别名为“ A",客户表的别名为别名“ B"。别名表确实有助于使您的代码更易于理解,并减少了您必须执行的键入操作。

    您还可以使用“ AS"命令使用别名来重命名列:

    SELECT age AS person_age FROM people;

    运行此查询时,该列现在将称为“ person_age",而不是“ age"。

    6。联合

    联合是一个很好的命令。它允许您将行彼此追加。与追加匹配列的联接不同,联合可以追加不相关的行,只要它们具有相同的列数和名称即可。使用方法如下:

    SELECT age, name FROM customersUNION SELECT age, name FROM staff;

    您可以将并集看作是合并两个查询结果的一种方式。联合将仅在两个查询之间存在唯一行的情况下返回结果。您可以使用“ UNION ALL"语法返回所有数据,无论是否重复:

    SELECT age, name FROM customersUNION ALLSELECT age, name FROM staff;

    注意行的顺序如何变化?联合会以最有效的方式运行,因此返回的数据可以有序变化。

    联合的一个可能用例是小计:您可以将汇总总数的查询合并到单个汇总的查询中

    7。插入

    您现在了解有关从数据库检索数据的全部知识,但是插入数据又如何呢?这是 insert 命令的来源。这是一个示例:

    INSERT INTO people(name, age) VALUES('Joe', 102);

    您必须指定表名(人员)以及要使用的列(名称和年龄) )。然后使用“ VALUES"语法提供要插入的值。这些必须与先前指定的列具有相同的顺序。

    您不能为插入指定where子句,并且需要确保遵循所有存在的必要表约束。

    8。更新

    插入一些数据后,很自然需要更改特定的行。这是 update 命令的语法:

    UPDATE people SET name = 'Joe', age = 101;

    您必须指定要更改的表,然后使用“ SET"语法指定列及其新值。这个例子很好,但是它会更新每条记录-并非总是如此!

    为了更具体,您可以像执行select一样使用“ WHERE"子句:

    UPDATE people SET name = 'Joe', age = 101 WHERE name = 'James';

    您甚至可以使用“ AND"和“ OR"指定多个条件:

    UPDATE people SET name = 'Joe', age = 101 WHERE (name = 'James' AND age = 100) OR name = 'Ryan';

    请注意如何使用方括号来约束条件。

    9。 Upsert

    Upsert 听起来很奇怪,但是它是一个非常有用的命令。假设您的表格受到限制,并且您指定只想使用具有唯一名称的记录,例如,您不想存储两行具有相同名称的记录。如果您尝试插入多个“ Joe"值,则数据库引擎将引发错误并拒绝这样做(正确)。 UPSERT允许您更新记录(如果已存在)。这非常有用!没有此命令,您将不得不编写大量逻辑来首先检查记录是否存在,如果不存在则插入,否则检索正确的主键然后更新。

    不幸的是,upsert的实现方式不同在不同的数据库引擎中。 PostgreSQL才刚刚获得此功能,而MySQL已有相当一段时间。这是供参考的MySQL语法:

    INSERT INTO people(name, age)VALUES('Joe', 101)ON DUPLICATE KEY UPDATE age = 101;

    请注意,这实际上是一个更新和一个插入语句,可以概括为“如果插入失败,则进行更新。"

    10。删除

    删除用于完全删除记录-如果被滥用,可能会造成很大的破坏!基本语法非常易于使用:

    DELETE FROM people;

    与其他大多数命令一样,这将删除所有内容!您需要在一个地方将其限制为合理的行数—理想情况下是这样:

    DELETE FROM people WHERE name = 'Joe';

    如果您正在开发一个系统,通常最好实施“软删除"。实际上运行delete命令,而是创建一个已删除的列,然后检查选择的列-如果可以快速,轻松地检索假定删除的记录,则可以避免很多潜在的尴尬。但是,这不能替代适当的备份。

    11。创建表

    创建表命令用于创建表。这是另一种非常简单的方法:

    CREATE TABLE people (  name TEXT,  age, INTEGER,  PRIMARY KEY(name));

    请注意,列名称和约束如何放在方括号内,并且为列提供了适当的数据类型。指定了主键,这是任何良好的数据库设计所必需的。

    12。更改表

    更改表命令用于修改表的结构。这有一点限制,因为如果现有数据会引起冲突,数据库将不允许您更改表,例如,将字符串更改为整数。在这种情况下,请先修复数据,然后再修改表。这是一个示例:

    ALTER TABLE people ADD height integer;

    该示例向人员表中添加了一个名为integer的“ height"列。您可以更改的内容实际上没有限制。

    13。删除表

    最后一个命令是删除表。将其视为删除,而不是删除单个记录,而是将每个单个记录与表一起删除!使用方法如下:

    DROP TABLE people;

    这是一个非常严厉的命令,因此没有必要将其编程到您的系统中。它只能在绝大多数情况下手动执行,并且可能具有破坏性。

    今天就这些。希望您学到了一些有用的技巧!您可以学习如何制作网站吗?

    为什么不在下面留下您最喜欢的SQL提示和技巧的评论?

    图像积分: HYS_NP / Shutterstock

    标签: 编程 SQL