当前位置: 首页 > article >正文

Cyber Security 101-Web Hacking-SQL Fundamentals(SQL 基础知识)

了解如何执行基本 SQL 查询来检索和管理数据库中的数据。

任务1:介绍

介绍

网络安全是一个广泛的主题,涵盖广泛的主题,但其中很少有像数据库那样无处不在。无论您是在努力保护 Web 应用程序、在 SOC 中工作并使用 SIEM、配置用户身份验证/访问控制,还是使用恶意软件分析/威胁检测工具(列表不胜枚举),您都将在某种程度上依赖于数据库。例如,在安全性的进攻方面,它可以帮助我们更好地了解 SQL 漏洞(例如 SQL 注入),并创建查询来帮助我们篡改或检索受感染服务中的数据。另一方面,从防御方面来看,它可以帮助我们浏览数据库并找到可疑活动或相关信息;它还可以通过在需要时实施限制来帮助我们更好地保护服务。

因为数据库无处不在,所以了解它们很重要,而这个房间将是您朝着这个方向迈出的第一步。在掌握 SQL 之前,我们将介绍数据库的基础知识,涵盖关键术语、概念和不同的类型。

会议室先决条件

这个房间是专门为初学者编写的。因此,几乎没有 IT 经验的用户将能够关注这个房间,而无需事先完成我们的任何材料。但是,下载 Linux 基础知识会有所帮助。

学习目标

  • 了解什么是数据库,以及关键术语和概念
  • 了解不同类型的数据库
  • 了解什么是 SQL
  • 了解并能够使用 SQL CRUD 操作
  • 了解并能够使用 SQL 子句操作
  • 了解并能够使用 SQL 操作
  • 了解并能够使用 SQL 运算符
  • 了解并能够使用 SQL 函数

任务2:Databases 101数据库 101

数据库简介

好的,你已经被告知它们有多重要。现在,是时候首先了解它们是什么了。正如简介中提到的,数据库无处不在,您很可能与正在使用它们的系统进行交互。数据库是结构化信息或数据的有序集合,易于访问,可以进行操作或分析。这些数据可以有多种形式,例如用户身份验证数据(例如用户名和密码),这些数据在对应用程序或站点进行身份验证时被存储和检查(例如 TryHackMe),社交媒体上用户生成的数据(如 Instagram 和 Facebook),其中收集和存储用户帖子、评论、点赞等数据,以及由 Netflix 等流媒体服务存储并用于生成建议。

我相信您明白了:数据库被广泛使用,可以包含许多不同的内容。使用数据库的不仅仅是大型企业。小型企业在设置时几乎肯定必须配置数据库来存储他们的数据。说到各种类型的数据库,现在让我们看一下它们是什么。

不同类型的数据库

现在,有道理的是,某样东西被这么多人使用,并且(相对)使用的时间如此之长,以至于会有多种类型的实现。可以构建相当多不同类型的数据库,但在这个介绍性房间中,我们将重点介绍两种主要类型:关系数据库(又名 SQL)非关系数据库(又名 NoSQL)。

关系数据库:存储结构化数据,这意味着插入到此数据库中的数据遵循结构。例如,收集的用户数据包括 first_name、last_name、email_address、用户名和密码。当新用户加入时,将按照此结构在数据库中创建一个条目。这些结构化数据存储在表中的行和列中(所有这些内容将在后面介绍);然后,可以在两个或多个表(例如,User 和 order_history)之间建立关系,因此称为关系数据库。

非关系数据库: 不要以上述方式存储数据,而是以非表格格式存储数据。例如,如果正在扫描的文档,其中可能包含不同类型和数量的数据,并且存储在需要非表格格式的数据库中。下面是一个可能如下所示的示例:

{
    _id: ObjectId("4556712cd2b2397ce1b47661"),
    name: { first: "Thomas", last: "Anderson" },
    date_of_birth: new Date('Sep 2, 1964'),
    occupation: [ "The One"],
    steps_taken : NumberLong(4738947387743977493)
}

就应该选择什么数据库而言,它总是归结为将使用数据库的上下文。 当存储的数据将以一致的格式可靠地接收时,通常会使用关系数据库,其中准确性很重要,例如在处理电子商务交易时。 另一方面,当接收的数据格式可能有很大差异,但需要在同一地方收集和组织时,非关系数据库会得到更好的使用,例如社交媒体平台收集用户生成的内容。

Tables, Rows and Columns(表、行和列)

现在我们已经定义了两种主要类型的数据库,我们将重点介绍关系数据库。我们首先要解释。存储在关系数据库中的所有数据都将存储在表中;例如,书店库存的书籍集合可能存储在名为 “Books” 的表中。

创建此表时,您需要定义定义书籍记录所需的信息,例如,“id”、“Name” 和 “Published_date”。然后,这些将成为您的;定义这些列时,您还将定义此列应包含的数据类型;如果尝试将记录插入数据类型不匹配的数据库中,则会被拒绝。可以定义的数据类型可能因您使用的数据库而异,但所有数据类型都包括字符串(单词和字符的集合)、整数(数字)、浮点数/小数(带小数点的数字)和时间/日期。

