🚀 缺失的 SQL 基础速成课程
介绍
数据库
MySQL
表格
基本语法
结论
介绍
无论您是 DevOps/SysOps 工程师、开发人员还是 Linux 爱好者,您很可能在职业生涯的某个阶段都需要使用 SQL。
本指南适合任何开发人员、系统管理员或 DevOps 工程师,并希望学习 SQL 基础知识的人。
数据库
在深入研究 SQL 之前,让我们快速定义一下什么是数据库。
维基百科对数据库的定义是:
数据库是有组织的数据集合,通常通过计算机系统以电子方式存储和访问。
换句话说,数据库是存储和构建在不同数据库表中的数据的集合。
表和列
您很可能使用过 Excel 或 Google Sheets 等电子表格系统。数据库表的基本结构与电子表格非常相似。
每个表都有不同的列,可以包含不同类型的数据。
例如,如果您有一个待办事项列表应用程序,那么您会有一个数据库,并且在数据库中,您会有不同的表存储不同的信息,例如:
- 用户 - 在用户表中,您将拥有一些用户数据,例如:
username
、、name
和active
。 - 任务 - 任务表将存储您计划执行的所有任务。任务表的列例如为
task_name
、status
和。due_date
priority
用户表将如下所示:
+----+----------+---------------+--------+
| id | username | name | active |
+----+----------+---------------+--------+
| 1 | bobby | Bobby Iliev | true |
| 2 | greisi | Greisi I. | true |
| 3 | devdojo | Dev Dojo | false |
+----+----------+---------------+--------+
表结构概要:
- 我们有 4 列:
id
、、和username
name
active
- 我们还有 3 个条目/用户
- 该
id
列是每个用户的唯一标识符,并且自动增加。
接下来我们将学习如何安装 MySQL 并创建我们的第一个数据库。
MySQL
现在您知道了什么是数据库、表和列,接下来您需要做的就是安装一个数据库服务,您将在其上运行 SQL 查询。
我们将使用 MySQL,因为它是免费的、开源的并且使用非常广泛。
安装 MySQL
由于我们将使用Ubuntu,因此为了安装 MySQL,请运行以下命令:
- 首先更新你的
apt
存储库:
sudo apt update -y
- 然后安装MySQL:
sudo apt install mysql-server mysql-client
我们正在安装 2 个包,一个是实际的 MySQL 服务器,另一个是 MySQL 客户端,它允许我们连接到 MySQL 服务器并运行我们的查询。
为了检查 MySQL 是否正在运行,请运行以下命令:
sudo systemctl status mysql.service
为了保护您的 MySQL 服务器,您可以运行以下命令:
sudo mysql_secure_installation
然后按照提示操作,最后选择一个安全的密码并将其保存在密码管理器等安全的地方。
这样,你的 MySQL 就安装在你的 Ubuntu 服务器上了。以上步骤在 Debian 上也应该可以正常工作。
在 Mac 上安装 MySQL
我建议使用Homebrew安装 MySQL :
brew install mysql
之后启动 MySQL:
brew services start mysql
最后,确保其安全:
mysql_secure_installation
如果您需要停止 MySQL 服务,可以使用以下命令:
brew services stop mysql
在 Windows 上安装 MySQL
为了在 Windows 上安装 MySQL,我建议按照此处官方文档中的步骤操作:
https://dev.mysql.com/doc/refman/8.0/en/windows-installation.html
通过 CLI 访问 MySQL
要访问 MySQL,请mysql
按照您的用户身份运行以下命令:
mysql -u root -p
创建数据库
之后,切换到demo
我们在上一章中创建的数据库:
USE demo_db;
要退出,只需输入以下内容:
exit;
配置.my.cnf
~/.my.cnf
通过在用户主目录中配置该文件,MySQL 将允许您登录而无需提示您输入密码。
为了进行该更改,您需要做的首先.my.cnf
在用户的主目录中创建一个文件:
touch ~/.my.cnf
之后,设置安全权限,以便其他普通用户无法读取该文件:
chmod 600 ~/.my.cnf
然后使用您最喜欢的文本编辑器打开该文件:
nano ~/.my.cnf
并添加如下配置:
[client]
user=YOUR_MYSQL_USERNAME
password=YOUR_MYSQL_PASSWORD
确保相应地更新您的 MySQL 凭据,然后保存文件并退出。
此后,如果您只运行mysql
,您将直接使用文件中指定的凭据进行身份验证,~/.my.cnf
而无需提示输入密码。
mysqladmin 命令
作为快速测试,您可以通过运行以下命令检查所有打开的 SQL 连接:
mysqladmin proc
该mysqladmin
工具还将使用~/.my.cnf
文件中的客户端详细信息,并列出您当前的 MySQL 进程列表。
您可以尝试做的另一件很酷的事情是将其与watch
命令结合起来,几乎实时地监控您的 MySQL 连接:
watch -n1 mysqladmin proc
要停止watch
命令,只需点击CTRL+C
GUI 客户端
如果您更喜欢使用 GUI 客户端,您可以查看以下内容并将其本地安装在您的笔记本电脑上:
mysql
这将允许您通过图形界面而不是命令行工具连接到数据库。
如果您想要一个可用于生产的 MySQL 数据库,我建议您尝试一下 DigitalOcean:
表格
在开始使用 SQL 之前,让我们先学习如何创建表和列。
作为示例,我们将创建一个users
包含以下列的表:
id
- 这将成为表的主键,并成为每个用户的唯一标识符。username
- 此列将保存我们用户的用户名name
- 在这里,我们将存储用户的全名status
- 在这里,我们将存储用户的状态,这将表明用户是否处于活跃状态。
您需要指定每一列的数据类型。
在我们的例子中,它会是这样的:
id
- 整数username
- 可变字符name
- 可变字符status
- 数字
数据类型
您可能遇到的最常见的数据类型是:
CHAR
(size):定长字符串,最大长度为255字节。VARCHAR
(size): 可变长度字符串。括号中指定最大长度。TEXT
(大小):最大长度为 65,535 字节的字符串。INTEGER
(size) 或INT
(size):中等整数。BOOLEAN
orBOOL
:保存真值或假值。DATE
:保存日期。
让我们以以下用户表为例:
id
:我们希望将 ID 设置为INT
。name
:名称应适合一VARCHAR
列。about
:由于关于部分可能更长,我们可以将列数据类型设置为TEXT
。birthday
:对于用户的生日列,我们可以使用DATE
。
有关所有可用数据类型的更多信息,请务必查看此处的官方文档。
创建数据库
正如我们在上一章中简要介绍的那样,在创建表之前,您需要通过运行以下命令来创建数据库:
- 首先访问MySQL:
mysql -u root -p
- 然后创建一个名为的数据库
demo_db
:
CREATE DATABASE demo_d;
注意:数据库名称需要唯一,如果您已经有一个名为的数据库,
demo_db
您将收到数据库已存在的错误。
您可以将此数据库视为我们创建所有表的容器。
创建数据库后,您需要切换到该数据库:
USE demo_db;
您可以将其视为使用cd
命令访问 Linux 中的目录。使用USE
,我们切换到特定的数据库。
或者,如果您不想“切换”到特定数据库,则需要指定所谓的完全限定表名。例如,如果您users
在 中有一个表demo_db
,并且想要从该表中选择所有条目,则可以使用以下两种方法之一:
- 切换到第
demo_db
一个,然后运行选择语句:
USE demo_db;
SELECT username FROM demo_db.users;
- 或者,不要
USE
先使用命令,而是指定数据库名称,然后用点分隔的表名db_name.table_name
::
SELECT username FROM demo_db.users;
我们将SELECT
在接下来的章节中更深入地讨论该声明。
创建表
为了创建一个表,您需要使用CREATE TABLE
语句,后跟您希望在该表中拥有的列及其数据类型。
假设我们要创建一个users
包含以下列的表:
id
:整数值username
:varchar 值about
:文本类型birthday
: 日期active
:正确或错误
我们需要运行来创建该表的查询是:
CREATE TABLE users
(
id INT,
username VARCHAR(255),
about TEXT,
birthday DATE,
active BOOL
);
注意:您需要先使用
USE
上述命令选择一个数据库。否则,您将收到以下错误:ERROR 1046 (3D000): No database selected
。
要列出可用的表,您可以运行以下命令:
SHOW TABLES;
输出:
+-------------------+
| Tables_in_demo_db |
+-------------------+
| users |
+-------------------+
删除表
您可以使用DROP TABLE
语句删除或移除表。
让我们测试一下并删除我们刚刚创建的表:
DROP TABLE users;
您将获得的输出将是:
Query OK, 0 rows affected (0.03 sec)
现在,如果您再次运行查询SHOW TABLES;
,您将获得以下输出:
Empty set (0.00 sec)
允许 NULL 值
默认情况下,表中的每一列都可以保存 NULL 值。如果您不想允许特定表中的某些列使用 NULL 值,则需要在创建表时指定,或稍后修改表以允许使用 NULL 值。
例如,假设我们希望该username
列成为必需列,则需要更改表创建语句并NOT NULL
在该列旁边包含username
以下内容:
CREATE TABLE users
(
id INT,
username VARCHAR(255) NOT NULL,
about TEXT,
birthday DATE,
active BOOL
);
这样,当您尝试添加新用户时,MySQL 会让您知道该username
列是必需的。
指定主键
主键列(在我们的例子中是id
列)是我们用户的唯一标识符。
我们希望该id
列是唯一的,并且,每当我们添加新用户时,我们希望每个新用户的用户 ID 都会自动增加。
这可以通过主键和来实现。主键列也AUTO_INCREMENT
需要。NOT NULL
如果我们要改变表创建语句,它将看起来像这样:
CREATE TABLE users
(
id INT PRIMARY KEY AUTO_INCREMENT,
username VARCHAR(255) NOT NULL,
about TEXT,
birthday DATE,
active BOOL
);
更新表格
在上面的例子中,我们创建了一个新表,然后因为表为空就将其删除。然而,在实际场景中,这种情况确实会发生。
因此,无论何时需要在特定表中添加或删除新列,都需要使用该ALTER TABLE
语句。
假设我们想email
在表中添加一个类型为 varchar 的列users
。
语法如下:
ALTER TABLE users ADD email VARCHAR(255);
之后,如果您要描述该表,您将看到新的列:
DESCRIBE users;
输出:
+----------+--------------+------+-----+---------+
| Field | Type | Null | Key | Default |
+----------+--------------+------+-----+---------+
| id | int | NO | PRI | NULL |
| username | varchar(255) | NO | | NULL |
| about | text | YES | | NULL |
| birthday | date | YES | | NULL |
| active | tinyint(1) | YES | | NULL |
| email | varchar(255) | YES | | NULL |
+----------+--------------+------+-----+---------+
如果您想要删除特定列,语法如下:
ALTER TABLE table_name DROP COLUMN column_name;
注意:请记住这是一个永久性的更改,如果特定列中有任何关键数据,它将立即被删除。
您ALTER TABLE
还可以使用该语句更改特定列的数据类型。例如,您可以将about
列从更改TEXT
为LONGTEXT
类型,以便容纳更长的字符串。
注意:需要注意的是,如果某个表已经包含某种类型的数据值(例如整数),则无法将其更改为 varchar 类型。只有当该列不包含任何值时,才可以进行更改。
基本语法
在本章中,我们将介绍基本的 SQL 语法。
SQL 语句本质上是针对特定数据库运行的“命令”。通过 SQL 语句,您可以告诉 MySQL 您希望它执行的操作。例如,如果您想获取表username
中存储的所有用户信息users
,则可以运行以下 SQL 语句:
SELECT username FROM users ;
声明摘要:
SELECT
:首先,我们指定SELECT
关键字,表示我们要从数据库中选择一些数据。其他常用关键字包括:INSERT
、UPDATE
和DELETE
。username
:然后我们指定要选择哪一列users
:之后,我们指定要从中选择数据的表。- 是
;
必需的。每个 SQL 语句都需要以分号结尾。
如果您运行上述语句,您将不会得到任何结果,因为users
我们刚刚创建的新表是空的。
作为一种良好做法,所有 SQL 关键字都应大写,但是,如果使用小写也可以。
接下来我们继续介绍基本操作。
插入
要向数据库添加数据,您可以使用该INSERT
语句。
让我们使用上一章中创建的表并将 1 个用户插入到users
表中:
INSERT INTO users(username, email, active) VALUES('bobby', 'bobby@bobbyiliev.com', true);
插入语句的概要:
INSERT INTO users
:首先,我们指定INSERT INTO
关键字,它告诉 MySQL 我们要将数据插入users
表中。users (username, email, active)
:然后,我们指定表名users
和要插入数据的列。VALUES
:然后,我们指定要插入的值。
选择
一旦我们插入了该用户,我们就可以继续检索信息。
要从数据库中检索信息,可以使用以下SELECT
语句:
SELECT * FROM users;
输出:
+----+----------+-------+----------+--------+---------------+
| id | username | about | birthday | active | email |
+----+----------+-------+----------+--------+---------------+
| 1 | bobby | NULL | NULL | 1 | bobby@b...com |
+----+----------+-------+----------+--------+---------------+
正如我们在关键字*
后面指定的SELECT
,这意味着我们想要获取表中的所有列users
。
如果我们只想username
和email
列,我们可以将语句更改为:
SELECT username,email FROM users;
这将返回所有用户,但目前我们只有 1 个:
+----------+----------------------+
| username | email |
+----------+----------------------+
| bobby | bobby@bobbyiliev.com |
+----------+----------------------+
更新
为了修改数据库中的数据,您可以使用该UPDATE
语句。
语法如下:
UPDATE users SET username='bobbyiliev' WHERE id=1;
声明摘要:
UPDATE users
:首先,我们指定UPDATE
关键字,然后是要更新的表username='bobbyiliev'
然后我们指定要更新的列和要设置的新值。WHERE id=1
:最后,通过使用WHERE
子句,我们指定要更新哪个用户。在我们的例子中,是 ID 为 1 的用户。
注意:如果我们不指定
WHERE
子句,表中的所有条目都users
将被更新,并且所有用户的 都会被设置username
为。使用不带子句的语句bobbyiliev
时需要小心,因为每一行都会被更新。UPDATE
WHERE
我们将WHERE
在接下来的几章中更深入地讨论。
删除
顾名思义,该DELETE
语句将从数据库中删除数据。
语法如下:
DELETE FROM users WHERE id=1;
与语句类似UPDATE
,如果您不指定WHERE
子句,表中的所有条目都将受到影响,这意味着您的所有用户都将被删除。
评论
如果您正在编写较大的 SQL 脚本,添加一些注释可能会有所帮助,以便稍后当您返回脚本时,您就会知道每一行的作用。
与所有编程语言一样,您也可以在 SQL 中添加注释。
评论有两种类型:
- 内联评论:
为此,您只需--
在要注释掉的文本前添加:
SELECT * FROM users; -- Get all users
- 多行注释
与其他一些编程语言类似,为了注释多行,您可以/*
*/
按如下方式包装文本:
/*
Get all of the users
from your database
*/
SELECT * FROM users;
您可以将其写入.sql
文件中,然后稍后运行它,或者直接执行这几行。
结论
这些是一些最常见的基本 SQL 语句。
如果您想了解有关 SQL 的更多信息,请务必查看我在 GitHub 上的免费电子书:
为了支持我,您可以在 Twitter 上关注我:@bobbyiliev_。
如果您已经了解基础知识,我建议您查看Materialize。Materialize是一个提供增量视图更新的响应式数据库。Materialize 帮助开发人员使用标准 SQL 轻松构建流数据。
鏂囩珷鏉ユ簮锛�https://dev.to/bobbyiliev/the-missing-sql-basics-crash-course-323l