【THM】SQL Fundamentals(SQL基础知识)-学习

本文相关的TryHackMe实验房间链接:https://tryhackme.com/r/room/sqlfundamentals

本文相关内容:了解如何执行基本的 SQL 查询来检索和管理数据库中的数据。

image-20250107223605978

介绍

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

由于数据库无处不在,因此了解它们非常重要,学习本文内容将会是你朝这个方向迈出的第一步。在掌握SQL之前,我们还将了解与数据库相关的一些基础知识,主要将涵盖数据库的关键术语、概念和数据库的不同类型。

image-20250110232656979

前置学习条件

本文的知识点内容是专门为初学者而编写的。因此,即使没有太多IT经验的用户也能够学习本文内容,而无需事先了解其他任何材料。然而,掌握Linux基础知识对于学习本文内容将会有所帮助。

学习目标

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

数据库基础

数据库简介

好的,你已经知道它们有多重要了。现在,是时候了解它们是什么了。正如本文的介绍部分中所提到的,数据库几乎无处不在,你很可能正在与使用它们的系统进行交互。数据库是结构化信息或数据的有组织的集合,易于访问并且可以被操作或被分析。这些数据可以采用多种形式,例如用户身份验证数据(用户名和密码),此类数据会在对应用程序或网站(例如TryHackMe)进行身份验证时进行存储和检查;社交媒体上用户生成的数据(例如Instagram和Facebook),其中会收集和存储用户帖子、评论、点赞等数据,以及由 Netflix 等流媒体服务存储并用于生成推荐的观看历史记录等信息。

我相信你明白这一点:数据库正在被广泛使用并且可以包含许多不同的东西。使用数据库的不仅仅是大规模企业,规模较小的企业在IT生产环境设置时几乎肯定需要配置数据库来存储其数据。谈到数据库的种类,接下来让我们看看它们有哪些种类。

不同类型的数据库

某种东西被如此多的人使用并且使用时间如此之长,以至于它会有多种类型的实现,这是我们通常可以理解的。我们可以构建多种不同类型的数据库,但在本文的内容中,我们将重点关注两种主要的数据库类型:关系型数据库(又名SQL )与非关系型数据库(又名 NoSQL)。

relational databases (SQL) vs non-relational databases (NoSQL)

image-20250110232815856

关系型数据库(Relational databases/SQL):存储结构化数据,这意味着插入到该数据库中的数据将遵循一定的结构。例如,如果收集到的用户数据包括名字、姓氏、电子邮件地址、用户名和密码;那么当新用户的数据加入到数据库中时,数据库将按照此结构创建一个新条目。这些结构化数据存储在表中的行和列中;然后可以在两个或多个表(例如 user表 和 order_history表)之间建立关系,因此被称为关系型数据库。

非关系型数据库(Non-relational databases/NoSQL):非关系型数据库不会以上述所介绍的方式来存储数据,而是会以非表格格式存储数据。例如,如果正在扫描文档,则文档可能包含不同类型和数量的数据,并且会被存储在需要非表格格式的数据库中。下面是一个示例:

 {
    _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)列(columns)开始。所有存储在关系型数据库中的数据都会存储在一张中;例如,书店库存的书籍集合可能存储在名为“Books”的表中。

image-20250110232834631

在创建此表时,你需要定义需要那些信息来定义一条图书记录,例如“id”、“Name”和“Published_date”等,这些将会是你的;当定义列时,你还需要定义该列应该包含的数据类型,如果尝试将数据类型不匹配的记录插入数据库,则会被拒绝。可以定义的数据类型可能会根据你使用的数据库而有所不同,但可以使用的核心数据类型主要包括字符串(单词和字符的集合)、整数(数字)、浮点数/小数(带有小数点的数字)和时间/日期类型。

一旦创建了定义了列的表,第一条记录就可以被插入到数据库中,例如,一本名为“Android Security Internals”的书,其 id 为“1”,出版日期为“2014-10-14” ”。完成记录插入后,该记录将被呈现为一row(行)

主键和外键

定义并填充了一张表后,还可能需要存储更多的数据。例如,我们还想要创建一个名为“Authors”的表,用于存储商店中已经出售的书籍的作者。这是一个非常清楚的关系示例。一本书(存储在 Books 表中)由作者(存储在 Authors 表中)撰写。如果我们想要查询一本书,但又想返回该书的作者信息,那么我们的数据就需要以某种方式关联起来;我们可以用key(键)来做这件事。有两种类型的keys(键):

