当今大多数现代 Web 应用程序都与数据库交互,通常使用一种称为 sql 的语言。幸运的是,这种语言很容易学习。在本文中,我们将从一些基本的 SQL 查询开始,并使用它们与 mysql 数据库进行交互。
SQL是什么?
SQL(结构化查询语言)是一种设计用于与关系数据库管理系统(RDBMS)交互的语言,如 MySQL、Oracle、sqlite 等。要执行本文中的 SQL 查询,我建议您安装 MySQL。我还推荐 phpMyAdmin 作为 MySQL 的可视化界面。
以下应用程序使在本地计算机上安装 MySQL 和 phpMyAdmin 变得非常容易:
适用于 Windows 的WAMP
适用于 mac 的MAMP
我们将使用命令行进行查询。WAMP 已经带有一个 MySQL 控制台。对于 MAMP,您可能想阅读这篇文章。
创建数据库:创建数据库
这是我们的第一个查询。我们将创建一个可以使用的数据库。
首先,打开您的 MySQL 控制台并登录。对于 WAMP,默认密码为空。对于 MAMP,默认情况下密码应为“root”。
登录后,输入此查询并回车:
CREATE dataBASE my_first_db;
请注意,分号 (;) 被添加到查询的末尾,就像在代码行的末尾一样。
此外,特殊词“CREATE DATABASE”以及 SQL 中的所有特殊词都不区分大小写。但为了可读性,我们将它们写成大写。
可选:字符集和排序规则
如果你想设置默认字符集和排序规则,你可以像这样编写相同的查询:
CREATE DATABASE my_first_db DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci;
这是 MySQL 中支持的字符集和排序规则的列表。
显示数据库:列出所有数据库
此查询用于获取您拥有的所有数据库的列表。
DROP DATABASE:删除数据库
您可以使用此查询删除现有数据库。
小心这个查询,因为它不会给你任何警告。如果您在数据库下有表和数据,它们将立即被删除。
用途:选择数据库
这在技术上不是一个查询。这是一个“声明”,结尾不需要分号。
它告诉 MySQL 为当前会话选择一个要使用的默认数据库。现在我们准备在这个数据库下创建表和做其他事情。
什么是数据库表?
您可以将数据库表想象成包含结构化数据的电子表格或 csv 文件。
就像在此示例中一样,表具有列名和数据行。使用 SQL 查询,我们可以创建这些表。我们还可以添加、读取、更新和删除数据。
创建表:创建表
通过这个查询,我们可以在数据库中创建表。不幸的是,MySQL 文档对新学习者不是很友好。这种查询的结构可能会变得非常复杂,但我们将从一个简单的开始。
以下查询将创建一个包含 2 列的表。
CREATE TABLE users ( username VARCHAR(20), create_date DATE );
请注意,我们可以在多行中编写查询,甚至可以使用制表符进行缩进。
第一行很简单。我们只是创建一个名为“用户”的表。之后,在括号中,我们有一个用逗号分隔的列表列。在每个列名之后,我们都有一个数据类型,例如 VARCHAR 或 DATE。
VARCHAR(20) 表示该列是字符串类型,最长可以为20 个字符。DATE 也是一种专门用于存储日期的数据类型,格式如下:'YYYY-MM-DD'。
首要的关键
在我们运行该查询之前,我们还应该包含一个“user_id”列,这将是一个主键。无需过多了解细节,您可以将 PRIMARY KEY 视为一种标识表中每一行数据的方法。
现在查询变为:
CREATE TABLE users ( user_id INT AUTO_INCREMENT PRIMARY KEY, username VARCHAR(20), create_date DATE );
INT 使其成为 32 位整数类型(即数字)。每次我们添加新的数据行时,AUTO_INCREMENT 都会自动生成一个新的 id 号。它不是必需的,但使它更方便。
此列不必是整数,但它是最常用的类型。拥有 PRIMARY KEY 列也不是必需的,但强烈建议使用良好的数据库设计和性能。
让我们运行查询:
显示表:列出所有表
此查询允许您获取当前在数据库中的表的列表。
解释:显示表结构
要查看现有表的结构,可以使用此查询。
结果中列出了字段(又名列)及其属性。
DROP TABLE:删除表
就像 DROP DATABASES 一样,此查询会删除一个表及其内容,而不会发出警告。
ALTER TABLE:修改表
此查询也可以具有相当复杂的结构,因为它可以对表执行大量更改。让我们看一些简单的例子。
(确保重新创建我们刚刚删除的表,否则以下查询显然不起作用。)
添加一列
ALTER TABLE users ADD email VARCHAR(100) AFTER username;
由于 SQL 的可读性,我认为该查询甚至不需要解释。
删除列
那也很简单。但请谨慎使用,因为它会在没有警告的情况下永久删除数据。
重新添加电子邮件列,因为我们稍后将使用它:
ALTER TABLE users ADD email VARCHAR(100) AFTER username;
修改列
有时您可能想要更改列的属性,因此您不必删除并重新创建它。
这将用户名列重命名为“user_name”,并将类型从 VARCHAR(20) 更改为 VARCHAR(30)。像这样的更改不应干扰表中的任何现有数据。
插入:将数据添加到表中
让我们使用这个查询将一些数据添加到表中。
如您所见,VALUES() 包含字段值列表,以逗号分隔。字符串值用单引号括起来。并且这些值需要按照我们创建表时定义的列的顺序排列。
请注意,我们称为“user_id”的 PRIMARY KEY 字段的第一个值为 NULL。我们这样做是为了自动生成一个 id,因为该列设置为 AUTO_INCREMENT。第一次输入一行数据时,id为1,下一个插入的行为2,以此类推...
替代语法
这是插入行的另一种语法。
这次我们使用关键字 SET 而不是 VALUES,并且后面没有括号。这里有几点需要注意:
可以省略一列。例如,我们没有为 user_id 分配值,这将默认为 AUTO_INCREMENT 功能。如果省略 VARCHAR 列,它将默认为空字符串(除非在创建表期间指定了不同的默认值)。
每列都必须通过其名称来引用。因此,与之前的语法不同,它们可以按任何顺序排列。
替代语法 2
这是另一种语法。
同样,由于每列都按名称引用,因此它们可以按任何顺序排列。
LAST_INSERT_ID()
您可以使用此查询来获取当前会话中最后插入的行的 AUTO_INCREMENT id。
NOW()
我认为现在是演示如何在查询中使用 MySQL 函数的好时机。
NOW() 函数返回当前日期。因此,您可以使用它在插入新行时自动将 DATE 列设置为当天。
请注意,我们收到了来自 MySQL 的警告,但这不是什么大问题。原因是 NOW() 实际上也返回时间信息。
但是我们创建的 create_date 列只包含日期,而不是时间,因此返回的数据被截断。我们可以改用 CURDATE() 函数,它只返回日期,但最后存储的数据将是相同的。
SELECT:从表中读取数据
显然,我们添加的数据将毫无用处,除非我们能够读取它。这就是 SELECT 查询的用武之地。
这是从表中读取的最简单的 SELECT 查询:
在这种情况下,星号 (*) 表示我们要求从表中获取所有列。如果您只需要特定的列,查询将如下所示:
WHERE Clause
通常,我们只对某些行感兴趣,而不是全部。例如,假设我们想要用户“nettuts”的电子邮件地址。
把它想象成一个 IF 语句。WHERE 允许您在查询中为您要查找的结果添加条件。
请注意,对于相等条件,仅使用单个等号 (=),而不是您可能在编程中习惯的双 (==)。
您也可以使用其他比较条件:
AND 和 OR 可用于组合条件:
请注意,数值不必包含在引号内。
IN()
这对于匹配多个值很有用。
LIKE
这允许您进行通配符搜索。
百分号 (%) 用作通配符。
ORDER BY Clause
如果您希望按特定顺序返回结果,请使用以下子句:
默认顺序是 ASC(即升序)。您可以添加 DESC 以反转它的顺序。
LIMIT ... OFFSET ...
您可以限制返回结果的数量。
LIMIT 2 只获得前 2 个结果。LIMIT 1 OFFSET 2 在前 2 个结果之后得到 1 个结果。LIMIT 2, 1 表示同样的意思,但注意第一个数字是偏移量,第二个数字是限制。
UPDATE:更新表中的数据
此查询用于更新表中的数据。
大多数时候,它与 WHERE 子句一起使用,因为您只希望更新特定的行。如果未提供 WHERE 子句,则所有行都将使用相同的更改进行更新。
您还可以使用 LIMIT 子句来限制要更新的行数。
DELETE:从表中删除数据
就像 UPDATE 一样,此查询通常也与 WHERE 子句一起使用。
截断表
要删除表的全部内容,您可以这样做:
DELETE FROM users;
但通常使用 TRUNCATE 会更高效。
TRUNCATE 还重置 AUTO_INCREMENT 数字,因此新行将再次具有 id 1。但这不会发生在 DELETE 查询中,并且计数器会继续上升。
转义字符串值和特殊词
字符串值
某些字符需要转义,否则可能会出现问题。
反斜杠 (\) 用于转义。
出于安全原因,这也非常重要。任何进入数据库的用户输入都需要正确转义。在 PHP 中,您使用mysql_real_escape_string()函数或使用准备好的语句,因为它们会自动转义。
特殊词
由于 MySQL 有许多特殊的词,如 SELECT 或 UPDATE,您可以通过在表名和列名周围加上引号来防止冲突。但这些不是常规报价;您需要使用反引号 (`) 字符。
假设您出于某种原因要添加一个名为“删除”的列:
结论
感谢您阅读这篇文章。希望我能够向您展示 SQL 具有简单的学习曲线,但它非常强大。
- 可选:字符集和排序规则
- 首要的关键
- 添加一列
- 删除列
- 修改列
- 替代语法
- 替代语法 2
- LAST_INSERT_ID()
- NOW()
- WHERE Clause
- IN()
- LIKE
- ORDER BY Clause
- LIMIT ... OFFSET ...
- UPDATE:更新表中的数据
- 截断表
- 字符串值
- 特殊词
发表评论