使用定义的列创建表后,第一条记录将插入到数据库中,例如,一本名为“Android Security Internals”的书,其 ID 为“1”,发布日期为“2014-10-14”。插入后,此记录将表示为一行

主键和外键(Primary and Foreign Keys)

定义并填充表后,可能需要存储更多数据。例如,我们想要创建一个名为 “Authors” 的表,用于存储商店中销售的书籍的作者。这是一个非常明显的关系示例。书籍 (存储在 Books 表中) 由作者编写 (存储在 Authors 表中)。如果我们想查询故事中的一本书,但又要返回该书的作者,则需要以某种方式关联我们的数据;我们使用 keys 来做到这一点。有两种类型的密钥

主键:主键用于保证某一列采集的数据是唯一的。也就是说,需要有一种方法来标识表中存储的每条记录,该值对于该记录是唯一的,并且不会被该表中的任何其他记录重复。想想大学的入学人数;这些是分配给学生的编号,因此可以在记录中唯一标识它们(因为有时学生可以具有相同的姓名)。必须在每个表中选择一个列作为主键;在我们的示例中,“id”最有意义,因为已为每本书唯一创建了 ID,因为书籍可以具有相同的出版日期或(在极少数情况下)书名。请注意,表中只能有一个主键列。

外键:外键是表中的一列(或多列),它也存在于数据库内的另一个表中,因此在两个表之间提供链接。在我们的示例中,考虑向 “Books” 表添加 “author_id” 字段;这将充当外键,因为我们 Books 表中的 author_id对应于 author 表中的 “id” 列。外键允许关系数据库中不同表之间的关系。请注意,一个表中可以有多个外键列。

任务3:SQL

什么是 SQL?

现在,所有这些理论上听起来都不错,但在实践中,数据库是如何工作的呢?您将如何制作您的第一个表并用数据填充它?你会用什么?数据库通常使用数据库管理系统 (DBMS) 进行控制。DBMS 作为最终用户和数据库之间的接口,是一种允许用户检索、更新和管理所存储数据的软件程序。DBMS 的一些示例包括 MySQL、MongoDB、Oracle Database 和 Maria DB。

最终用户和数据库之间的交互可以使用 SQL(结构化查询语言)来完成。SQL 是一种编程语言,可用于查询、定义和操作存储在关系数据库中的数据。

SQL 和关系数据库的优势

SQL 几乎与数据库本身一样无处不在,这是有充分理由的。以下是学习和使用 SQL 带来的一些好处:

  • 的速度很快: 关系数据库(又名使用 SQL 的数据库)由于使用的存储空间很少且处理速度快,几乎可以立即返回大量数据。
  • 简单易学: 与许多编程语言不同,SQL 是用简单的英语编写的,因此更容易上手。该语言的高度可读性意味着用户可以专注于学习功能和语法。
  • 可靠: 如前所述,关系数据库可以通过定义数据集必须归入的严格结构来保证数据的准确性。
  • 灵活:SQL 在查询数据库时提供了各种功能;这使用户可以非常有效地执行大量的数据分析任务。

动手实践

现在我们已经介绍了 SQL 是什么,是时候动手实践并开始自己使用它了!单击绿色的“Start Machine”按钮。本机将在分屏视图中启动。如果 VM 不可见,请使用页面顶部的蓝色 Show Split View 按钮。计算机完成启动后,打开终端并运行以下命令:

启动机器
1.登录数据库
user@tryhackme$ mysql -u root -p

2.输入密码tryhackme

user@tryhackme$ mysql -u root -p

 任务4:数据库和表语句

是时候学习了

现在,有趣的部分!是时候开始学习 SQL 以及如何使用它与数据库交互了。在此任务中,我们将从学习使用 database 和 table 语句开始。毕竟,我们最初需要这些语句来创建我们的数据库 / 表并开始。

数据库语句

创建数据库

如果需要新数据库,第一步是创建它。这可以在 SQL 中使用 statement 来完成 。

这将使用以下语法完成:CREATE DATABASE

mysql> CREATE DATABASE database_name;

 运行以下命令以创建名为thm_bookmarket_db 的数据库。

mysql> CREATE DATABASE thm_bookmarket_db;
 显示数据库

在我们已经创建了一个数据库,可以使用 SHOW DATABASES 语句查看它。SHOW DATABASES 语句将返回当前数据库的列表。按如下方式运行该语句:

mysql> SHOW DATABASES;

在返回的列表中,您应该看到刚刚创建的数据库和默认包含的一些数据库(mysql、information_scheme、performance_scheme 和 sys),这些数据库用于使 mysql 能够运行的各种目的。此外,还提供了本课程所需的各种表格。

使用数据库

创建数据库后,您可能希望与它进行交互。在我们与它交互之前,我们需要告诉 mysql 我们想与哪个数据库交互(这样它就知道要针对哪个数据库运行后续查询)。要将我们刚刚创建的数据库设置为活动数据库,我们将按如下方式运行 USE 语句(确保在您的计算机上运行该语句):

mysql> USE thm_bookmarket_db;
删除数据库