image-20250110232849351

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

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

答题

如果你要存储的数据的格式差异很大,你应该考虑使用什么类型的数据库?

Non-relational database-非关系型数据库

如果你要存储的数据能够可靠地采用相同的结构化格式,你应该考虑使用哪种类型的数据库?

relational database-关系型数据库

在我们的示例中,一旦将一本书的记录插入到我们的“Books”表中,它就会在该表中表示为 _ ?

row-行

哪种类型的键能够提供从一个表到另一个表的链接?

foreign key-外键

哪种类型的键可以确保表中的记录是唯一的?

primary key-主键

image-20250110233041146

SQL

什么是SQL ?

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

image-20250110233121534

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

SQL和关系型数据库的优势

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

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

部署实验环境

image-20250110233204785

既然我们已经了解了 SQL 是什么,现在是时候动手实践一下了!在与本文相关的TryHackMe实验房间中,单击页面中的绿色"Start Machine"按钮。目标虚拟机将会以分屏视图启动。如果目标虚拟机不可见,请继续使用实验房间页面顶部的蓝色“显示拆分视图”按钮。在目标机器完成启动后,你可以打开其终端界面并运行以下命令:

image-20250110233232780

#登录mysql DBMS
user@tryhackme$ mysql -u root -p

在终端界面提示你输入密码之后,可以输入:

user@tryhackme$ tryhackme

此时终端的输出界面应如下所示:

user@tryhackme$ mysql -u root -p
Enter password: 
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 8
Server version: 8.0.39-0ubuntu0.20.04.1 (Ubuntu)

Copyright (c) 2000, 2024, Oracle and/or its affiliates.

Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

mysql> 

image-20250524093625901

完成上述操作后,你就可以开始在实验环境中使用和学习 SQL 了。

答题

什么充当了数据库和最终用户之间的接口?

DBMS(Database Management System-数据库管理系统)

可以使用什么查询语言与关系型数据库进行交互?

SQL

image-20250110233331757

数据库语句和表语句

现在是时候开始学习SQL以及如何使用它与数据库进行交互了。在本小节中,我们将首先学习如何使用数据库语句和表语句。毕竟,我们需要使用这些语句来开始创建数据库/表并使用它们。

数据库语句(Database Statements)

CREATE DATABASE 创建数据库

如果需要一个新的数据库,你要做的第一步就是先创建它。这可以在 SQL 中使用CREATE DATABASE 语句来完成 。我们将使用以下语法:

mysql> CREATE DATABASE database_name;

例如,我们可以运行以下命令来创建名为thm_bookmarket_db的数据库:

mysql> CREATE DATABASE thm_bookmarket_db;

SHOW DATABASES 显示数据库

现在我们已经创建好了一个数据库,我们可以继续使用SHOW DATABASES语句来查看它。执行SHOW DATABASES语句将返回当前数据库的列表,我们可以运行如下语句:

mysql> SHOW DATABASES;

在返回的列表中,你应该可以看到刚刚创建的数据库以及一些默认包含的数据库(mysql、information_scheme、performance_scheme 和 sys),这些数据库用于使 mysql 能够正常运行所需的各种目的。

USE DATABASE 使用数据库

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

mysql> USE thm_bookmarket_db;

DROP DATABASE 删除数据库

一旦不再需要某个数据库(可能是为了测试目的而创建的,或者确实不再需要),我们可以使用DROP语句来将其删除。要删除数据库,我们将使用以下语句语法(在我们的示例中,我们可能希望继续保留数据库,因此无需实际运行这条语句):

mysql> DROP database database_name;

表语句(Table Statements)

现在你可以创建、列出、使用和删除数据库,是时候研究我们如何用表来填充这些数据库以及如何与这些表进行交互了。

CREATE TABLE 创建表

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

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

如你所见,这里涉及的内容略多。在本文的第二小节,我们介绍了如何以及何时创建表;我们必须确定哪些列将构成该表中的记录,以及该列中预计包含的数据类型。这就是上述语法所代表的内容。示例中有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_inventory表,其中包含三列: book_idbook_namepublication_datebook_id是一个INT (整数),因为它只能是一个数字,且设置了AUTO_INCREMENT ,这意味着插入的第一本书的book_id为1,插入的第二本书的book_id为2,依此类推。最后,book_id还被设置为PRIMARY KEY(主键),因为它将是我们在表中唯一标识书籍记录的方式(并且表中必须存在主键)。

