Bootstrap

sql基础学习之MySQL以及对数据库的增删改查

0x01 前言:

数据库: 什么是数据库?

  数据库(Database)是按照数据结构来组织、存储和管理数据的仓库。 每个数据库都有一个或多个不同的 API 用于创建,访问,管理,搜索和复制所保存的数据。

数据库又分为关系型数据库(SQL)和非关系型数据库(NOSQL)。而我们今天的主角MySQL则为关系型数据库。

  什么是 关系型数据库
关系型数据库,是建立在关系模型基础上的数据库,借助于集合代数等数学概念和方法来处理数据库中的数据。

  什么是关系型数据库管理系统
关系型数据库管理系统,是一个用于维护关系数据库的程序,是所有现代数据库系统的基础,例如 MySQL、Microsoft SQL Server、Oracle 和 Microsoft Access,重要的是其使用 SQL 查询 来访问数据库中的数据。

关系型数据库管理系统有如下特点

  • 数据以表格的形式出现
  • 每行为各种记录名称
  • 每列为记录名称所对应的数据域
  • 许多的行和列组成一张表单
  • 若干的表单组成database

0x02 Mysql 安装

可以使用phpstudy等软件,或者直接从官网下载安装。过程略

  安装完后我们就可以 连接mysql:
(账号密码填安装时修改的、这里我默认都使用root用户操作,自己使用的时候注意权限问题)

环境:php5.3+mysql5.5.53

①二进制方式连接

mysql.exe -uroot -proot

在这里插入图片描述

②PHP脚本连接Mysql
    这里使用的是 mysql_connect 函数连接.
PHP代码:

<?php
@error_reporting(0);
$dbuser ='root';
$dbpass ='root';
$host = 'localhost';
//(PHP 4, PHP 5) mysql_connect — 打开一个到 MySQL 服务器的连接
@$con = mysql_connect($host,$dbuser,$dbpass);
//Check connection
if (!$con){
    echo "Failed to connect to MySQL: " . mysql_error();
}else{
    echo "连接成功~";
}
?>

连接效果如图所示:

在这里插入图片描述

…以及其他方式连接

0x03 Mysql SQL语言

注:

  • sql有个特性,sql关键字不区分大小写,如:selectSELeCT 相同。
  • 分号是在数据库系统中分隔每个 SQL 语句的标准方法,允许同时执行多条sql语句,一些数据库系统会要求在SQL语句的末尾使用分号。

03.1 Mysql 创建数据库

当第一次连接/登录Mysql服务器后,我们可以使用 create 命令创建数据库. 命令如下:

    CREATE DATABASE [你的数据库名称]

比如新建一个名称为 “hello_test” 的数据库,这里也可以通过多种方式创建:

mysql 命令行创建:

CREATE  DATABASE hello_test;

在这里插入图片描述

通过可视化数据库连接工具创建,如Navicat

CREATE  DATABASE hello_test;	//命令不变
							//或者..直接在Navicat中 右键 新建数据库

在这里插入图片描述

使用 PHP 创建数据库

    这里使用 mysqli_query 函数连接,不用 mysql_query 是因为此函数已经在php5.5.0废弃。

在这里插入图片描述
mysqli_query 函数使用方法:

		mysqli_query(connection,query,resultmode);
参数Description
connection必需。规定要使用的 MySQL 连接。
query必需,规定查询字符串。
resultmode可选。一个常量。

完整的PHP代码👇:(注意这里的mysql操作语句都换成了mysqli_xx)

<?php
@error_reporting(0);
$dbuser ='root';
$dbpass ='root';
$host = 'localhost';
//(PHP 5, PHP 7, PHP 8) mysqli_query — Open a new connection to the MySQL server
@$con = mysqli_connect($host,$dbuser,$dbpass);
//Check connection
if (!$con){
    echo "Failed to connect to MySQL: " . mysqli_error();
}else{
    echo "连接成功~";
}
echo "<br>";
$newdbname = "hello_test";
$sql  = 'CREATE  DATABASE $newdbname;';
$res = mysqli_query($con,$sql);
if(!$res){
	die("Unable to create to the database: $newdbname".mysqli_error());
}
echo "$newdbname 数据库创建成功";
?>

在这里插入图片描述

最后在数据库中也可以看到我们新建的库。

mysql> show databases;
+-----------------------+
| Database              |
+-----------------------+
| information_schema    |
| 10fenpk               |
| $newdbname            |
| booksystem            |
| challenges            |
| college               |
| dcr1_1_5              |
| dedecmsv57utf8sp2     |
| dvwa                  |
| gjcms                 |
| hello_test            |
| mysql                 |
| performance_schema    |
| #mysql50#phpcmsV9.6.3 |
| phpcmsv9              |
| pikachu               |
| pkxss                 |
| rockxinhu             |
| scms5                 |
| security              |
| test                  |
+-----------------------+
21 rows in set (0.00 sec)

