首页 > 数据库 >HTB-sql基本知识

HTB-sql基本知识

时间:2024-09-27 17:50:53浏览次数:8  
标签:username HTB mysql 基本知识 查询 sql password id SELECT

HTB-sql基本知识-mysql

sql-插入-insert

用于向给定表添加新记录

一、

语法
INSERT INTO table_name VALUES (column1_value, column2_value, column3_value, ...);

上面的语法要求用户填写表中所有列的值。

例子:如何向登录表添加新登录名,并为每列添加适当的值。
mysql> INSERT INTO logins VALUES(1, 'admin', 'p@ssw0rd', '2020-07-02');

Query OK, 1 row affected (0.00 sec)

二、

跳过使用默认值填充列
INSERT INTO table_name(column2, column3, ...) VALUES (column2_value, column3_value, ...);
例子:
mysql> INSERT INTO logins(username, password) VALUES('administrator', 'adm1n_p@ss');

Query OK, 1 row affected (0.00 sec)
跳过了id和date_of_joining列

三、

一次插入多条记录
mysql> INSERT INTO logins(username, password) VALUES ('john', 'john123!'), ('tom', 'tom123!');

Query OK, 2 rows affected (0.00 sec)
Records: 2  Duplicates: 0  Warnings: 0

sql-选择-select

用于检索数据

一、

语法
SELECT * FROM table_name;

星号 (*) 充当通配符并选择所有列。 FROM关键字用于表示要从中选择的表。

二、

查询特定列中的数据
SELECT * column1, column2 FROM table_name

三、

实例
mysql> SELECT * FROM logins;

+----+---------------+------------+---------------------+
| id | username      | password   | date_of_joining     |
+----+---------------+------------+---------------------+
|  1 | admin         | p@ssw0rd   | 2020-07-02 00:00:00 |
|  2 | administrator | adm1n_p@ss | 2020-07-02 11:30:50 |
|  3 | john          | john123!   | 2020-07-02 11:47:16 |
|  4 | tom           | tom123!    | 2020-07-02 11:47:16 |
+----+---------------+------------+---------------------+
4 rows in set (0.00 sec)


mysql> SELECT username,password FROM logins;

+---------------+------------+
| username      | password   |
+---------------+------------+
| admin         | p@ssw0rd   |
| administrator | adm1n_p@ss |
| john          | john123!   |
| tom           | tom123!    |
+---------------+------------+
4 rows in set (0.00 sec)

第一种是查看logins表中所有数据,第二种则是查询username列和password列

sql-删除-drop

用于删除表和数据库

实例
mysql> DROP TABLE logins;

Query OK, 0 rows affected (0.01 sec)


mysql> SHOW TABLES;

Empty set (0.00 sec)

注意,drop语句永久完全删除表且无需确认

sql-更改-alter

用于更改任何表及其任何字段的名称,或者删除现有表或向现有表添加新列

一、

使用ADD将新列newColumn添加到logins表:
mysql> ALTER TABLE logins ADD newColumn INT;

Query OK, 0 rows affected (0.01 sec)

二、

重命名列
mysql> ALTER TABLE logins RENAME COLUMN newColumn TO oldColumn;

Query OK, 0 rows affected (0.01 sec)

三、

使用MODIFY更改列的数据类型
mysql> ALTER TABLE logins MODIFY oldColumn DATE;

Query OK, 0 rows affected (0.01 sec)

四、

使用drop删除一列
mysql> ALTER TABLE logins DROP oldColumn;

Query OK, 0 rows affected (0.01 sec)

sql-更新-update

用于根据某些条件更新表中的特定记录

一、

语法
update table_name set column1=newvalue1, column2=newvalue2, ... where <condition>;

二、

查询更新了 id 大于 1 的所有记录中的所有密码
mysql> UPDATE logins SET password = 'change_password' WHERE id > 1;

Query OK, 3 rows affected (0.00 sec)
Rows matched: 3  Changed: 3  Warnings: 0


mysql> SELECT * FROM logins;