tips:book_inventory-图书清单。

book_name列的数据类型为VARCHAR(255) ,这意味着它可以使用变量字符(文本/数字/标点符号) ,并且设置了255个字符的限制以及设置了NOT NULL ,这意味着它不能为空(因此,如果有人尝试在其中插入一条记录表,但 book_name 为空,则会被拒绝),publication_date列被设置为DATE数据类型。

SHOW TABLES 显示表

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

mysql> SHOW TABLES;

DESCRIBE 描述

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

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 更改

在创建了一张表后,有时候你对数据集的需求可能会发生变化,并且需要更改表。这可以使用ALTER语句来完成。现在假设我们已经决定在图书清单中增加一列以包含每本书的页数。我们可以使用以下语句将新的列添加到我们的表中:

mysql> ALTER TABLE book_inventory
ADD page_count INT;

ALTER语句可用于对表进行更改,例如重命名列、更改列中的数据类型或删除列。

DROP 删除

与删除数据库类似,我们也可以使用DROP语句来删除表。虽然我们大部分时候不需要这样做,但你可以为此使用以下语法:

mysql> DROP TABLE table_name;

答题

在实验虚拟机的终端界面中,使用你学到的可以列出所有数据库的语句,它应该显示一个带有flag的数据库;它是什么?

SHOW DATABASES;
###########################################################
mysql> SHOW DATABASES;
+-----------------------------------------------+
| Database                                      |
+-----------------------------------------------+
| THM{575a947132312f97b30ee5aeebba629b723d30f9} |
| information_schema                            |
| mysql                                         |
| performance_schema                            |
| sys                                           |
| task_4_db                                     |
| thm_books                                     |
| thm_books2                                    |
| tools_db                                      |
+-----------------------------------------------+
9 rows in set (0.01 sec)

image-20250216192039037

THM{575a947132312f97b30ee5aeebba629b723d30f9} 。

使用给定的实验虚拟机终端界面,在可用数据库的列表中,你应该可以看到 task_4_db 数据库。将其设置为活动数据库并列出该数据库中的所有表;这里的flag是什么?

tips:使用命令列出当前数据库中的所有表。

SHOW DATABASES;
USE task_4_db;
SHOW TABLES;
###########################################################
##在刚才的查询语句之后继续进行查询
mysql> USE task_4_db;
Reading table information for completion of table and column names
You can turn off this feature to get a quicker startup with -A

Database changed
mysql> SHOW TABLES;
+-----------------------------------------------+
| Tables_in_task_4_db                           |
+-----------------------------------------------+
| THM{692aa7eaec2a2a827f4d1a8bed1f90e5e49d2410} |
+-----------------------------------------------+
1 row in set (0.00 sec)

image-20250216192206645

THM{692aa7eaec2a2a827f4d1a8bed1f90e5e49d2410} 。

image-20250523185002386

CRUD 操作

CRUD-增查改删

CRUD代表创建(Create)、读取(Read)、更新(Update)和删除(Delete),它们被认为是任何管理数据的系统中的基本操作。

让我们探索一下在使用MySQL时的所有不同的CRUD操作。在接下来的两个内容中,我们将使用作为thm_books数据库一部分的books表来构造示例。首先,我们可以使用use thm_books;语句来访问该数据库。

创建操作(INSERT)

Create操作将在表中创建新记录。在 MySQL 中,这可以通过使用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)

正如我们所观察到的, INSERT INTO语句指定了一个表,在本例中为books ,你可以在其中添加新记录,idnamepublished_datedescription列是表中的记录。在此示例中,一条新记录被添加了,该记录的id1name"Android Security Internals"published_date"2014-10-14"description"An In-Depth Guide to Android's Security Architecture"

注意:相关记录已经存在于数据库中,因此无需运行该查询示例。

读取操作(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)

上面的SELECT语句后跟一个*符号,指示应该检索所有列,后面还跟了FROM子句和表名(在本例中为books )

如果我们想选择特定的列,例如name和description,我们应该指定它们的名称而不是使用 * 符号,如下所示。

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     

