(本文仅为平时学习记录,若有错误请大佬指出,如果本文能帮到你那我也是很开心啦)
一、分类
1.MySQL数据库:轻量级数据库,适用于中小型企业,性能好,开源的
2.MSSQL(SQLsever):微软开发,需要安装在NT(Win Ser)系统中,不支持跨平台,适用于中大型企业
3.ACCESS:小巧方便,适用于小型企业和小型项目
4.ORACLE:甲骨文公司开发,收费,适用于大型企业,跨平台,性能高,需要良好的底层硬件支持
二、常用的框架组合
1.MySQL+PHP
2.MSSQL+ASP/ASPX
3.ORACLE+Java
4.ACCESS+ASP
5.JSP(Java服务器页面)+ORACLE
三、数据库模型
1.关系型数据库(结构化数据库) MySQL MSSQL ORACLE DB2等
2.非关系型数据库(非结构化数据库) redis mongodb nosql postgresql Hbase等
四、管理MySQL数据库的方式
1.DOS-MySQL:需要配置MySQL的环境变量mysql -u root -p root
2.phpMyAdmin:基于网页的数据库管理平台
3.MySQL-Front:开源的,基于C/S模式的数据库管理平台
4.Navict:功能强大的数据库管理平台,收费
五、MySQL数据库结构:数据库名 --> 数据表 --> 表头(字段名) --> 数据内容
- 表中有几个字段就会有几列数据
- 一行数据叫记录
六、管理MySQL数据库的常用命令(注意:在DOS_MySQL命令中需要加;)
1.mysql -uroot -p (二进制方式)登录
2.exit 退出数据库
3.show databases; 查看所有数据库
1 +--------------------+
2 | Database |
3 +--------------------+
4 | information_schema | 它是5.0以后的MySQL(<5.0)数据库自带的,用来汇总数据库信息
5 | mysql | 存放当前数据库信息,如登录信息、权限设置、安全设置
6 | test | 测试数据库,可删
7 +--------------------+
4.use 数据库名; 使用数据库,表示进入到选择的数据库中
5.show tables; 查看当前数据库中的所有表
6.select * from 数据表名; 查看数据表下所有的数据内容
7.select 字段1,字段2 from 数据表名; 查找数据表中的字段1和字段2中 的数据
8.select version(); 查看当前数据库版本
七、修改密码
1.知道原密码修改:需要进入到数据库中mysql -uroot -p
- 低版本(5.0 5.1 5.5 5.6)修改密码:
1 update mysql.user set password=password(‘新密码’) where user=’root’ (and host=’127.0.0.1’);
2 UPDATE mysql.user SET PASSWORD=PASSWORD('123456Ll.') WHERE USER='root' and HOST='127.0.0.1';
3 flush privileges; 刷新数据库
- 高版本(5.7 8.0):
1 use mysql;
2 alter user “root”@”localhost” identified by “新密码”;
3 UPDATE mysql.user SET authentication_string
4 =PASSWORD('root');
5 flush privileges; 刷新数据库
- 注意:查看user里的host的值!!!
3.在MySQL系统之外去修改密码:mysqladmin -u root -p password “新密码”
4.忘记密码修改(Linux):
- 关闭MySQL服务,修改MySQL的配置文件my.ini或my.cnf
- 打开MySQL配置文件,找到[mysqld]在后面添加:skip-grant-tables(跳过密码验证),重启服务
-
-
注:在kali中默认安装了mariadb,配置文件是/etc/mysql/mariadb.conf.d/50-server.cnf
-
-
直接免密码登录MySQL数据库,利用上述方法修改密码:
1 update mysql.user set password=password(‘新密码’) where user=’root’;
2 flush privileges; 刷新数据库
- 修改配置文件,将添加的命令删除或者注释掉,再次重启服务
- 使用新密码登录测试
八、在MySQL数据库中添加账号并授权
1.添加账号:
create user “用户名”@”主机IP” identified by “密码”; 添加账号
- 主机IP:允许哪个主机登录,(localhost 本机可登录 % 任意主机可登录 192.168.1.1表示该IP上的用户可以登录)
2.添加权限:
grent 权限 on 库名.表名 to “用户名”@”主机IP”
- 权限:insert 增 drop 删 update 改 select 查 all所有
- 库名.表名:表示能够操作的数据库和表,*.* 表示所有的数据库以及所有的表
grant all on *.* to “icq”@”192.123.1.1”;
- 注意:配置文件中的bingd 127.0.0.1需要注释掉,或者根据需求进行修改
九、数据库外联(允许远程连接)
1 update user set host=”%” where user=”root” and host=”localhost”;
2 flush privileges;
十、MySQL常用的函数
1.version(); select @@version; 查看版本号
select version();
2.select user(); 查看当前账号
3.select @@hostname; 查看当前用户名
4.select @@tmpdir; 查看临时目录
5.select @@basedir; 数据库服务所在位置
6.select @@datadir; 数据存放的位置
- 数据库文件格式
- .opt 存放编码方式
- .frm 存储表结构(表头)
- .MYD 存储数据,数据内容(可使用WinHex查看)
- .MYI 存储当前数据的配置信息和索引信息
7.mid(被截取的字符串,开始索引,截取长度); 截取字符串
SELECT mid('pentest',1,3);
8.ord(); 显示字符ASCII码(首字母)
SELECT ord("A");
9.concat(); 拼接字符串
SELECT concat("1","shjsdhk","1234321");
10.concat_ws(分隔符,多个参数); 使用分隔符拼接字符串
1 SELECT concat_ws("~","1","asa","12das");
2 SELECT concat_ws(0x7c,"1","asa","12das"); | 管道符的16进制 0x7c
11.group_concat(); 分组并拼接
12.sleep(1); 让数据库等待1秒钟
SELECT sleep(10);
十一、SQL语法:
1.创建数据库
1 create database 数据库名; 在交互模式下,即命令行模式
2 mysqladmin -uroot -proot create 数据库名; 在DOS命令窗口使用,需要使用mysqladmin.exe程序
2.删除数据库
1 drop database 数据库名;
2 mysqladmin -uroot -proot drop 数据库名;
3. 数据库中数据类型
- int 整型
- bigint 大整型
- float 浮点型,单精度浮点型 0.2
- date 日期
- time 时间
- char 单个字符
- varchar 变长字符
- text 文本
- timestamp 时间戳
- double 双精度浮点型 3.00
- bit 比特(用01表示)
- tinyint 0或者tinyint 1 布尔
4.创建表:use 表;
create table 表名(字段名1 数据类型 primary key ,字段名2 数据类型,......)设置编码;
-
表中需要一个大哥作为代表,该代表是唯一的,能够表示某个人、事物,将该大哥称为主键
-
通过主键能够确定一个记录,PRIMARY KEY ( `id` ) 放在最后
- 注意:字段名不需要加单双引号,数据类型中根据需求说明长度
- auto_increment 表示自增
1 id INT NOT NULL AUTO_INCREMENT,
2 AUTO_INCREMENT=22 设置数字的意思是想要让这条语句在增长的时候,从22开始自增
- not null 表示不允许为空
title VARCHAR(100) NOT NULL,
- 设置编码:default charset=utf8;
- ENGINE=InnoDB:如果不写也可,是默认的,在这里写上是因为可以很清楚的看到这个建表语句用了哪些,而且在创建表的时候,写上也是一个很好的习惯
5.删除表
drop table 表名; 删除需要慎用
6.查看表中字段
1 show create table 表名;
2 或dsec 表名;
7.后续添加主键
alter table 表名 add primary key(字段); 注意主键的字段不为空
8.往表中插入数据
insert into 表名(字段名1,字段名2,......) value(值1,值2,......);
- 注意:数据类型为字符串的,在添加数据时需要加上””,自增的主键可以不用插入数据
9.在表中查询数据
1 select 字段名 from 表名;
2 select 字段名 from 表名 where 字段名=指定的值; 一个条件
3 select 字段名 from 表名 where 字段名1=值1 and或or 字段名2=值2; 多条件
10.限制查询
1 limit a,b; a和b均为数字,a表示记录的索引(索引从0开始),b表示记录的长度
2 select * from 表名 limit 1,2;
3 limit a; 从0开始选择a个记录
4 select * from 表名 limit 1;
11.更新数据
1 update 表名 set 字段1=值1,字段2=值2; 更改所有的字段,将字段1下的所有值都改为值1 2 update 表名 set 字段1=值1,字段2=值2 where 条件;
12.删除表中数据
delete from 表名 where 条件; 慎用!!!
13.like子句:模糊查询
- 通配符:% 匹配任意字符 _ 匹配单个字符
select * from 表名 where name like “字段匹配符”;
14.Union联合查询
- 语法:查询语句1 union 查询语句2 将查询出来的结果放在一张表中显示,查询出来的字段个数必须一致!
1 select 1,2,3;
2 select 1 as a,2 as b,3 as c; 把1放在a字段中
3 select * from 表名; 这个数据表中也只有3个字段
4 selet * from 表名 union select 1 as a,2 as b,3 as c;
- 可以根据查询语句2 的字段数量判断查询语句1的字段数量
select * from mysql.user union select 1,2,3,......,45;
15.Order by
- 语法:order by 条件 根据给定的条件排序,默认情况下表的排序时升序
select * from 表名 order by 字段 [asc或desc]; 根据执行的字段名去排序
- asc升序,desc降序
- 如果数字超过了字段的列数,则会报错,可以根据数字来推断表中的字段数
select * from 表名 order by 数字; 表示对第n列数据进行排序
16.删除字段
alter table 表名 drop 字段名; 删除指定表下的字段名
17.添加字段:
alter table 表名 add 字段名 字段类型;
18.修改表名:
alter table 原表名 rename to 新表名;
19.去重查询:
select distinct 字段 from 表名;
20.注释符:#和--
十二、数据的导入和导出
1.导入数据:
- 方法1:mysql -uroot -proot <需要导入的数据库文件(data.sql)注意:data.sql需要自动创建数据库,并且需要选择该数据库
- 如果data.sql不会自动创建数据库,手动创建数据库
1 mysql -uroot -proot
2 create databases 数据库名;
3 use 数据库名;
4 source 数据库文件;
- 方法2:使用phpmyadmin等平台导入数据,如果导入的文件还是不能自动创建数据库,则需要手动创建
- 方法3:首先需要创建数据库,创建数据表名(表名和导入数据库文件名一致),该表的字段名要和导入的数据的字段保持一致
1 mysqlimport -uroot -proot --local 被导入的数据库名 需要导入的数据库文件 2 --local 表示本地任意位置均可导入数据,加上-L即可
2.导出数据
- 方法1:借助平台(phpMyAdmin、mysql-fornt、navicat等等)
- 方法2:
1 mysqldump -uroot -proot 要导出的数据库名 > 路径./data.sql 导出数据库 2 mysqldump -uroot -proot 数据库名 要导出的数据表名 > 路径 导出数据表
- 方法3:
1 select 字段 from 表名 into outfile “文件名”; 将数据库中的字段内容导入到文件中 2 select * from mysql.user into outfile “./123.txt”; 3 ERROR 1290 (HY000): The MySQL server is running with the --secure-file-priv option so it cannot execute this statement
-
- 首次从数据库中导出文件,数据库会运行--secure-file-priv安全机制,会限制导入导出文件。查看该安全项的值:
1 show global variables like ‘%secure_file_priv%’; 2 secure_file_priv为NULL,表示MySQL限制导入导出 3 secure_file_priv没有值,表示MySQL不限制导入导出 4 secure_file_priv值为目录,表示MySQL只能在目录下执行导入导出,其他目录不允许
-
- 修改该安全选项:
- 临时方法:
- 修改该安全选项:
1 set global secure_file_priv=’’; 2 ERROR 1238 (HY000): Variable 'secure_file_priv' is a read only variable 表示不能通过SQL语句更改
-
-
- 长久方法:修改配置文件,在配置文件中找到[mysqld],在后面添加secure_file_priv=’’,保存退出,重启服务
-
十三、使用PHP操作MySQL数据库
1.使用mysqli扩展(推荐),只针对mysql数据库
- 面向对象的方式
1 <?php 2 $ser="127.0.0.1"; 3 $name="root"; 4 $pwd="root"; 5 6 //面向对象 7 8 @$conn=new mysqli($ser,$name,$pwd); 9 if($conn -> connect_error){ 10 // echo "连接失败:" . $conn -> connect_error; 11 die("连接失败:" . $conn -> connect_error); 12 }else{ 13 echo "数据库连接成功!"; 14 } 15 $conn->close();
-
直接方式(面向过程)
1 <?php 2 $ser="127.0.0.1"; 3 $name="root"; 4 $pwd="root"; 5 6 //面向过程 7 8 $conn=mysqli_connect($ser,$name,$pwd); 9 if($conn){ 10 echo mysqli_connect_error(); 11 } 12 echo "连接成功!!!"; 13 var_dump($conn); 14 mysqli_close($conn);
2.使用mysql扩展(OHO<=5.5) 2012年开始不建议使用
3.使用PDO(PHP data objects)技术(防止sql注入)面向对象的方式,即需要new对象(推荐)可以应用在12种数据库种
1 <?php 2 $ser="127.0.0.1"; 3 $name="root"; 4 $pwd="root"; 5 6 //PDO 7 try{ 8 $conn=new PDO("mysql:host=$ser;,$name,$pwd"); 9 echo "连接成功!!!"; 10 } 11 catch(PDOException $ee){ 12 //print_r($ee); 13 echo $ee->getMessage(); 14 } 15 $conn=null;
4.使用mysqli和PDO需要通过phpinfo()查看当前环境中有没有mysqli和pdo的扩展
5.常用语句
1 $conn=mysqli_connect(ip:port,name,pwd,db) 连接数据库 2 $result=mysqli_query(连接$conn,SQL语句) 3 mysqli_num_rows($result) 查询记录数 4 mysqli_fetch_assoc($result) 将结果第一行转换为关联数组 5 mysqli_fetch_all($result) 将结果所有行转换为关联数组和数字数组 6 mysqli_fetch_array($result) 将结果第一行转换为关联数组和数字数组
6.创建数据库
1 <?php 2 include 'mysql.conf'; 3 $conn=mysqli_connect($ip,$name,$pwd); 4 $sql="create database teachers"; 5 if(mysqli_query($conn,$sql)){ 6 echo "创建数据库成功!!!"; 7 } 8 else{ 9 echo mysqli_error($conn); 10 } 11 mysqli_close($conn); 12 13 mysql.conf 14 <?php 15 $ip="127.0.0.1"; 16 $name="root"; 17 $pwd="root";
7.创建数据表
1 <?php 2 include 'mysql.conf'; 3 $conn=mysqli_connect($ip,$name,$pwd,$db); 4 $sql1="create database teachers"; 5 $sql2="create table info( 6 id int(10) unsigned auto_increment primary key, 7 name varchar(50) not null)";//创建表 8 //$sql3="insert into info(id,name) values (1,'qwe')"; 9 if(mysqli_query($conn,$sql2)){ 10 echo "创建数据表成功!!!"; 11 } 12 else{ 13 echo mysqli_error($conn); 14 } 15 16 mysqli_close($conn); 17 <?php 18 $ip="127.0.0.1"; 19 $name="root"; 20 $pwd="root"; 21 $db="teachers";
8.插入数据
1 <?php 2 include 'mysql.conf'; 3 $conn=mysqli_connect($ip,$name,$pwd,$db); 4 $sql1="create database teachers"; 5 $sql2="create table info( 6 id int(10) unsigned auto_increment primary key, 7 name varchar(50) not null, 8 date timestamp)";//创建表 9 $sql3="insert into info(name) values ('qwe')";//插入数据 10 $sql4="insert into info(name) values ('ertt');insert into info(name) values ('sdfddf')";//插入多行数据 11 if(mysqli_query($conn,$sql3)){ 12 echo "插入数据成功!!!"; 13 } 14 else{ 15 echo mysqli_error($conn);//打印错误信息 16 } 17 18 mysqli_close($conn); 19 <?php 20 $ip="127.0.0.1"; 21 $name="root"; 22 $pwd="root"; 23 $db="teachers";
9.读取数据
1 <?php 2 include 'mysql.conf'; 3 $conn=mysqli_connect($ip,$name,$pwd,$db); 4 $sql1="create database teachers"; 5 $sql2="create table info( 6 id int(10) unsigned auto_increment primary key, 7 name varchar(50) not null, 8 date timestamp)";//创建表 9 $sql3="insert into info(name) values ('ccc')";//插入数据 10 $sql4="insert into info(name) values ('ertt');insert into info(name) values ('sdfddf')";//插入多行数据 11 $sql5="select * from info"; 12 $result=mysqli_query($conn,$sql5); 13 if($result){ 14 echo "查询数据成功!!!"; 15 var_dump($result); 16 $numbers=mysqli_num_rows($result);//查询的记录数 17 /*$rows=mysqli_fetch_assoc($result);//将执行的结果转化成关联型数组 18 var_dump($rows);*/ 19 while ($rows=mysqli_fetch_assoc($result)) { 20 print_r($rows); 21 } 22 23 } 24 if(mysqli_query($conn,$sql3)){ 25 echo "插入数据成功!!!"; 26 } 27 else{ 28 echo mysqli_error($conn);//打印错误信息 29 } 30 31 mysqli_close($conn); 32 <?php 33 $ip="127.0.0.1"; 34 $name="root"; 35 $pwd="root"; 36 $db="teachers";