(本文仅为平时学习记录,若有错误请大佬指出,如果本文能帮到你那我也是很开心啦)

 

一、分类

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";
创建数据库.php

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";
创建数据表.php

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";
插入数据.php

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";
读取数据.php