使用UPDATE语句指定表,在本例中是books,然后我们再使用SET,后跟要更新的列名,使用WHERE子句指定当满足子句时该更新哪一行,在本例中是id为1的行。

删除操作(DELETE)

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

注意:无需实际运行这个查询示例,因为如果真的删除了此条目将会影响到后续小节中的其余示例。

mysql> DELETE FROM books WHERE id = 1;

Query OK, 1 row affected (0.00 sec)    

如上所示,我们可以观察到DELETE语句后跟FROM子句,它允许我们指定将要被删除记录的表(本例中为books),后面再跟WHERE子句,指示id1的行 。

概括

综上所述, CRUD操作是操作数据库数据以及与数据库进行交互的基础,下面列出了与它们相关的语句。

  • 创建(INSERT 语句) - 将新记录添加到表中。
  • 读取(SELECT 语句) - 从表中检索记录。
  • 更新(UPDATE 语句) - 修改表中的现有数据。
  • 删除(DELETE 语句) - 从表中删除记录。

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

答题

使用tools_db数据库,查询在hacking_tools表中可用于对无线网络执行中间人攻击(man-in-the-middle attacks)的工具的名称是什么?

SHOW DATABASES;
USE tools_db;
SHOW TABLES;
DESCRIBE hacking_tools;
SELECT name,description FROM hacking_tools; 
###########################################################
mysql> SHOW DATABASES;
+-----------------------------------------------+
| Database                                      |
+-----------------------------------------------+
| THM{575a947132312f97b30ee5aeebba629b723d30f9} |
| information_schema                            |
| mysql                                         |
| performance_schema                            |
| sys                                           |
| task_4_db                                     |
| thm_books                                     |
| thm_books2                                    |
| tools_db                                      |
+-----------------------------------------------+
9 rows in set (0.00 sec)

mysql> USE tools_db;
Reading table information for completion of table and column names
You can turn off this feature to get a quicker startup with -A

Database changed
mysql> SHOW TABLES;
+--------------------+
| Tables_in_tools_db |
+--------------------+
| hacking_tools      |
+--------------------+
1 row in set (0.00 sec)

mysql> DESCRIBE hacking_tools;
+-------------+-------------+------+-----+---------+----------------+
| Field       | Type        | Null | Key | Default | Extra          |
+-------------+-------------+------+-----+---------+----------------+
| id          | int         | NO   | PRI | NULL    | auto_increment |
| name        | varchar(50) | NO   |     | NULL    |                |
| category    | varchar(50) | NO   |     | NULL    |                |
| description | text        | YES  |     | NULL    |                |
| amount      | int         | NO   |     | NULL    |                |
+-------------+-------------+------+-----+---------+----------------+
5 rows in set (0.00 sec)

mysql> SELECT name,description FROM hacking_tools; 
+------------------+-------------------------------------------------------------------------+
| name             | description                                                             |
+------------------+-------------------------------------------------------------------------+
| Flipper Zero     | A portable multi-tool for pentesters and geeks in a toy-like form       |
| O.MG cables      | Malicious USB cables that can be used for remote attacks and testing    |
| Wi-Fi Pineapple  | A device used to perform man-in-the-middle attacks on wireless networks |
| USB Rubber Ducky | A USB keystroke injection tool disguised as a flash drive               |
| iCopy-XS         | A tool used for reading and cloning RFID cards for security testing     |
| Lan Turtle       | A covert tool for remote access and network intelligence gathering      |
| Bash Bunny       | A multi-function USB attack device for penetration testers              |
| Proxmark 3 RDV4  | A powerful RFID tool for reading, writing, and analyzing RFID tags      |
+------------------+-------------------------------------------------------------------------+
8 rows in set (0.00 sec)

image-20250524094544075

Wi-Fi Pineapple

使用tools_db数据库,查询USB Rubber DuckyBash Bunny所共享的类别(category)是什么?

USE tools_db;
SHOW TABLES;
DESCRIBE hacking_tools;
SELECT name,category,description FROM hacking_tools;
###########################################################
mysql> USE tools_db;
Database changed
mysql> SHOW TABLES;
+--------------------+
| Tables_in_tools_db |
+--------------------+
| hacking_tools      |
+--------------------+
1 row in set (0.00 sec)