+----+---------------+-----------------+---------------------+
| id | username      | password        | date_of_joining     |
+----+---------------+-----------------+---------------------+
|  1 | admin         | p@ssw0rd        | 2020-07-02 00:00:00 |
|  2 | administrator | change_password | 2020-07-02 11:30:50 |
|  3 | john          | change_password | 2020-07-02 11:47:16 |
|  4 | tom           | change_password | 2020-07-02 11:47:16 |
+----+---------------+-----------------+---------------------+
4 rows in set (0.00 sec)

sql-排序-order by

一、

对任何查询的结果进行排序并指定排序依据的列

mysql> SELECT * FROM logins ORDER BY password;

+----+---------------+------------+---------------------+
| id | username      | password   | date_of_joining     |
+----+---------------+------------+---------------------+
|  2 | administrator | adm1n_p@ss | 2020-07-02 11:30:50 |
|  3 | john          | john123!   | 2020-07-02 11:47:16 |
|  1 | admin         | p@ssw0rd   | 2020-07-02 00:00:00 |
|  4 | tom           | tom123!    | 2020-07-02 11:47:16 |
+----+---------------+------------+---------------------+
4 rows in set (0.00 sec)

二、

默认情况下,排序是按升序进行的,但我们也可以按ASCDESC对结果进行排序:

mysql> SELECT * FROM logins ORDER BY password DESC;

+----+---------------+------------+---------------------+
| id | username      | password   | date_of_joining     |
+----+---------------+------------+---------------------+
|  4 | tom           | tom123!    | 2020-07-02 11:47:16 |
|  1 | admin         | p@ssw0rd   | 2020-07-02 00:00:00 |
|  3 | john          | john123!   | 2020-07-02 11:47:16 |
|  2 | administrator | adm1n_p@ss | 2020-07-02 11:30:50 |
+----+---------------+------------+---------------------+
4 rows in set (0.00 sec)

三、

还可以按多列排序,对一列中的重复值进行二次排序:

mysql> SELECT * FROM logins ORDER BY password DESC, id ASC;

+----+---------------+-----------------+---------------------+
| id | username      | password        | date_of_joining     |
+----+---------------+-----------------+---------------------+
|  1 | admin         | p@ssw0rd        | 2020-07-02 00:00:00 |
|  2 | administrator | change_password | 2020-07-02 11:30:50 |
|  3 | john          | change_password | 2020-07-02 11:47:16 |
|  4 | tom           | change_password | 2020-07-02 11:50:20 |
+----+---------------+-----------------+---------------------+
4 rows in set (0.00 sec)

sql-限制-limit

一、

当我们的查询返回大量的记录,用于限制结果为我们想要的

mysql> SELECT * FROM logins LIMIT 2;

+----+---------------+------------+---------------------+
| id | username      | password   | date_of_joining     |
+----+---------------+------------+---------------------+
|  1 | admin         | p@ssw0rd   | 2020-07-02 00:00:00 |
|  2 | administrator | adm1n_p@ss | 2020-07-02 11:30:50 |
+----+---------------+------------+---------------------+
2 rows in set (0.00 sec)

二、

如果我们想用偏移量限制结果,我们可以在 LIMIT 计数之前指定偏移量:

mysql> SELECT * FROM logins LIMIT 1, 2;

+----+---------------+------------+---------------------+
| id | username      | password   | date_of_joining     |
+----+---------------+------------+---------------------+
|  2 | administrator | adm1n_p@ss | 2020-07-02 11:30:50 |
|  3 | john          | john123!   | 2020-07-02 11:47:16 |
+----+---------------+------------+---------------------+
2 rows in set (0.00 sec)

注意:偏移量标记了要包含的第一条记录的顺序,从0开始。对于上面的情况,它从第二条记录开始并包含,并返回两个值。

sql-子句-where

一、

要过滤或搜索特定数据,我们可以使用带有WHERE子句的SELECT语句的条件来微调结果:

SELECT * FROM table_name WHERE <condition>;

上面的查询将返回满足给定条件的所有记录。