一旦不再需要数据库(可能是出于测试目的而创建的,或者不再需要),就可以使用 DROP 语句将其删除。要删除数据库,我们将使用以下语句语法(尽管在我们的例子中,我们希望保留我们的数据库,因此无需自己运行此数据库!

mysql> DROP database database_name;

Table 语句

现在,您可以创建、列出、使用和删除数据库,是时候研究如何使用表填充这些数据库并与这些表交互了。 

创建表

按照数据库语句的逻辑,创建表也使用 CREATE 语句。一旦数据库处于活动状态(您已对其运行 USE 语句),就可以使用以下语句语法在其中创建一个表:

mysql> CREATE TABLE example_table_name (
    example_column1 data_type,
    example_column2 data_type,
    example_column3 data_type
);

正如你所看到的,这里涉及的要多得多。在 Databases 101 任务中,我们介绍了如何以及何时创建表;必须确定哪些列将构成该表中的记录,以及该列中预期包含的数据类型。这就是此处此语法所表示的内容。在此示例中,有 3 个示例列,但 SQL 支持许多列(超过 1000 个)。让我们尝试使用以下语句用表格填充我们的 thm_bookmarket_db

mysql> CREATE TABLE book_inventory (
    book_id INT AUTO_INCREMENT PRIMARY KEY,
    book_name VARCHAR(255) NOT NULL,
    publication_date DATE
);

此语句将创建一个包含三列的表book_inventorybook_idbook_name 和 publication_datebook_id 是一个 INT (整数),因为它应该只是一个数字.

 AUTO_INCREMENT存在,这意味着插入的第一本书将被分配book_id 1,插入的第二本书将被分配 2 的book_id,依此类推。

最后,book_id 设置为 PRIMARY KEY,因为它将是我们唯一标识表中书籍记录的方式(并且 primary 必须存在于表中)。

Book_name具有数据类型 ,这意味着它可以更改字符(文本/数字/标点符号),并且设置了 255 个字符的限制,并且 ,这意味着它不能为空(因此,如果有人尝试将记录插入此表,但book_name为空,它将被拒绝。Publication_date 设置为 数据类型 。VARCHAR(255)NOT NULLDATE

显示表格 

正如我们可以使用 SHOW 语句列出数据库一样,我们也可以列出当前活动数据库(我们上次使用 USE 语句的数据库)中的表。运行以下命令,您应该会看到刚刚创建的表:

mysql> SHOW TABLES;
描述 

如果我们想知道表中包含哪些列(以及它们的数据类型),我们可以使用 DESCRIBE 命令(也可以缩写为 DESC)来描述它们。使用以下命令描述您刚刚创建的表:

mysql> DESCRIBE book_inventory;

这将为您提供表的详细视图,如下所示:

mysql> DESCRIBE book_inventory;
+------------------+--------------+------+-----+---------+----------------+
| Field            | Type         | Null | Key | Default | Extra          |
+------------------+--------------+------+-----+---------+----------------+
| book_id          | int          | NO   | PRI | NULL    | auto_increment |
| book_name        | varchar(255) | NO   |     | NULL    |                |
| publication_date | date         | YES  |     | NULL    |                |
+------------------+--------------+------+-----+---------+----------------+
3 rows in set (0.02 sec)
改变 

创建表后,有时您对数据集的需求可能会发生变化,您需要更改表。这可以使用 ALTER 语句来完成。现在让我们想象一下,我们已经决定实际上希望在书籍清单中有一个列,其中包含每本书的页数。使用以下语句将其添加到我们的表中:

mysql> ALTER TABLE book_inventory
ADD page_count INT;
 

与删除数据库类似,您也可以使用 DROP 语句删除表。我们不需要这样做,但您将为此使用的语法是:

mysql> DROP TABLE table_name;

任务5:CRUD操作

CRUD 系列

CRUD 代表 Create、Read、Update 和 Delete,它们被认为是任何管理数据的系统中的基本操作。

让我们探索一下使用 MySQL 时的所有这些不同操作。 在接下来的两个任务中,我们将使用属于数据库thm_books的 books 表。我们可以通过语句 .use thm_books;

创建操作 (INSERT)

Create 操作将在表中创建新记录。在 MySQL 中,这可以通过使用 statement 来实现,如下所示。INSERT INTO

mysql> INSERT INTO books (id, name, published_date, description)
    VALUES (1, "Android Security Internals", "2014-10-14", "An In-Depth Guide to Android's Security Architecture");

Query OK, 1 row affected (0.01 sec)

正如我们所观察到的,该语句指定了一个表,在本例中为 books,您可以在其中添加新记录;列 IDNamepublished_date 和 Description 是表中的记录。在此示例中,添加了一条 id 为 1名称“Android Security Internals”、published_date为“2014-10-14”的新记录,以及“Android Security Internals 提供了对 Android 设备安全内部的全面了解的说明INSERT INTO

注意:此操作已存在于数据库中,因此无需运行查询。

这里有个错误,就是主键冲突。

看了表中的字段,发现已经又6个字段了。

读取操作 (SELECT)

顾名思义,Read 操作用于从表中读取或检索信息。我们可以使用该语句从表中获取一列或所有列,如下例所示。SELECT

mysql> SELECT * FROM books;
+----+----------------------------+----------------+------------------------------------------------------+
| id | name                       | published_date | description                                          |
+----+----------------------------+----------------+------------------------------------------------------+
|  1 | Android Security Internals | 2014-10-14     | An In-Depth Guide to Android's Security Architecture |
+----+----------------------------+----------------+------------------------------------------------------+

1 row in set (0.00 sec)         

上述 output 语句后跟一个符号,指示应检索所有列,后跟子句和表名,在本例中为 booksSELECT*FROM

如果我们想选择像 name 和 description 这样的特定列,我们应该指定它们而不是 symbol,如下所示。*

mysql> SELECT name, description FROM books;
+----------------------------+------------------------------------------------------+
| name                       | description                                          |
+----------------------------+------------------------------------------------------+
| Android Security Internals | An In-Depth Guide to Android's Security Architecture |
+----------------------------+------------------------------------------------------+

1 row in set (0.00 sec)     

更新操作 (UPDATE)

Update 操作修改表中的现有记录,并且相同的语句 , 可用于此目的。UPDATE

mysql> UPDATE books
    SET description = "An In-Depth Guide to Android's Security Architecture."
    WHERE id = 1;

Query OK, 1 row affected (0.00 sec)
Rows matched: 1  Changed: 1  Warnings: 0     

该语句指定了 table,在本例中为 books,然后我们可以使用 后跟我们将更新的列名。子句指定在满足子句时要更新的行,在本例中为 id 为 1 的行。UPDATESETWHERE

删除操作 (DELETE)

删除操作从表中删除记录。我们可以通过 statement 来实现这一点。DELETE

注意: 无需运行查询。删除此条目将影响即将到来的任务中的其余示例。

终端
mysql> DELETE FROM books WHERE id = 1;

Query OK, 1 row affected (0.00 sec)    

在上面,我们可以观察到 statement 后跟子句,它允许我们指定要删除记录的表,在本例中为 books,后跟指示它应该是 id 为 1 的子句。DELETE FROM WHERE

总结

总之,CRUD 操作结果对于数据操作以及与数据库交互时至关重要。下面列出了与它们相关的语句。

  • Create (INSERT statement) - 向表中添加新记录。
  • 读取 (SELECT 语句) - 从表中检索记录。
  • Update (UPDATE 语句) - 修改表中的现有数据。
  • Delete (DELETE 语句) - 从表中删除记录。

这些操作使我们能够有效地管理和操作数据库中的数据。

任务6:Clauses第

子句是语句的一部分,用于指定所处理数据的标准,通常由初始语句操作。子句可以帮助我们定义数据类型以及应该如何检索或排序数据。

在前面的任务中,我们已经使用了一些子句,例如 that 用于指定我们正在通过语句访问的表 和 ,它指定应该使用哪些记录。FROMWHERE

此任务将重点介绍其他子句:DISTINCTGROUP BYORDER  BY 和HAVING 。

DISTINCT 子句

DISTINCT子句用于在执行查询时避免重复记录,仅返回唯一值。

让我们使用一个查询SELECT * FROM books 并观察下面的结果。

mysql> SELECT * FROM books;
+----+----------------------------+----------------+--------------------------------------------------------+
| id | name                       | published_date | description                                            |
+----+----------------------------+----------------+--------------------------------------------------------+
|  1 | Android Security Internals | 2014-10-14     | An In-Depth Guide to Android's Security Architecture   |
|  2 | Bug Bounty Bootcamp        | 2021-11-16     | The Guide to Finding and Reporting Web Vulnerabilities |
|  3 | Car Hacker's Handbook      | 2016-02-25     | A Guide for the Penetration Tester                     |
|  4 | Designing Secure Software  | 2021-12-21     | A Guide for Developers                                 |
|  5 | Ethical Hacking            | 2021-11-02     | A Hands-on Introduction to Breaking In                 |
|  6 | Ethical Hacking            | 2021-11-02     |                                                        |
+----+----------------------------+----------------+--------------------------------------------------------+

6 rows in set (0.00 sec)

查询的输出显示 table books 的所有内容,并且记录 Ethical Hacking 显示两次。让我们再次执行查询,但这次使用DISTINCT clause.

mysql> SELECT DISTINCT name FROM books;
+----------------------------+
| name                       |
+----------------------------+
| Android Security Internals |
| Bug Bounty Bootcamp        |
| Car Hacker's Handbook      |
| Designing Secure Software  |
| Ethical Hacking            |
+----------------------------+

5 rows in set (0.00 sec)

输出显示仅返回 5 行,并且只显示 Ethical Hacking 记录的一个实例。

GROUP BY 子句

GROUP BY子句聚合来自多个记录的数据,并将查询结果分组到列中。这对于聚合函数很有帮助。

mysql> SELECT name, COUNT(*)
    FROM books
    GROUP BY name;
+----------------------------+----------+
| name                       | COUNT(*) |
+----------------------------+----------+
| Android Security Internals |        1 |
| Bug Bounty Bootcamp        |        1 |
| Car Hacker's Handbook      |        1 |
| Designing Secure Software  |        1 |
| Ethical Hacking            |        2 |
+----------------------------+----------+

5 rows in set (0.00 sec)

在上面的示例中,book 表上的记录按COUNT函数的结果重新分组。我们已经知道 Ethical hacking 被列出了两次,所以总数是 2,放在最后,因为它是计数分组的。

ORDER BY 子句

ORDER BY子句可用于按升序或降序对查询返回的记录进行排序。使用像 ASCDESC这样的函数可以帮助我们实现这一点,如下两个示例所示。

升序

mysql> SELECT *
    FROM books
    ORDER BY published_date ASC;
+----+----------------------------+----------------+--------------------------------------------------------+
| id | name                       | published_date | description                                            |
+----+----------------------------+----------------+--------------------------------------------------------+
|  1 | Android Security Internals | 2014-10-14     | An In-Depth Guide to Android's Security Architecture   |
|  3 | Car Hacker's Handbook      | 2016-02-25     | A Guide for the Penetration Tester                     |
|  5 | Ethical Hacking            | 2021-11-02     | A Hands-on Introduction to Breaking In                 |
|  6 | Ethical Hacking            | 2021-11-02     |                                                        |
|  2 | Bug Bounty Bootcamp        | 2021-11-16     | The Guide to Finding and Reporting Web Vulnerabilities |
|  4 | Designing Secure Software  | 2021-12-21     | A Guide for Developers                                 |
+----+----------------------------+----------------+--------------------------------------------------------+

6 rows in set (0.00 sec)

降序

mysql> SELECT *
    FROM books
    ORDER BY published_date DESC;
+----+----------------------------+----------------+--------------------------------------------------------+
| id | name                       | published_date | description                                            |
+----+----------------------------+----------------+--------------------------------------------------------+
|  4 | Designing Secure Software  | 2021-12-21     | A Guide for Developers                                 |
|  2 | Bug Bounty Bootcamp        | 2021-11-16     | The Guide to Finding and Reporting Web Vulnerabilities |
|  5 | Ethical Hacking            | 2021-11-02     | A Hands-on Introduction to Breaking In                 |
|  6 | Ethical Hacking            | 2021-11-02     |                                                        |
|  3 | Car Hacker's Handbook      | 2016-02-25     | A Guide for the Penetration Tester                     |
|  1 | Android Security Internals | 2014-10-14     | An In-Depth Guide to Android's Security Architecture   |
+----+----------------------------+----------------+--------------------------------------------------------+

6 rows in set (0.00 sec)

我们可以看到使用 using 按ASC升序排序和使用 DESC按降序排序时,两者都使用published_date作为参考。

HAVING 子句

HAVING子句与其他子句一起使用,以根据条件筛选记录的组或结果。在 GROUP BY的情况下,它将条件评估为 TRUEFALSE,这WHEREHAVING子句在执行聚合后筛选结果不同。

mysql> SELECT name, COUNT(*)
    FROM books
    GROUP BY name
    HAVING name LIKE '%Hack%';
+-----------------------+----------+
| name                  | COUNT(*) |
+-----------------------+----------+
| Car Hacker's Handbook |        1 |
| Ethical Hacking       |        2 |
+-----------------------+----------+

2 rows in set (0.00 sec)

在上面的示例中,我们可以观察到,正如我们之前学到的那样,查询返回名称中包含单词 hack 和正确计数的书籍。

任务7:Operators运营商

在使用 SQL 以及处理逻辑和比较时,运算符是我们有效筛选和操作数据的方式。了解这些运算符将有助于我们创建更精确、更强大的查询。 在接下来的两个任务中,我们将使用数据库 thm_books2中的 books 表。我们可以通过语句 .use thm_books2;

逻辑运算符

这些运算符测试条件的真值并返回布尔值 or 。接下来,让我们探索其中的一些运算符。TRUEFALSE

LIKE 运算符

运算符通常与子句结合使用,例如 to filter for specific patterns in a column.让我们继续使用 DataBase 来查询其用法的示例。LIKEWHERE

mysql> SELECT *
    FROM books
    WHERE description LIKE "%guide%";
+----+----------------------------+----------------+--------------------------------------------------------+--------------------+
| id | name                       | published_date | description                                            | category           |
+----+----------------------------+----------------+--------------------------------------------------------+--------------------+
|  1 | Android Security Internals | 2014-10-14     | An In-Depth Guide to Android's Security Architecture   | Defensive Security |
|  2 | Bug Bounty Bootcamp        | 2021-11-16     | The Guide to Finding and Reporting Web Vulnerabilities | Offensive Security |
|  3 | Car Hacker's Handbook      | 2016-02-25     | A Guide for the Penetration Tester                     | Offensive Security |
|  4 | Designing Secure Software  | 2021-12-21     | A Guide for Developers                                 | Defensive Security |
+----+----------------------------+----------------+--------------------------------------------------------+--------------------+

4 rows in set (0.00 sec)  

上面的查询返回筛选的书籍中的记录列表,但使用包含单词 guide 的子句的记录 by the operator.WHERELIKE

AND 运算符

该运算符在查询中使用多个条件,并返回所有条件是否都为 true。ANDTRUE

mysql> SELECT *
    FROM books
    WHERE category = "Offensive Security" AND name = "Bug Bounty Bootcamp"; 
+----+---------------------+----------------+--------------------------------------------------------+--------------------+
| id | name                | published_date | description                                            | category           |
+----+---------------------+----------------+--------------------------------------------------------+--------------------+
|  2 | Bug Bounty Bootcamp | 2021-11-16     | The Guide to Finding and Reporting Web Vulnerabilities | Offensive Security |
+----+---------------------+----------------+--------------------------------------------------------+--------------------+
    
1 row in set (0.00 sec)  

上面的查询返回名为 Bug Bounty Bootcamp 的书,该书属于 Offensive Security 类别。

OR 运算符

该运算符将查询中的多个条件组合在一起,如果这些条件中至少有一个为 true,则返回这些条件。ORTRUE

mysql> SELECT *
    FROM books
    WHERE name LIKE "%Android%" OR name LIKE "%iOS%"; 
+----+----------------------------+----------------+------------------------------------------------------+--------------------+
| id | name                       | published_date | description                                          | category           |
+----+----------------------------+----------------+------------------------------------------------------+--------------------+
|  1 | Android Security Internals | 2014-10-14     | An In-Depth Guide to Android's Security Architecture | Defensive Security |
+----+----------------------------+----------------+------------------------------------------------------+--------------------+

1 row in set (0.00 sec)

上面的查询返回名称包括 Android 或 IOS 的书籍。

NOT 运算符

该运算符反转了布尔运算符的值,允许我们排除特定条件。NOT

mysql> SELECT *
    FROM books
    WHERE NOT description LIKE "%guide%";
+----+-----------------+----------------+----------------------------------------+--------------------+
| id | name            | published_date | description                            | category           |
+----+-----------------+----------------+----------------------------------------+--------------------+
|  5 | Ethical Hacking | 2021-11-02     | A Hands-on Introduction to Breaking In | Offensive Security |
+----+-----------------+----------------+----------------------------------------+--------------------+

1 row in set (0.00 sec)

上面的查询返回 description 不包含单词 guide 的结果。

BETWEEN 运算符

该运算符允许我们测试一个值是否存在于定义的范围内BETWEEN

mysql> SELECT *
    FROM books
    WHERE id BETWEEN 2 AND 4;
+----+---------------------------+----------------+--------------------------------------------------------+--------------------+
| id | name                      | published_date | description                                            | category           |
+----+---------------------------+----------------+--------------------------------------------------------+--------------------+
|  2 | Bug Bounty Bootcamp       | 2021-11-16     | The Guide to Finding and Reporting Web Vulnerabilities | Offensive Security |
|  3 | Car Hacker's Handbook     | 2016-02-25     | A Guide for the Penetration Tester                     | Offensive Security |
|  4 | Designing Secure Software | 2021-12-21     | A Guide for Developers                                 | Defensive Security |
+----+---------------------------+----------------+--------------------------------------------------------+--------------------+

3 rows in set (0.00 sec)

上面的查询返回 id 介于 2  4 之间的书籍。

比较运算符

比较运算符用于比较值并检查它们是否满足指定的条件。

等于运算符

(Equal) 运算符比较两个表达式并确定它们是否相等,或者它可以检查一个值是否与特定列中的另一个值匹配。=

mysql> SELECT *
    FROM books
    WHERE name = "Designing Secure Software";
+----+---------------------------+----------------+------------------------+--------------------+
| id | name                      | published_date | description            | category           |
+----+---------------------------+----------------+------------------------+--------------------+
|  4 | Designing Secure Software | 2021-12-21     | A Guide for Developers | Defensive Security |
+----+---------------------------+----------------+------------------------+--------------------+

1 row in set (0.10 sec)

上面的查询返回具有确切名称 Designing Secure Software 的书籍。

不等于运算符

(不等于)运算符比较表达式并测试它们是否相等;它还检查值是否与列中的值不同。!=

mysql> SELECT *
    FROM books
    WHERE category != "Offensive Security";
+----+----------------------------+----------------+------------------------------------------------------+--------------------+
| id | name                       | published_date | description                                          | category           |
+----+----------------------------+----------------+------------------------------------------------------+--------------------+
|  1 | Android Security Internals | 2014-10-14     | An In-Depth Guide to Android's Security Architecture | Defensive Security |
|  4 | Designing Secure Software  | 2021-12-21     | A Guide for Developers                               | Defensive Security |
+----+----------------------------+----------------+------------------------------------------------------+--------------------+

2 rows in set (0.00 sec)

上面的查询返回除类别为 Offensive Security 的书籍以外的书籍。

小于运算符

小于运算符

(小于) 运算符将比较具有给定值的表达式是否小于提供的表达式。<

mysql> SELECT *
    FROM books
    WHERE published_date < "2020-01-01";
+----+----------------------------+----------------+------------------------------------------------------+--------------------+
| id | name                       | published_date | description                                          | category           |
+----+----------------------------+----------------+------------------------------------------------------+--------------------+
|  1 | Android Security Internals | 2014-10-14     | An In-Depth Guide to Android's Security Architecture | Defensive Security |
|  3 | Car Hacker's Handbook      | 2016-02-25     | A Guide for the Penetration Tester                   | Offensive Security |
+----+----------------------------+----------------+------------------------------------------------------+--------------------+

2 rows in set (0.00 sec)

上面的查询返回 2020 年 1 月 1 日之前出版的书籍。

大于运算符

(greater than) 运算符比较具有给定值的表达式是否大于提供的表达式。>

mysql> SELECT *
    FROM books
    WHERE published_date > "2020-01-01";
+----+---------------------------+----------------+--------------------------------------------------------+--------------------+
| id | name                      | published_date | description                                            | category           |
+----+---------------------------+----------------+--------------------------------------------------------+--------------------+
|  2 | Bug Bounty Bootcamp       | 2021-11-16     | The Guide to Finding and Reporting Web Vulnerabilities | Offensive Security |
|  4 | Designing Secure Software | 2021-12-21     | A Guide for Developers                                 | Defensive Security |
|  5 | Ethical Hacking           | 2021-11-02     | A Hands-on Introduction to Breaking In                 | Offensive Security |
+----+---------------------------+----------------+--------------------------------------------------------+--------------------+

3 rows in set (0.00 sec)

上面的查询返回 2020 年 1 月 1 日之后出版的书籍。

小于或等于和大于或等于运算符

(Less than or equal) 运算符比较具有给定值的表达式是否小于或等于提供的表达式。另一方面,(大于或等于)运算符比较具有给定值的表达式是否大于或等于提供的表达式。让我们在下面观察两者的一些示例。<=>=

mysql> SELECT *
    FROM books
    WHERE published_date <= "2021-11-15";
+----+----------------------------+----------------+------------------------------------------------------+--------------------+
| id | name                       | published_date | description                                          | category           |
+----+----------------------------+----------------+------------------------------------------------------+--------------------+
|  1 | Android Security Internals | 2014-10-14     | An In-Depth Guide to Android's Security Architecture | Defensive Security |
|  3 | Car Hacker's Handbook      | 2016-02-25     | A Guide for the Penetration Tester                   | Offensive Security |
|  5 | Ethical Hacking            | 2021-11-02     | A Hands-on Introduction to Breaking In               | Offensive Security |
+----+----------------------------+----------------+------------------------------------------------------+--------------------+

3 rows in set (0.00 sec)

上面的查询返回 2021 年 11 月 15 日或之前出版的书籍。

mysql> SELECT *
    FROM books
    WHERE published_date >= "2021-11-02";
+----+---------------------------+----------------+--------------------------------------------------------+--------------------+
| id | name                      | published_date | description                                            | category           |
+----+---------------------------+----------------+--------------------------------------------------------+--------------------+
|  2 | Bug Bounty Bootcamp       | 2021-11-16     | The Guide to Finding and Reporting Web Vulnerabilities | Offensive Security |
|  4 | Designing Secure Software | 2021-12-21     | A Guide for Developers                                 | Defensive Security |
|  5 | Ethical Hacking           | 2021-11-02     | A Hands-on Introduction to Breaking In                 | Offensive Security |
+----+---------------------------+----------------+--------------------------------------------------------+--------------------+

3 rows in set (0.00 sec)

上面的查询返回在 2021 年 11 月 2 日或之后出版的书籍。

 

任务8:Functions功能

在处理数据时,函数可以帮助我们简化查询和操作并操作数据。接下来,让我们探索其中的一些函数。

字符串函数

字符串函数对字符串执行操作,返回与其关联的值。

CONCAT() 函数

此函数用于将两个或多个字符串相加。合并来自不同列的文本非常有用。

mysql> SELECT CONCAT(name, " is a type of ", category, " book.") AS book_info FROM books;
+------------------------------------------------------------------+
| book_info                                                         |
+------------------------------------------------------------------+
| Android Security Internals is a type of Defensive Security book. |
| Bug Bounty Bootcamp is a type of Offensive Security book.        |
| Car Hacker's Handbook is a type of Offensive Security book.      |
| Designing Secure Software is a type of Defensive Security book.  |
| Ethical Hacking is a type of Offensive Security book.            |
+------------------------------------------------------------------+

5 rows in set (0.00 sec)  

此查询将 books 表中的 name 和 category 列连接为一个名为 book_info 的列。

GROUP_CONCAT() 函数

这个函数可以帮助我们将多行中的数据连接到一个字段中。让我们来探讨一下它的用法示例。

mysql> SELECT category, GROUP_CONCAT(name SEPARATOR ", ") AS books
    FROM books
    GROUP BY category;
+--------------------+-------------------------------------------------------------+
| category           | books                                                       |
+--------------------+-------------------------------------------------------------+
| Defensive Security | Android Security Internals, Designing Secure Software       |
| Offensive Security | Bug Bounty Bootcamp, Car Hacker's Handbook, Ethical Hacking |
+--------------------+-------------------------------------------------------------+

2 rows in set (0.01 sec)

上面的查询按类别书籍进行分组,并将每个类别中的书籍标题连接到一个字符串中。

SUBSTRING() 函数

此函数将从查询中的字符串中检索子字符串,从确定的位置开始。还可以指定此子字符串的长度。

mysql> SELECT SUBSTRING(published_date, 1, 4) AS published_year FROM books;
+----------------+
| published_year |
+----------------+
| 2014           |
| 2021           |
| 2016           |
| 2021           |
| 2021           |
+----------------+

5 rows in set (0.00 sec)  

在上面的查询中,我们可以观察它如何从 published_date 列中提取前四个字符并将其存储在 published_year 列中。

LENGTH() 函数

此函数返回字符串中的字符数。这包括空格和标点符号。我们可以在下面找到一个例子。

mysql> SELECT LENGTH(name) AS name_length FROM books;
+-------------+
| name_length |
+-------------+
|          26 |
|          19 |
|          21 |
|          25 |
|          15 |
+-------------+

5 rows in set (0.00 sec)  

正如我们在上面观察到的,查询计算 name 列中字符串的长度,并将其存储在名为 name_length 的列中。

聚合函数

这些函数聚合查询中一个指定条件内多个行的值;它可以将多个值合并为一个结果。

COUNT() 函数

此函数返回表达式中的记录数,如下例所示。

mysql> SELECT COUNT(*) AS total_books FROM books;
+-------------+
| total_books |
+-------------+
|           5 |
+-------------+

1 row in set (0.01 sec)

上面的查询计算了 books 表中的总行数。结果是 5,因为 books 表中有 5 本书,并且它存储在 total_books 列中。

SUM() 函数

此函数对确定列的所有值(非 NULL)求和。

注意:无需执行此查询。这只是为了示例目的。

mysql> SELECT SUM(price) AS total_price FROM books;
+-------------+
| total_price |
+-------------+
|      249.95 |
+-------------+

1 row in set (0.00 sec)

上面的查询计算 price 列的总和。结果提供列 total_price 中所有书籍的总价格。

MAX() 函数

此函数计算表达式中 provided 列中的最大值。

mysql> SELECT MAX(published_date) AS latest_book FROM books;
+-------------+
| latest_book |
+-------------+
| 2021-12-21  |
+-------------+

1 row in set (0.00 sec)

上面的查询从 books 表中检索最新的出版物(最大值)日期。结果 2021-12-21 存储在列 latest_book 中。

MIN() 函数

此函数计算表达式中所提供列中的最小值。

mysql> SELECT MIN(published_date) AS earliest_book FROM books;
+---------------+
| earliest_book |
+---------------+
| 2014-10-14    |
+---------------+

1 row in set (0.00 sec)

上面的查询从 books 表中检索最早的出版 (最小值) 日期。结果 2014-10-14 存储在 earliest_book 列中。

 USB Rubber Ducky 

任务9:结论

恭喜您学完 SQL 基础知识!希望这个房间已经教会了您数据库在计算中的重要性;有这么多用例(我们在日常生活中经常接触),如果您想从事网络安全领域的职业,学习基础知识是必须的。最后,让我们总结一下这个房间里的所有内容:

  • 数据库是易于访问、可操作或分析的有组织数据或信息的集合。
  • 数据库的两种主要类型是关系数据库(用于存储结构化数据)和非关系数据库(用于以非表格格式存储数据)。
  • 关系数据库由 Tables、columns 和 rows 组成。主键可以确保记录在表中是唯一的,而外键可以允许在两个(或多个)表之间建立关系/连接。
  • SQL 是一种易于学习的编程语言,可用于与关系数据库交互。
  • Database 和 Table 语句可用于创建/操作数据库和表。
  • CRUD 操作(INSERT、SELECT、UPDATE 和 DELETE)可用于管理数据库中的数据。
  • 在 SQL 中,我们可以使用子句来定义应该如何检索、过滤、排序或分组数据。
  • 运算符函数的有效使用可以帮助我们过滤和操作 SQL 中的数据。

这个房间到此结束。点击下面的按钮完成房间!


http://www.kler.cn/a/465800.html

相关文章:

  • spring mvc源码学习笔记之六
  • Synthesia技术浅析(二):虚拟人物视频生成
  • 【Android项目学习】3. MVVMHabit
  • 【AutoSAR】【底软自动化】Arxml自动配置平台
  • 麒麟服务器安装kafka--亲测
  • 《前端web开发-CSS3基础-1》
  • Vue3 子组件向父组件传递消息(Events)
  • 2024年变题后华为数通H12-821更新题库
  • SQL Server中最大并行度详解
  • 腾讯云OCR在制造业的应用:内存模组产品识别实战指南
  • 只谈C++11新特性 - 内联命名空间
  • 家政预约小程序06活动展示
  • 企业网络综合组网
  • Couchbase 的分布式查询引擎(N1QL Query Engine)
  • Onedrive精神分裂怎么办(有变更却不同步)
  • 日常工作常用命令集合
  • SD下载、安装、使用、卸载-Stable Diffusion整合包v4.10发布!
  • 库伦值自动化功耗测试工具
  • CSS篇之炫酷框
  • 强力巨彩租赁屏:满足市场需求,打造视觉焦点
  • LeetCode2894 分类求和并作并作差
  • 关于mybatis的框架方面的问题
  • 中关村科金智能呼叫中心能为传统呼叫中心带来什么样的变革?
  • 2025.01.02(数据库)
  • form的方法
  • 结构型模式6.享元模式