mysql> DESCRIBE hacking_tools;
+-------------+-------------+------+-----+---------+----------------+
| Field       | Type        | Null | Key | Default | Extra          |
+-------------+-------------+------+-----+---------+----------------+
| id          | int         | NO   | PRI | NULL    | auto_increment |
| name        | varchar(50) | NO   |     | NULL    |                |
| category    | varchar(50) | NO   |     | NULL    |                |
| description | text        | YES  |     | NULL    |                |
| amount      | int         | NO   |     | NULL    |                |
+-------------+-------------+------+-----+---------+----------------+
5 rows in set (0.01 sec)

mysql> SELECT name,category,description FROM hacking_tools;
+------------------+----------------------+-------------------------------------------------------------------------+
| name             | category             | description                                                             |
+------------------+----------------------+-------------------------------------------------------------------------+
| Flipper Zero     | Multi-tool           | A portable multi-tool for pentesters and geeks in a toy-like form       |
| O.MG cables      | Cable-based attacks  | Malicious USB cables that can be used for remote attacks and testing    |
| Wi-Fi Pineapple  | Wi-Fi hacking        | A device used to perform man-in-the-middle attacks on wireless networks |
| USB Rubber Ducky | USB attacks          | A USB keystroke injection tool disguised as a flash drive               |
| iCopy-XS         | RFID cloning         | A tool used for reading and cloning RFID cards for security testing     |
| Lan Turtle       | Network intelligence | A covert tool for remote access and network intelligence gathering      |
| Bash Bunny       | USB attacks          | A multi-function USB attack device for penetration testers              |
| Proxmark 3 RDV4  | RFID cloning         | A powerful RFID tool for reading, writing, and analyzing RFID tags      |
+------------------+----------------------+-------------------------------------------------------------------------+
8 rows in set (0.00 sec)

image-20250524095003980

USB Attacks

image-20250524095106901

Clauses(子句)

子句是语句的一部分,它指定要操作的数据的标准,通常根据初始语句决定。子句可以帮助我们定义数据类型以及决定如何对数据进行检索或排序。

在之前的小节中,我们已经使用了一些子句,例如: FROM子句可用于指定我们正在使用语句访问的表, WHERE 子句可指定应该使用哪些记录。

在本小节中,我们将重点关注一些其他的子句: DISTINCT 子句、 GROUP BY子句 、 ORDER 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)

上述查询的输出将显示books表的所有内容,并且Ethical Hacking记录显示了两次。让我们再次执行查询,但我们这次将使用DISTINCT子句。

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)

上述输出显示仅会返回五行记录,并且仅会显示Ethical Hacking记录的一个实例。

GROUP BY 子句

GROUP BY子句可以聚合来自多个记录的数据,并会将查询结果按列进行分组。这对于聚合(aggregating)函数很有帮助。

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这样的函数可以帮助我们实现排序目标,如下面两个示例所示。

ASCENDING ORDER 升序排列

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)

DESCENDING ORDER 降序排列

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)

我们可以观察到使用ASC升序排列和使用DESC降序排列时的结果差异,在上面的示例中,这两者都使用了Publication_date作为参考。

HAVING 子句

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

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)

在上面的示例中,我们可以观察到SQL查询所返回的书籍名称中都包含了单词Hack,并且会显示正确的计数,正如我们之前所了解的那样。

答题

使用 tools_db 数据库, 在hacking_tools表中确切类别的总数是多少?

USE tools_db;
SHOW TABLES;
DESCRIBE hacking_tools;
SELECT DISTINCT category FROM hacking_tools;
###########################################################
mysql> USE tools_db;
Reading table information for completion of table and column names
You can turn off this feature to get a quicker startup with -A

Database changed
mysql> SHOW TABLES;
+--------------------+
| Tables_in_tools_db |
+--------------------+
| hacking_tools      |
+--------------------+
1 row in set (0.00 sec)

mysql> DESCRIBE hacking_tools;
+-------------+-------------+------+-----+---------+----------------+
| Field       | Type        | Null | Key | Default | Extra          |
+-------------+-------------+------+-----+---------+----------------+
| id          | int         | NO   | PRI | NULL    | auto_increment |
| name        | varchar(50) | NO   |     | NULL    |                |
| category    | varchar(50) | NO   |     | NULL    |                |
| description | text        | YES  |     | NULL    |                |
| amount      | int         | NO   |     | NULL    |                |
+-------------+-------------+------+-----+---------+----------------+
5 rows in set (0.00 sec)