03.1 Mysql 删除数据库

      是不是很熟悉,删库跑路。
注意:此操作和创建数据库一样,都需要特定的权限才能操作数据库,业务中请勿轻易删库。

这里可以使用 drop 命令来删除数据库,命令如下:
    drop DATABASE [你的数据库名称];
同样以 hello_test 数据库为例:

mysql命令行:

drop  DATABASE hello_test;

在这里插入图片描述
Navicat中删除数据库
在这里插入图片描述
or

在这里插入图片描述

使用 PHP 删除数据库
    同样还是使用 mysqli_query 函数。

PHP完整代码👇:

<?php
@error_reporting(0);
$dbuser ='root';
$dbpass ='root';
$host = 'localhost';

@$con = mysqli_connect($host,$dbuser,$dbpass);
//Check connection
if (!$con){
    echo "Failed to connect to MySQL: " . mysqli_error();
}else{
    echo "连接成功~";
}
echo "<br>";
$newdbname = "hello_test";
$sql  = 'drop  DATABASE $newdbname;';	//删除数据库--
@$res = mysqli_query($con,$sql);
if(!$res){
	die("Unable to drop to the database: $newdbname".mysqli_error());
}
echo "$newdbname 数据库删除成功";
?>

在这里插入图片描述

03.3 Mysql 使用数据库

在连接到MySQL服务器后,我们可以选择需要操作的数据库。

使用方法:
MySQL命令行中:

mysql -uroot -pxxxx

use mysql;

在这里插入图片描述
再此之前,如果不知道有哪些数据库,show databases; 查看即可

使用 PHP 来选择 Mysql 数据库

   这里我们用到 mysqli_select_db 这个函数
在这里插入图片描述
两个参数,含义也是顾名思义,同时该函数返回布尔值:函数执行成功返回True,失败则返回False。

下面给出具体PHP代码👇:(注意,在这里发现了一个问题:mysqli_error这个函数是 必须要接受一个参数的,难怪之前经常报错…)

<?php
@error_reporting(0);
$dbuser ='root';
$dbpass ='root';
$host = 'localhost';
@$con = mysqli_connect($host,$dbuser,$dbpass);
//Check connection
if (!$con){
    echo "Failed to connect to MySQL: " . mysqli_error($con);
}else{
    echo "连接成功~";
}
echo "<br>";
$dbname = "mysql";	//这里选择mysql数据库
@$res = mysqli_select_db($con, $dbname);
if(!$res){
	die("选择数据库失败:".mysqli_error($con));
}
echo "success,使用".$dbname."数据库";
?>

在这里插入图片描述

mysqli_error(connection);

参数Description
connection必需,规定要使用的 MySQL 连接

03.4 Mysql 创建表

在创建表之前我们先了解一下MySQL支持的一些数据类型:
    大致分为三类:数值、日期/时间和字符串(字符)类型。

  • 数值类型:如int,bigint,float,double等。
  • 日期/时间类型:如data、time、datatime等。
  • 字符串类型:CHAR、VARCHAR、TINYBLOB等。

而创建MYSQL的数据表需要以下信息:表名(表的)字段名定义表的字段

    SQL语法为:

	CREATE TABLE table_name (column_name data_type[size] [NOT NULL|NULL] [DEFAULT value] 
[AUTO_INCREMENT])

这里看 菜鸟教程 的一个例子:

CREATE TABLE IF NOT EXISTS `runoob_tbl`(
   `runoob_id` INT UNSIGNED AUTO_INCREMENT,
   `runoob_title` VARCHAR(100) NOT NULL,
   `runoob_author` VARCHAR(40) NOT NULL,
   `submission_date` DATE,
   PRIMARY KEY ( `runoob_id` )
)ENGINE=InnoDB DEFAULT CHARSET=utf8;

解释:

 - column_name指定列的名称。每列具有特定数据类型和大小,例如:VARCHAR(100)- NOT NULLNULL表示该列是否接受NULL值。
 - PRIMARY KEY关键字用于定义列为主键。 您可以使用多列来定义主键,列间以逗号分隔。
 - AUTO_INCREMENT指示每当将新行插入到表中时,列的值会自动增加。每个表都有一个且只有一个
auto_increment列,一般用于主键。
 - DEFAULT值用于指定列的默认值。
 - ENGINE 设置存储引擎,CHARSET 设置编码。