二、

mysql> SELECT * FROM logins WHERE id > 1;

+----+---------------+------------+---------------------+
| id | username      | password   | date_of_joining     |
+----+---------------+------------+---------------------+
|  2 | administrator | adm1n_p@ss | 2020-07-02 11:30:50 |
|  3 | john          | john123!   | 2020-07-02 11:47:16 |
|  4 | tom           | tom123!    | 2020-07-02 11:47:16 |
+----+---------------+------------+---------------------+
3 rows in set (0.00 sec)

上面的示例选择id值大于1所有记录。正如我们所看到的, id为 1 的第一行已从输出中跳过。

三、

我们可以对用户名做类似的事情:

mysql> SELECT * FROM logins where username = 'admin';

+----+----------+----------+---------------------+
| id | username | password | date_of_joining     |
+----+----------+----------+---------------------+
|  1 | admin    | p@ssw0rd | 2020-07-02 00:00:00 |
+----+----------+----------+---------------------+
1 row in set (0.00 sec)

上面的查询选择用户名是admin记录

注意:字符串和日期数据类型应该用单引号(')或双引号(")括起来,而数字可以直接使用。

sql-子句-like

一、

它允许通过匹配特定模式来选择记录

查询检索用户名以admin开头的所有记录:
mysql> SELECT * FROM logins WHERE username LIKE 'admin%';

+----+---------------+------------+---------------------+
| id | username      | password   | date_of_joining     |
+----+---------------+------------+---------------------+
|  1 | admin         | p@ssw0rd   | 2020-07-02 00:00:00 |
|  4 | administrator | adm1n_p@ss | 2020-07-02 15:19:02 |
+----+---------------+------------+---------------------+
2 rows in set (0.00 sec)

%符号充当通配符,匹配admin之后的所有字符。它用于匹配零个或多个字符。类似地, _符号用于精确匹配一个字符。下面的查询匹配所有包含三个字符的用户名,在本例中是tom

mysql> SELECT * FROM logins WHERE username like '___';

+----+----------+----------+---------------------+
| id | username | password | date_of_joining     |
+----+----------+----------+---------------------+
|  3 | tom      | tom123!  | 2020-07-02 15:18:56 |
+----+----------+----------+---------------------+
1 row in set (0.01 sec)

sql-与运算符-and

一、

AND运算符接受两个条件并根据它们的评估返回truefalse

condition1 AND condition2

当且仅当condition1condition2计算结果都为true时, AND运算的结果才为true

mysql> SELECT 1 = 1 AND 'test' = 'test';

+---------------------------+
| 1 = 1 AND 'test' = 'test' |
+---------------------------+
|                         1 |
+---------------------------+
1 row in set (0.00 sec)

mysql> SELECT 1 = 1 AND 'test' = 'abc';

+--------------------------+
| 1 = 1 AND 'test' = 'abc' |
+--------------------------+
|                        0 |
+--------------------------+
1 row in set (0.00 sec)

补充:在 MySQL 术语中,任何non-zero值都被视为true ,并且它通常返回值1来表示true0被认为是false 。正如我们在上面的示例中看到的,第一个查询返回true因为两个表达式都被评估为true 。但是,第二个查询返回false因为第二个条件'test' = 'abc'false

sql-或运算符-or

一、

OR运算符也接受两个表达式,并在其中至少一个表达式为true时返回true

mysql> SELECT 1 = 1 OR 'test' = 'abc';

+-------------------------+
| 1 = 1 OR 'test' = 'abc' |
+-------------------------+
|                       1 |
+-------------------------+
1 row in set (0.00 sec)

mysql> SELECT 1 = 2 OR 'test' = 'abc';

+-------------------------+
| 1 = 2 OR 'test' = 'abc' |
+-------------------------+
|                       0 |
+-------------------------+
1 row in set (0.00 sec)

第一个查询的计算结果为true因为条件1 = 1true 。第二个查询有两个false条件,导致false输出。

sql-非运算符-not

一、

NOT运算符只是切换一个boolean值“即true转换为false ,反之亦然”:

mysql> SELECT NOT 1 = 1;

+-----------+
| NOT 1 = 1 |
+-----------+
|         0 |
+-----------+
1 row in set (0.00 sec)

mysql> SELECT NOT 1 = 2;

+-----------+
| NOT 1 = 2 |
+-----------+
|         1 |
+-----------+
1 row in set (0.00 sec)

如上面的示例所示,第一个查询结果为false因为它是1 = 1计算的倒数,即true ,因此其倒数为false 。另一方面,第二个查询返回true ,因为1 = 2 'which is false ' 的反义词是true

sql-符号运算符

一、

ANDORNOT运算符也可以表示为&&||! , 分别。以下是使用符号运算符的相同先前示例:

mysql> SELECT 1 = 1 && 'test' = 'abc';

+-------------------------+
| 1 = 1 && 'test' = 'abc' |
+-------------------------+
|                       0 |
+-------------------------+
1 row in set, 1 warning (0.00 sec)

mysql> SELECT 1 = 1 || 'test' = 'abc';

+-------------------------+
| 1 = 1 || 'test' = 'abc' |
+-------------------------+
|                       1 |
+-------------------------+
1 row in set, 1 warning (0.00 sec)

mysql> SELECT 1 != 1;

+--------+
| 1 != 1 |
+--------+
|      0 |
+--------+
1 row in set (0.00 sec)

查询中的运算符

一、

在查询中使用这些运算符。以下查询列出了username不是john所有记录:

mysql> SELECT * FROM logins WHERE username != 'john';

+----+---------------+------------+---------------------+
| id | username      | password   | date_of_joining     |
+----+---------------+------------+---------------------+
|  1 | admin         | p@ssw0rd   | 2020-07-02 00:00:00 |
|  2 | administrator | adm1n_p@ss | 2020-07-02 11:30:50 |
|  4 | tom           | tom123!    | 2020-07-02 11:47:16 |
+----+---------------+------------+---------------------+
3 rows in set (0.00 sec)

二、

查询选择id大于1并且username不等于john用户:

mysql> SELECT * FROM logins WHERE username != 'john' AND id > 1;

+----+---------------+------------+---------------------+
| id | username      | password   | date_of_joining     |
+----+---------------+------------+---------------------+
|  2 | administrator | adm1n_p@ss | 2020-07-02 11:30:50 |
|  4 | tom           | tom123!    | 2020-07-02 11:47:16 |
+----+---------------+------------+---------------------+
2 rows in set (0.00 sec)

sql-多个运算符优先级

SQL 支持各种其他运算,例如加法、除法以及按位运算。因此,一个查询可以同时具有多个具有多个操作的表达式。这些操作的顺序由运算符优先级决定。

一、

以下列表显示了 SQL 运算符的优先级。列表中首先出现的运算符具有更高的优先级。一起列出的运算符具有相同的优先级。

  • 除法 ( / )、乘法 ( * ) 和模 ( % )
  • 加法 ( + ) 和减法 ( - )
  • 比较( =><<=>=!=LIKE
  • NOT (!)
  • AND (&&)
  • OR (||)

二、

实例:

SELECT * FROM logins WHERE username != 'tom' AND id > 3 - 2;

该查询有四个操作: != 、 AND 、 >和- 。从运算符优先级来看,我们知道减法优先,因此它首先将3 - 2计算为1 :
SELECT * FROM logins WHERE username != 'tom' AND id > 1;

接下来,我们有两个比较操作, >和!= 。两者具有相同的优先级,并且将一起评估。因此,它将返回 username 不是tom所有记录,以及id大于 1 的所有记录,然后应用AND返回满足这两个条件的所有记录:
mysql> select * from logins where username != 'tom' AND id > 3 - 2;

+----+---------------+------------+---------------------+
| id | username      | password   | date_of_joining     |
+----+---------------+------------+---------------------+
|  2 | administrator | adm1n_p@ss | 2020-07-03 12:03:53 |
|  3 | john          | john123!   | 2020-07-03 12:03:57 |
+----+---------------+------------+---------------------+
2 rows in set (0.00 sec)

HTB-sql基本知识-sql注入

在web应用程序中使用sql

在PHP Web应用中,我们可以连接到数据库,并在php中通过MySQL语法使用数据库

看下面这串代码

$conn = new mysqli("localhost","root","password","users");
$query = "select * form logins";
$result = $conn->query($query);

    $conn: 这是一个变量名,用于保存与数据库连接的对象。
    new mysqli(): 使用 mysqli 构造函数创建一个新的数据库连接对象。
    "localhost": 指定数据库服务器的位置(主机名)。在这个例子中,数据库服务器位于本地机器上。
    "root": 指定用于连接数据库的用户名。
    "password": 指定连接数据库时使用的密码。
    "users": 指定要连接的数据库名称。

    $query: 这是一个变量名,用于保存 SQL 查询语句。
    "select * from logins": 这是一条 SQL 查询语句,用于从名为 logins 的表中选择所有列的所有记录。

    $result: 这是一个变量名,用于保存查询结果。
    $conn->query(): 使用 $conn 对象的 query() 方法执行 SQL 查询。
    $query: 作为参数传递给 query() 方法,该参数包含了要执行的 SQL 查询语句。

然后,查询的输出将存储在$result中,我们可以将其打印到页面或以任何其他方式使用它。下面的 PHP 代码将在新行中打印 SQL 查询的所有返回结果:

while($row = $result->fetch_assoc() ){
	echo $row["name"]."<br>";
}


    while($row = $result->fetch_assoc() ){:
        $row: 这是一个变量,用于存储从数据库查询结果中获取的一行数据。
        $result->fetch_assoc(): 使用 $result 对象的 fetch_assoc() 方法从查询结果中获取下一行数据,并将其作为一个关联数组返回。如果还有更多的行,fetch_assoc() 会返回这一行的数据;如果没有更多的行,它将返回 false。
        while 循环: 这是一个循环结构,只要 $result->fetch_assoc() 返回的不是 false(即还有行可取),就会继续执行循环体内的代码。

    echo $row["name"]."<br>";:
        $row["name"]: 访问 $row 数组中的 "name" 键对应的值。这里的 "name" 应该是查询结果中的一列的名称。
        ."<br>": 在每个名字后面添加 HTML 的换行符 <br>,这样在网页上显示时每个名字会位于新的一行。
        echo: 输出 $row["name"]."<br>" 的结果,即打印出 "name" 列的值,并在其后加上 <br>。

Web 应用程序在检索数据时通常也使用用户输入。例如,当用户使用搜索功能搜索其他用户时,他们的搜索输入将传递到 Web 应用程序,该应用程序使用该输入在数据库中进行搜索:

$searchInput =  $_POST['findUser'];
$query = "select * from logins where username like '%$searchInput'";
$result = $conn->query($query);

所以sql注入就是这么来的,你输入的语句插入了后端设置的sql语句

sql注入

$searchInput =  $_POST['findUser'];
$query = "select * from logins where username like '%$searchInput'";
$result = $conn->query($query);

上述代码对用户输入的内容没有进行任何的过滤,所以当用户在插入代码时,会从代码流的角度修改后端执行的sql语句,从而获取自己想要的结果

正常来说,我们会进入以下的sql查询

select * from logins where username like '%$searchInput'

如果我们输入admin,就会变成%admin。但是如果我们输入'这将结束用户输入字段,在它之后,我们可以编写实际的 SQL 代码

例如,我们输入1'; DROP TABLE users;

会进入以下的sql查询

'%1'; DROP TABLE users;'
即
select * from logins where username like '%1'; DROP TABLE users;'

注意:在上面的示例中,为了简单起见,我们在分号 (

标签:username,HTB,mysql,基本知识,查询,sql,password,id,SELECT
From: https://www.cnblogs.com/schneider/p/18436223

相关文章

  • windows环境下的 MySQL 安装与启动
    参考网址:菜鸟教程:https://www.runoob.com/mysql/mysql-install.html报错博文:https://blog.csdn.net/weixin_72700368/article/details/139784696 1. 下载MySQLWindows上安装MySQL相对来说会较为简单,最新版本可以在 MySQL下载 中下载中查看(更详细安装:Win......
  • Mysql8.0启动时出现ERROR: Different lower_case_table_names settings for server ('
    分析:出现这个原因数据库启动后,调整lower_case_table_names参数导致的这个问题。mysql8.0之后,lower_case_table_names配置必须在安装好MySQL后,初始化mysql配置时才有效。一旦mysql启动后,再设置是无效的,而且启动报错。lower_case_table_names=1表示mysql是不区分大小写的......
  • Mysql-常用命令
    库操作:1.创建数据库:createdatabase库名;2.显示数据库:showdatabases;3.删除数据库:dropdatabase库名;4.修改数据库编码:alterdatabase库名charactersetgb2312表操作:1.创建一个表名为:employee,该表中含有id、name、sex、birthday、job字段:createtableemployee(表名)(id......
  • SQLite3模块使用详解
    SQLite3是一种轻量级的数据库引擎,它不需要独立的服务器进程,可以直接读写磁盘上的数据库文件。由于其简单易用和高效的特性,SQLite3成为了许多应用程序和开发者在开发阶段的首选数据库。Python的sqlite3模块提供了对SQLite3数据库的直接支持,允许开发者在Python环境中轻松地......
  • MySQL 表的CRUD与复合查询
    目录表的增删改查Create指定列插入单行数据+全列插入多行数据+全列插入插入否则更新替换(replace)Retrieve标准语法SELECT列全列查询限制显示条目limit(分页查询)基本语法:指定列查询select查询字段为表达式表达式重命名去重WHERE条件比较运算符逻辑运算符案例:结果排序Orde......
  • GaussDB云数据库SQL应用系列-定时任务管理
    ​前言GaussDB数据库定时任务主要可以用于实现定期的备份、统计信息采集、数据汇总、数据清理与优化等,它是指在指定的时间间隔内自动执行一次或多次SQL语句的程序。一、GaussDB数据库定时任务介绍GaussDB数据库兼容Oracle定时任务功能主要通过DBE_TASK高级功能包提供的二次封......
  • GaussDB云数据库SQL应用系列-基础使用
    ​目录一、前言二、前提条件1、连接数据库实例2、GaussDB实例正常运行三、操作示例1、选择实例并进入SQL执行界面2、创建数据库用户3、创建数据库4、创建SCHEMA5、创建表(增删改查)1)创建3张表,并初始化一些数据2)假设查询场景,并通过SQL实现一、前言随着云计算技术的不......
  • GaussDB云数据库SQL应用系列-视图管理
    ​一、前言GaussDB是一款基于云计算技术的高性能关系型数据库,支持多种数据模型和分布式架构。在GaussDB中,视图管理是非常重要的一项功能,它可以帮助用户更方便地管理和查询数据。数据库视图管理是指对数据库中的视图进行创建、修改、删除、查询等操作的过程。二、准备条件参考......
  • GaussDB云数据库SQL应用系列—索引管理
    一、前言随着互联网的快速发展,数据量呈现爆炸式增长。如何高效地管理和查询这些数据成为了企业面临的重要问题。而数据库索引作为数据库优化的关键手段之一,对于提高数据库性能和查询效率具有重要作用。本文将介绍GaussDB云数据库的索引创建和管理方法,并结合实际应用场景进行分析......
  • GaussDB SQL调优:建立合适的索引
    ​背景GaussDB是华为公司倾力打造的自研企业级分布式关系型数据库,该产品具备企业级复杂事务混合负载能力,同时支持优异的分布式事务,同城跨AZ部署,数据0丢失,支持1000+扩展能力,PB级海量存储等企业级数据库特性。拥有云上高可用,高可靠,高安全,弹性伸缩,一键部署,快速备份恢复,监控告警等关......