mysql> SELECT DISTINCT category FROM hacking_tools;
+----------------------+
| category             |
+----------------------+
| Multi-tool           |
| Cable-based attacks  |
| Wi-Fi hacking        |
| USB attacks          |
| RFID cloning         |
| Network intelligence |
+----------------------+
6 rows in set (0.00 sec)

image-20250524095402979

6

使用 tools_db 数据库中, 来自hacking_tools 表并按升序排列(ascending order)的第一个工具(by name-按名称)是什么?

USE tools_db;
SHOW TABLES;
DESCRIBE hacking_tools;
SELECT name FROM hacking_tools ORDER BY name ASC;
###########################################################
mysql> USE tools_db;
Database changed
mysql> SHOW TABLES;
+--------------------+
| Tables_in_tools_db |
+--------------------+
| hacking_tools      |
+--------------------+
1 row in set (0.00 sec)

mysql> DESCRIBE hacking_tools;
+-------------+-------------+------+-----+---------+----------------+
| Field       | Type        | Null | Key | Default | Extra          |
+-------------+-------------+------+-----+---------+----------------+
| id          | int         | NO   | PRI | NULL    | auto_increment |
| name        | varchar(50) | NO   |     | NULL    |                |
| category    | varchar(50) | NO   |     | NULL    |                |
| description | text        | YES  |     | NULL    |                |
| amount      | int         | NO   |     | NULL    |                |
+-------------+-------------+------+-----+---------+----------------+
5 rows in set (0.00 sec)

mysql> SELECT name FROM hacking_tools ORDER BY name ASC;
+------------------+
| name             |
+------------------+
| Bash Bunny       |
| Flipper Zero     |
| iCopy-XS         |
| Lan Turtle       |
| O.MG cables      |
| Proxmark 3 RDV4  |
| USB Rubber Ducky |
| Wi-Fi Pineapple  |
+------------------+
8 rows in set (0.00 sec)

image-20250524095646214

Bash Bunny

使用 tools_db 数据库, 来自hacking_tools 表并按降序排列(descending order)的第一个工具(by name-按名称)是什么?

USE tools_db;
SHOW TABLES;
DESCRIBE hacking_tools;
SELECT name FROM hacking_tools ORDER BY name DESC;
###########################################################
##在刚才的查询语句之后继续进行查询
mysql> SELECT name FROM hacking_tools ORDER BY name DESC;
+------------------+
| name             |
+------------------+
| Wi-Fi Pineapple  |
| USB Rubber Ducky |
| Proxmark 3 RDV4  |
| O.MG cables      |
| Lan Turtle       |
| iCopy-XS         |
| Flipper Zero     |
| Bash Bunny       |
+------------------+
8 rows in set (0.00 sec)

image-20250216193104455

Wi-Fi Pineapple

image-20250524100010923

Operators(运算符)

在使用SQL并处理逻辑和比较时,运算符是我们有效过滤和操作数据的方法。了解这些运算符将帮助我们创建更精确、更强大的查询。在接下来的示例中,我们将使用属于数据库thm_books2的books表。我们可以使用use thm_books2;语句来访问它。

逻辑运算符

这类运算符可以测试条件的真实性并返回布尔值TRUEFALSE ,接下来让我们探讨其中的一些运算符。

LIKE 运算符

LIKE运算符通常可以与WHERE等子句结合使用,以便过滤列中的特定模式。让我们继续使用我们的数据库来查询其用法的示例。

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)  

上面的查询将返回被过滤(经过筛选)的书籍记录列表,并且会通过使用LIKE操作符来指示WHERE子句 以过滤在description(描述)中包含单词guide的结果。

AND 运算符

AND运算符可用于在查询中使用多个条件,如果所有条件都为true,则会返回TRUE

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的书籍,该书籍属于Offective Security类别。

OR 运算符

OR运算符可以组合查询中的多个条件,如果这些条件中至少有一个为 true,则会返回TRUE

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)

上面的查询会返回name中包含AndroidiOS的书籍。

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)

上面的查询将返回id24之间(包括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 的书籍。

不等于运算符

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

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)

上面的查询会返回书籍记录,但类别Offective Security的书籍除外

小于运算符

