数据库驱动着现代网络。每个大的或动态的网站都以某种方式使用数据库,当与结构化查询语言(SQL)结合使用时,操纵数据的可能性真的是无穷无尽。如果您已经知道SQL,请确保您检查了所有网站开发人员都应该知道的编程技能。
今天我将向您展示作为程序员需要了解的一些核心SQL命令。
从数据库表返回的数据有许多名称。数据通常被称为行、记录或元组。在本文中,我将交替使用这些术语。
今天所有的例子都基于四个虚构的表格。customer表包含客户的姓名和年龄:
高度表包含任何人的姓名和身高:
staff表包含职员的姓名和年龄——与customer表完全相同:
最后一个名为people的表包含人员的姓名和年龄,就像customer和staff表一样:
select语句是最简单的,您必须理解它,因为它支持几乎所有其他命令。以大写形式编写保留的SQL字被认为是一种最佳实践,因为它使命令更易于阅读和理解。
顾名思义,select用于从数据库中选择数据。以下是最简单的用法:
SELECT * FROM table;这有两个部分。第一部分(SELECT*)指定要选择的列。星号表示您希望选择表中的所有列。第二部分(来自表)告诉您的数据库引擎要从何处检索这些数据。将“table”替换为数据库表的名称。
这个select被称为“select star”。使用星号是一个很好的方法来找出表中的数据,但是我不建议您在任何生产代码中使用它。使用selectstar时,由数据库引擎向您提供所需的数据。您无法控制数据返回的顺序,因此如果有人向表中添加新列,您可能会发现编程语言中的变量不再表示正确的数据。幸运的是,有一个解决办法。
可以显式说明要检索哪些列,如下所示:
SELECT age, name FROM people;此查询从“people”表中检索“age”和“name”列。如果您有大量数据,那么这种显式可能会有点乏味,但是这样做会减少将来的问题,同时使您的SQL更容易被未来的程序员理解。
如果要选择一个附加的数据段,但它没有存储在任何表中,可以这样做:
SELECT age, '1234' FROM people;将返回单引号内的任何字符串,而不是与列名匹配的字符串。
select命令非常适合检索数据,但是如果您想进一步过滤结果呢?那只找蓝眼睛的人怎么样?一月份出生的机械师呢?这就是命令的作用。这允许您将条件应用于select,只需将其附加到语句末尾:
SELECT age, name FROM people WHERE age > 10;此查询现在仅限于10岁以上的人。可以使用AND运算符组合多个条件:
SELECT age, name FROM people WHERE age > 10 AND age < 20;AND命令的工作方式与英语中的完全相同:它对语句应用另一个条件。在本例中,返回的数据将是年龄在10到20之间的任何记录。由于没有匹配结果,因此不返回任何数据。
另一个可以与此结合使用的命令是或。举个例子:
SELECT age, name FROM people WHERE age > 10 OR name = 'Joe';此查询返回年龄大于10岁或名称等于“Joe”的记录。注意到只有一个等号吗?大多数编程语言使用双等于(=)来检查等价性。对于绝大多数数据库引擎来说,这是不需要的(但是对于每个环境来说,这是非常必要的,所以首先要仔细检查)。
order命令用于对返回的结果进行排序。这是另一个容易使用的。只需将其附加到语句末尾:
SELECT name, age FROM people ORDER BY age DESC;您需要指定列和顺序,升序可以是ASC,降序可以是DESC。您可以按以下方式按多个列排序:
SELECT name, age FROM people ORDER BY name ASC, age DESCORDER BY与其他命令结合使用时可能最有用。并不是所有的查询都会以逻辑或有序的方式返回数据——这个命令允许您更改这一点。
join命令用于连接存储在一个或多个表中的相关数据。将第二个表连接到第一个表,并指定数据的连接方式。下面是一个基本示例:
SELECT age, name, height FROM people LEFT JOIN heights USING (name);这里发生了一些事情。必须从“LEFT JOIN”语法开始,该语法指定要使用LEFT类型的连接来连接表。接下来,指定要联接的表(高度)。USING(name)语法声明在两个表中都可以找到“name”列,并且应该将其用作将表连接在一起的键。
如果您的列在每个表中有不同的名称,请不要担心。您可以使用“ON”而不是“USING”:
SELECT age, name, height FROM people LEFT JOIN heights ON (namea = nameb);on语句显式声明要在哪些列上设置键。连接有多种类型,每种类型的详细信息都需要很长时间,下面简要介绍一下它们的用法:
“内部”或“外部”语法是可选的。它可以使事情更容易理解,但你不必在绝大多数时间里指定它。
现在您了解了基础知识,让我们看看alias命令。这用于临时重命名一个表——更像是一个昵称,因为这个新名称只存在于正在运行的单个事务中。以下是使用方法:
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;staff表的别名为“A”,customers表的别名为“B”。别名表确实有助于使代码更易于理解,并减少了所需的键入量。
也可以使用“AS”命令重命名具有别名的列:
SELECT age AS person_age FROM people;运行此查询时,该列现在将被称为“person\u age”,而不是“age”。
团结是伟大的命令。它允许您将行相互附加。与附加匹配列的联接不同,union可以附加不相关的行,前提是它们具有相同的列数和列名。以下是使用方法:
SELECT age, name FROM customersUNION SELECT age, name FROM staff;您可以将union看作是组合两个查询结果的一种方法。联合将只返回两个查询之间存在唯一行的结果。可以使用“UNION ALL”语法返回所有数据,而不考虑重复数据:
SELECT age, name FROM customersUNION ALLSELECT age, name FROM staff;注意行的顺序是如何变化的吗?Union以最有效的方式运行,因此返回的数据可以按顺序变化。
union的一个可能的用例是小计:您可以将sum total查询合并到特定场景的单个总计查询上。
现在您已经了解了从数据库检索数据的所有方法,但是如何**数据呢?这就是insert命令的作用。举个例子:
INSERT INTO people(name, age) VALUES('Joe', 102);必须指定表名(people)和要使用的列(name和age)。然后使用“VALUES”语法提供要**的值。这些列的顺序必须与先前指定的列的顺序相同。
不能为insert指定where子句,需要确保遵循现有的任何必要的表约束。
在**一些数据之后,很自然地需要更改特定的行。更新命令语法如下:
UPDATE people SET name = 'Joe', age = 101;必须指定要更改的表,然后使用“SET”语法指定列及其新值。这个例子很好,但它会更新每一条记录——这并不总是可取的!
为了更具体,您可以使用“WHERE”子句,就像在执行select时一样:
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';请注意括号是如何用于约束条件的。
Upsert是一个听起来很奇怪的词,但却是一个非常有用的命令。假设您的表上有一个约束,并且您指定只需要具有唯一名称的记录——例如,您不希望存储具有相同名称的两行。如果您尝试**多个'Joe'值,您的数据库引擎将抛出一个错误并拒绝这样做(非常正确)。UPSERT允许您更新已存在的记录。这是非常有用的!如果没有这个命令,您将不得不编写大量的逻辑来首先检查记录是否存在,如果不存在则**,否则检索正确的主键,然后更新。
不幸的是,upsert在不同的数据库引擎中实现方式不同。PostgreSQL最近才获得这种能力,而MySQL拥有这种能力已经有相当一段时间了。以下是MySQL语法供参考:
INSERT INTO people(name, age)VALUES('Joe', 101)ON DUPLICATE KEY UPDATE age = 101;请注意,这实际上是一个update和insert语句,可以概括为“insert失败时更新”
Delete用于完全删除记录——如果被滥用,它可能会造成相当大的损害!基本语法非常容易使用:
DELETE FROM people;像大多数其他命令一样,这将删除所有内容!您需要使用where将其限制为稍微合理的行数,最好是:
DELETE FROM people WHERE name = 'Joe';如果您正在开发一个系统,实现“软删除”通常是明智的。您实际上从未运行delete命令,而是创建一个已删除的列,然后在selects中检查该列—如果您能够快速轻松地检索假定已删除的记录,则可以避免许多潜在的尴尬。然而,这并不能替代正确的备份。
create table命令用于创建表。这是另一个非常简单的问题:
CREATE TABLE people ( name TEXT, age, INTEGER, PRIMARY KEY(name));请注意,列名和约束是如何放在方括号内的,并且这些列被赋予了适当的数据类型。主键是指定的,这在任何好的数据库设计中都是必需的。
altertable命令用于修改表的结构。这是有点限制的,因为如果现有数据会导致冲突,数据库将不允许您更改表——例如,将字符串更改为整数。在这些情况下,首先修复数据,然后修改表。举个例子:
ALTER TABLE people ADD height integer;本例向people表中添加了一个integer类型的名为“height”的列。你能改变的东西其实没有限制。
最后一个命令是drop table。可以将此视为删除,但它不会删除单个记录,而是删除表中的每个记录!以下是使用方法:
DROP TABLE people;这是一个相当激烈的命令,没有理由它需要被编程到您的系统。在绝大多数情况下,只能手动执行,而且破坏性很大。
今天就这些。我希望你学会一些有用的技巧!您可以学习如何创建一个网站,然后使用新发现的技能使其动态化--只需确保您不会犯这些错误或使其容易受到SQL注入的影响。如果您不确定是否需要学习SQL,是否考虑过静态站点生成器?
为什么不在下面留下你最喜欢的SQL技巧和技巧呢?
图片来源:HYS\U NP/Shutterstock
... 由于所有日期现在都将保存在UTC中,所以您总是知道您正在使用什么,使事情更加简单和直接。 ...
...格中键入以下SQL(请注意,我们提供的是除“id”之外的所有字段的值): INSERT INTO "users" ("first_name","last_name","created","email","state") VALUES ('Dave','McKay','12/08/2020','[email protected]','Idaho'); 单击蓝色箭头(看起来像播放按钮)运行S...
...具,您可以使用它监视命中数据库的每个SQL查询。这对于程序员和数据库管理员解决应用程序生成的精确查询非常有用。 在频繁使用MySQL之后,这是我想知道如何做的第一件事之一。您还可以如何查看WordPress或phpBB生成的实际SQL...
...果传递给客户机应用程序。它通过提供负责与数据库进行所有通信的标准库,使应用程序独立于底层数据库。 SQL或结构化查询语言与数据库通信。它是一种关系数据库管理语言,它处理存储在数据库中的数据。它基于数据库中...
技术的进步使得在线交易几乎可以满足我们所有的需求。无论是购物还是付账,我们大多数人都依赖互联网。这反过来又消除了旧日账本的使用,并导致了数据库的使用。渐渐地,我们开始使用关系数据库(RDB)来协同工...
...型的数据,关系数据库就是其中之一。这些数据库由存储所有数据的表组成。表有行和列。行表示每条记录,列表示属性。例如,学生数据库可以具有诸如ID、name、age、class、mark1、mark2等属性。每行表示一个特定学生的一组详细...
...等编写PLSQL代码。 主要用途 用法是SQL和PLSQL之间的另一个重要区别。SQL主要用于选择和操作数据集,而PLSQL则用于web应用程序和服务器页面。 结论 SQL和PLSQL的区别在于,SQL是一种查询语言,用于存储、操作和检索关系数据库中的...
...ver是微软开发的关系数据库系统。它由GUI和命令行组成。程序员可以使用SQL编写查询并在sqlserver上执行它们。SQL Server提供了多种优势。它允许创建和管理数据库,并提供分析服务和报表服务等服务。实例和数据库是与SQLServer相...
...的用户。 什么是**sql(drop in sql)? DROP是SQL中的DDL命令。 程序员可以使用DROP从RDBMS中删除现有的数据库。 删除数据库信息; 上面的命令删除/删除名为schoolInfo的数据库。 此外,还可以对数据库对象(如表)执行DROP。下面是一个...
...E之间的主要区别。 使用 在SQL中,INSERT和UPDATE之间的一个重要区别是,INSERT有助于向表中添加新值,而UPDATE有助于修改表的值。 结论 INSERT和UPDATE是SQL中两个广泛使用的DML命令。通常,INSERT语句是创建表后执行的第一条语句。另...