使用MySQL命令行创建表👇

mysql> use security;
Database changed
mysql> create table test_security (
    -> id int NOT NULL AUTO_INCREMENT,
    -> name VARCHAR(100) NOT NULL,
    -> PRIMARY KEY ( id )
    -> );
Query OK, 0 rows affected (0.01 sec)

     看到已经创建成功:

在这里插入图片描述

使用PHP连接创建Mysql数据表
(这里需要注意的一点是,在创建表之前,需要先 选择/使用数据库
PHP实现代码如下:👇

<?php
@error_reporting(0);
$dbuser ='root';
$dbpass ='root';
$host = 'localhost';
//(PHP 5, PHP 7, PHP 8) mysqli_query — Open a new connection to the MySQL server
@$con = mysqli_connect($host,$dbuser,$dbpass);
//Check connection
if (!$con){
    echo "Failed to connect to MySQL: " . mysqli_error($con);
}else{
    echo "连接成功~";
}
echo "<br>";
//选择数据库
mysqli_select_db( $con, 'security' );
$sql  = 
	"create table test2_security (".
	"id int NOT NULL AUTO_INCREMENT,".
	"name VARCHAR(100) NOT NULL,".
	"PRIMARY KEY ( id )".
	");";
$res = mysqli_query($con,$sql);
if(!$res){
	die("Unable to create to the table ".mysqli_error($con));
}
echo "表创建成功";
?>

在这里插入图片描述

查看数据库:
在这里插入图片描述

·ps·当没有选择数据库时,报错如下:
在这里插入图片描述

03.5 Mysql 删除表

SQL语法为:(使用方法同 MySQL删除数据库

	drop TABLE table_name ;

不过有一点需要注意的是,在删除数据表之前需要先选择数据库
     use dbname;
     mysqli_select_db( $conn, $dbname );



03.6 Mysql 数据的 增(I) 查(S) 改(U) 删(D)

   03.6.1 插入数据-insert

   当我们创建好了MySQL数据库和数据表(同时创建了表的字段)的时候,这时我们可以使用SQL语句 insert into 来向数据库中插入数据,语法如下:

INSERT INTO table_name ( field1, field2,…fieldN )
            VALUES
            ( value1, value2,…valueN );

使用MySQL命令行插入:

insert INTO test_security(id,name)
values
(1,“user1”),(2,“user2”);

结果如下:

mysql> use security;
Database changed
mysql> show tables;
+--------------------+
| Tables_in_security |
+--------------------+
| emails             |
| referers           |
| test2_security     |
| test_security      |
| uagents            |
| users              |
+--------------------+
6 rows in set (0.00 sec)

mysql> select * from test_security;
Empty set (0.00 sec)

mysql> insert INTO test_security(id,name)
    -> values
    -> (1,"user1"),(2,"user2");
Query OK, 2 rows affected (0.00 sec)
Records: 2  Duplicates: 0  Warnings: 0

mysql> select * from test_security;
+----+-------+
| id | name  |
+----+-------+
|  1 | user1 |
|  2 | user2 |
+----+-------+
2 rows in set (0.00 sec)

② 使用PHP连接 插入数据:
代码如下:

<?php
@error_reporting(0);
$dbuser ='root';
$dbpass ='root';
$host = 'localhost';
//(PHP 5, PHP 7, PHP 8) mysqli_query — Open a new connection to the MySQL server
@$con = mysqli_connect($host,$dbuser,$dbpass);
//Check connection
if (!$con){
    echo "Failed to connect to MySQL: " . mysqli_error($con);
}else{
    echo "连接成功~";
}
echo "<br>";
//选择数据库
mysqli_select_db( $con, 'security' );
$sql  = 		//插入语句
	"insert INTO test_security(id,name)".
	"values".
	"(3,'user3'),(4,'user4');";
$res = mysqli_query($con,$sql);
if(!$res){
	die("Unable to insert to the table ".mysqli_error($con));
}
echo "插入成功";
?>

在这里插入图片描述

   03.6.2 查询数据-select

   我们可以使用SQL语句 SElEcT 来进行查询数据。

SQL查询语法为:

select column_name_1,column_name_2,[…]
from
[schema_name.]table_name
[where cause]
[limit x][ offset n]

其中column_name代表要查询的字段名,table_name 表示从某张表中查询、这里也可以使用 [数据库名.表名] 的形式来指定从 库a.表b 中查询数据,【where cause】 为限定条件,limit 可以用来限定返回的数据条数,offset 为开始查询时的数据偏移量/默认为0。

mysql中limit子句用于限制由 SELECT 语句返回的数据数量,这里提及一下MySQL中 limit 的用法:

1、select * from test_security limit 2;   //表示从表中提取(前)2行,结果如下:
.
在这里插入图片描述
.
2、select * from test_security limit 2,4;   //表示取第 3,4行的数据
在这里插入图片描述
.
3、select * from test_security LIMIT 4 OFFSET 2;   //同2,表示取第 3,4行的数据
.
在这里插入图片描述

简单演示下:

mysql> use mysql;
Database changed
mysql> select * from security.test_security;
+----+-------+
| id | name  |
+----+-------+
|  1 | user1 |
|  2 | user2 |
|  3 | user3 |
|  4 | user4 |
+----+-------+
4 rows in set (0.00 sec)

mysql> select * from security.test_security where id<>1 limit 2 offset 1;
+----+-------+
| id | name  |
+----+-------+
|  3 | user3 |
|  4 | user4 |
+----+-------+
2 rows in set (0.00 sec)

这里解释一下最后一条语句:
    此时我们使用的是mysql库,select 表示查询所有字段信息,但查询的是security库下的 test_security 表,故为 from security.test_security,where 限定了 id字段 <> 1 /即不等于1。到了这里查询出来的数据则为 id=2,3,4 的这三条数据。现在以这三条数据为基准,再进行一次过滤,limit 2 表示取(从当前偏移量开始的)前两行数据,offset 值为 1、也就是 select 从第二行开始选择查询。故最后结果为 id=3,4 的两行数据。

   03.6.3 更新数据-update

   我们可以使用SQL语句 UpdAte 来进行更新数据。

SQL 语法为:

UPDATE table_name SET column_1=new-value1, column_2=new-value2 [WHERE Clause]

使用update语句:
 可以同时更新一个或者多个字段;如果只想更新某个字段名,则只需要填写对应的即可。
 where 子句为限定条件,最好给予充分,并且where 可以指定任何条件

下面使用两条命令在MySQL命令行中进行更新数据

UPDATE test_security SET name=name+1 ;
  //这里没有使用where子句。该语句可以将 test_security 表中的所有 name 的值增加1;


UPDAtE test_security SeT name=“name2” where id = 1 ;
  //这里使用where子句。该语句将 test_security 表中 id=1 的 name 字段值修改为 “name2”;

结果如下:

mysql> select * from test_security;
+----+------+
| id | name |
+----+------+
|  1 | 1    |
|  2 | 1    |
|  3 | 1    |
|  4 | 1    |
+----+------+
4 rows in set (0.00 sec)

mysql> UPDATE test_security SET name=name+1 ;
Query OK, 4 rows affected (0.00 sec)
Rows matched: 4  Changed: 4  Warnings: 0

mysql> select * from test_security;
+----+------+
| id | name |
+----+------+
|  1 | 2    |
|  2 | 2    |
|  3 | 2    |
|  4 | 2    |
+----+------+
4 rows in set (0.00 sec)

mysql> UPDAtE test_security SeT name="name2" where id = 1 ;
Query OK, 1 row affected (0.00 sec)
Rows matched: 1  Changed: 1  Warnings: 0

mysql> select * from test_security;
+----+-------+
| id | name  |
+----+-------+
|  1 | name2 |
|  2 | 2     |
|  3 | 2     |
|  4 | 2     |
+----+-------+
4 rows in set (0.00 sec)

mysql>

   03.6.4 删除数据-delete

   我们可以使用SQL语句 delEte From 来进行删除数据。

SQL 语法为:

 DELETE FROM table_name [WHERE Clause]

注意:
如果没有指定 WHERE 子句,MySQL 表中的所有记录将被删除。还是有必要添加 WHERE 子句的

下面在MYSQL中删除id为1的数据,语句为:

dEleTe from test_security wHere iD = 1;

  结果如下:

mysql> select * from test_security;
+----+-------+
| id | name  |
+----+-------+
|  1 | name2 |
|  2 | 2     |
|  3 | 2     |
|  4 | 2     |
+----+-------+
4 rows in set (0.00 sec)

mysql> dEleTe from test_security wHere iD = 1;
Query OK, 1 row affected (0.00 sec)

mysql> select * from test_security;
+----+------+
| id | name |
+----+------+
|  2 | 2    |
|  3 | 2    |
|  4 | 2    |
+----+------+
3 rows in set (0.00 sec)

同时注意下 delete 和 drop 的区别

0x04 暂告一段落

在这里简单先介绍一下MySQL语言的特性 和 MySQL的一些基础语法,数据库的创建以及对数据的增删改查,还有很多细节没有讲。后面陆续总结更新sql注入和sql注入绕waf等等的时候会尽量都写出来。

;