< (less than-小于)运算符可以比较具有给定值的表达式是否小于一个已提供的值。

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-小于或等于)运算符可以比较具有给定值的表达式是否小于或等于一个已提供的值。另一方面, >= (Greater 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 日当天或之后出版的书籍。

答题

使用tools_db数据库,哪个工具属于多工具(Multi-tool)类别并且对渗透测试人员(pentesters)极客(geeks)有用?

tips:使用 WHERE 子句和 LIKE 运算符。

USE tools_db;
SHOW TABLES;
DESCRIBE hacking_tools;
SELECT * FROM hacking_tools;
SELECT * FROM hacking_tools WHERE category = "Multi-tool" AND description LIKE "%pentesters%" AND description LIKE "%geeks%";
###########################################################
mysql> SELECT * FROM hacking_tools;
+----+------------------+----------------------+-------------------------------------------------------------------------+--------+
| id | name             | category             | description                                                             | amount |
+----+------------------+----------------------+-------------------------------------------------------------------------+--------+
|  1 | Flipper Zero     | Multi-tool           | A portable multi-tool for pentesters and geeks in a toy-like form       |    169 |
|  2 | O.MG cables      | Cable-based attacks  | Malicious USB cables that can be used for remote attacks and testing    |    180 |
|  3 | Wi-Fi Pineapple  | Wi-Fi hacking        | A device used to perform man-in-the-middle attacks on wireless networks |    140 |
|  4 | USB Rubber Ducky | USB attacks          | A USB keystroke injection tool disguised as a flash drive               |     80 |
|  5 | iCopy-XS         | RFID cloning         | A tool used for reading and cloning RFID cards for security testing     |    375 |
|  6 | Lan Turtle       | Network intelligence | A covert tool for remote access and network intelligence gathering      |     80 |
|  7 | Bash Bunny       | USB attacks          | A multi-function USB attack device for penetration testers              |    120 |
|  8 | Proxmark 3 RDV4  | RFID cloning         | A powerful RFID tool for reading, writing, and analyzing RFID tags      |    300 |
+----+------------------+----------------------+-------------------------------------------------------------------------+--------+
8 rows in set (0.00 sec)

mysql> SELECT * FROM hacking_tools WHERE category = "Multi-tool" AND description LIKE "%pentesters%" AND description LIKE "%geeks%";
+----+--------------+------------+-------------------------------------------------------------------+--------+
| id | name         | category   | description                                                       | amount |
+----+--------------+------------+-------------------------------------------------------------------+--------+
|  1 | Flipper Zero | Multi-tool | A portable multi-tool for pentesters and geeks in a toy-like form |    169 |
+----+--------------+------------+-------------------------------------------------------------------+--------+
1 row in set (0.00 sec)

image-20250524100957440

Flipper Zero

使用tools_db数据库,数量大于等于300的工具属于什么类别?

USE tools_db;
SHOW TABLES;
DESCRIBE hacking_tools;
SELECT category FROM hacking_tools WHERE amount >= 300;
###########################################################
mysql> SELECT category FROM hacking_tools WHERE amount >= 300;
+--------------+
| category     |
+--------------+
| RFID cloning |
| RFID cloning |
+--------------+
2 rows in set (0.00 sec)

image-20250216193408549

RFID cloning

使用tools_db数据库,哪个工具属于网络智能(Network intelligence)类别且数量小于100

USE tools_db;
SHOW TABLES;
DESCRIBE hacking_tools;
SELECT * FROM hacking_tools WHERE category = 'Network Intelligence' AND amount < 100;
###########################################################
mysql> SELECT * FROM hacking_tools WHERE category = 'Network Intelligence' AND amount < 100;
+----+------------+----------------------+--------------------------------------------------------------------+--------+
| id | name       | category             | description                                                        | amount |
+----+------------+----------------------+--------------------------------------------------------------------+--------+
|  6 | Lan Turtle | Network intelligence | A covert tool for remote access and network intelligence gathering |     80 |
+----+------------+----------------------+--------------------------------------------------------------------+--------+
1 row in set (0.00 sec)

image-20250524101213655

Lan Turtle

image-20250524101306362

函数

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

字符串(String)函数

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

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)

上面的查询将按categorybooks进行分组,并会将每个类别(category)中的书籍标题连接成一个字符串

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的列中。

聚合(Aggregate)函数

聚合函数可以聚合SQL查询中一个指定条件内的多行值,它可以将多个值组合成一个结果。

COUNT() 函数

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

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

1 row in set (0.01 sec)

上面的查询可以计算books表中的总行数,结果是5,因为 books 表中一共有五本书,并且该查询能够会将这个值存储在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() 函数

此函数可以计算表达式中已提供的列内的最大值。

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存储在Early_book列中。

答题

使用tools_db数据库,根据字符长度,名称最长的工具是什么?

tips:使用 LENGTH() 函数并按降序对工具名称进行排序。

USE tools_db;
SHOW TABLES;
DESCRIBE hacking_tools;
SELECT name, LENGTH(name) AS name_length FROM hacking_tools ORDER BY name_length DESC;
###########################################################
mysql> SELECT name, LENGTH(name) AS name_length FROM hacking_tools ORDER BY name_length DESC;
+------------------+-------------+
| name             | name_length |
+------------------+-------------+
| USB Rubber Ducky |          16 |
| Wi-Fi Pineapple  |          15 |
| Proxmark 3 RDV4  |          15 |
| Flipper Zero     |          12 |
| O.MG cables      |          11 |
| Lan Turtle       |          10 |
| Bash Bunny       |          10 |
| iCopy-XS         |           8 |
+------------------+-------------+
8 rows in set (0.00 sec)

image-20250524101543939

USB Rubber Ducky

使用tools_db数据库,所有工具的总数是多少?

tips:使用 SUM() 函数。

USE tools_db;
SHOW TABLES;
DESCRIBE hacking_tools;
SELECT SUM(amount) AS total_amount FROM hacking_tools;
###########################################################
mysql> SELECT SUM(amount) AS total_amount FROM hacking_tools;
+--------------+
| total_amount |
+--------------+
|         1444 |
+--------------+
1 row in set (0.01 sec)

image-20250524101617500

1444

使用tools_db数据库,数量不以0结尾的工具名称是什么,并将工具名称用“&”连接起来进行分组。

tips:使用 GROUP_CONCAT() 函数。

USE tools_db;
SHOW TABLES;
DESCRIBE hacking_tools;
SELECT GROUP_CONCAT(name SEPARATOR "&") AS name_nonzero FROM hacking_tools WHERE SUBSTRING(amount,-1,1) != 0;
###########################################################
mysql> SELECT GROUP_CONCAT(name SEPARATOR "&") AS name_nonzero FROM hacking_tools WHERE SUBSTRING(amount,-1,1) != 0;
+-------------------------+
| name_nonzero            |
+-------------------------+
| Flipper Zero & iCopy-XS |
+-------------------------+
1 row in set (0.00 sec)

tips:WHERE SUBSTRING(amount, -1, 1) != 0 ,这个子句将根据与 amount 列相关的条件来过滤行;其中SUBSTRING() 函数表示提取字符串的一部分,参数amount 表示amount 列,参数-1 表示应该从最后一个字符开始,参数1 表示应该提取一个字符,最后的!= 0 用于检查 amount 的最后一个字符是否不等于 0,意味着SQL查询只会考虑 amount 不以零结尾的行。

image-20250524101831421

Flipper Zero & iCopy-XS

image-20250524101924249

本文小结

恭喜你完成SQL基础知识的学习!希望本文内容能够教会你数据库在计算机中的重要性;SQL有如此多的用例(我们在日常生活中经常与之互动),如果你想从事网络安全行业,那么学习这部分基础知识是必需的。

为了让事情圆满结束,让我们来总结一下这篇文章所涵盖的所有内容:

  • 数据库是易于访问、操作或分析的有组织的数据或信息的集合。
  • 数据库的两种主要类型是关系型数据库(用于存储结构化数据)和非关系型数据库(用于以非表格格式存储数据)。
  • 关系型数据库由表、列和行组成。主键可以确保表中的记录是唯一的,而外键可以允许在两个(或多个)表之间建立关系/连接。
  • SQL是一种易于学习的数据库查询语言,可用于与关系型数据库进行交互。
  • 数据库语句和表语句可用于创建/操作数据库和表。
  • CRUD 操作( INSERT、SELECT、UPDATEDELETE )可用于管理数据库中的数据。
  • 在SQL中,我们可以使用子句来定义如何检索、过滤、排序或分组数据。
  • 运算符函数的有效使用可以帮助我们在 SQL 中过滤和操作数据。
posted @ 2025-05-24 10:25  Hekeatsll  阅读(207)  评论(0)    收藏  举报