数据库MySql

打开MySQL的步骤

step1.打开phpstudy

step2.打开MySQL文件

image-20211204150756792

step3.找到这个路径

image-20211204150922351

step4.点鼠标右键选择"在Window终端打开"

image-20211204150419407

会跳出这样一个界面

image-20211204150535573

输入".mysql -uroot -p"

会跳出一个输入password的命令image-20211204151105132

我们输入root就ok了

image-20211204151229312

基本操作

数据库

添加数据库

先创建个叫xjw的数据库

哦哦记得要在每一句最后加个";",不然系统以为你没打完,会很贴心地一直在下一行出现" ->"这个,让你继续

image-20211204151933154

再看看有什么

image-20211204152008643

就是说刚创的就啥也没有

然后我们试试查那些我们之前就有的数据库

image-20211204152418586

记得database要加个s,因为数据库不止一个哈哈哈哈

还可以查看databases里其他的,比如mysql

image-20211204152809854

就是说每次都忘记加";"就很尴尬

删除数据库

不舍得删xjw,那就拿mysql下手好了哈哈哈哈

image-20211204153052373

数据表

数据表-包含

指定数据库

image-20211204153517622

搜一下xjw里面的所有表

image-20211204153804869

真的就empty,那等一下看看怎么加点登西进去

那就看看东西多一点的先好了叭

image-20211204154450404

image-20211204154514677

东西太多了就不一一展示好了,总共有61行

数据表-信息

语句:select from where user='*';

例:image-20211204155219606

注释符

1、#...          //加了后 后面内容都不起作用

2、"-- ..."         //(注意:--后面有一个空格)

3、/*...*/          //加了后 里面内容都不起作用

增删改查

上面的例子里已经提到了(create database)、(drop database)、(show databases)了

接下来说说(alter database charset )好了

这里的改指的是编号,用utf8放引号里才可以,数据库名还会有其他的语句来改的

image-20211204191554399

创建个表

step1.先选择一个数据库

step2.用" create table moon(id int) "输入

image-20211204194859289

于是我们去查找的话就可以有数据出现啦

image-20211204201646427

if not exists :有相同表名存在时,则不执行创建语句

完整的建立表的语句

create table users(id int(7) AUTO_INCREMENT
username varchar(100) not null,
        password varchar(100) not null,
        PRIMARY KEY(id)
        )ENGINE=InnoDB DEFAULT CHARSET=utf8;

image-20211205185732879

数据表约束

约束条件说明
PRIMARY KEY主键约束用于唯一标识对应的记录
FOREIGN KEY外键约束
NOT NULL非空约束
UNIQUE唯一性约束
DEFAULT默认值约束,用于设置字段的默认值
超键、候选键、主键、外键

例:

超键(爷爷)候选键(爸爸)主键(自己)外键(舅舅家的我)

img

我身上有爷爷的遗传基因,但是继承爸爸的遗传基因更多,外公那边的遗传基因只有外公有遗传,而舅舅和表弟的遗传基因和我一点关系都没有


数据

修改数据名

image-20211205195856044

这里是修改了数据库中数据表中数据的名字

增删改查

(一)

例:step1.先看看数据库中有哪些表

image-20211205200508930

step2.挑选想要加入数据的表,再用insert语句执行:

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

在这道指定字段名的例题是这样子的:

insert into users (id,username,password)values(1,'moon','123456');

image-20211205201112139

如果不指定字段名(id,username,password这一类)也没事,直接输入"insert into values(null,'test','123456');"输出也是不变哒

image-20211205201750255

如果只给指定的字段添加数据如下:

image-20211205202525453

增加多条数据

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

image-20211205205230839

(二)

第一种方法:

DELETE FROM 表名 [WHERE 条件表达式 

第二种方法:truncate

它的作用是清空表或者说是截断表,只能作用于表

truncate会重置表的自增值,就是默认从1开始,而且一删就删整个表的所有记录;但是用 delete 不会,而且可以只删除表中的部分数据

(三)

UPDATE 表名 SET 字段名1=值1,[ ,字段名2=值2,…][ WHERE 条件表达式 ]

例:先看好我们原来还没变过的表哈

image-20211205213001779

然后加一个update语句,把密码变一下,记得要把id说一下,不然会一下子把"moon"和"alex1"的密码都修改了

image-20211205213402497

要修改多个数据也是一样的

(四)

select * from users;

查询指定的字段

select username,password from users;

条件调节查询(比如 id>=2 什么的都ok的)

关系来查询

SELECT 字段名1,字段名2,…FROM 表名WHERE 条件表达式

范围内查询

1.举例:查询 student2 表中 id 值为1,2,3的记录 :SELECT * FROM student2 WHERE id IN (1,2,3);或者 id NOT IN (1,2,3) 或者 id>=2

2.举例:查询student2表中id值在2~5之间的人的 id 和 name:SELECT id,name FROM students WHERE id BETWEEN 2 AND 5;

空值查询

举例:查询student2表中gender值为空值的记录 :SELECT * FROM student2 WHERE gender IS NULL;

重复值查询

举例:查询student2表中gender字段的值,结果中不允许出行重复的值 :SELECT DISTINCT gender FROM student2;

like文本查询——就是跟word里面查找包含不包含查找值一样的

1.举例:查询student2表中name字段以字符“ s ”开头的人的id,name:SELECT id,name FROM student2 WHERE name LIKE "S%";

2.举例:查询student2表中name字段以字符“ w ”开始,以字符“ g ”结尾的人的id,name:SELECT id,name FROM student2 WHERE name LIKE 'w%g';

3.举例:查询student2表中name字段不包含“ y ”的人的id,name:SELECT id,name FROM student2 WHERE name NOT LIKE '%y%';

4.举例:查询指定包含内容的的人的id:SELECT id,name FROM student2 WHERE name NOT LIKE 'moo—_';

高级查询

聚合函数查询:count()、sum()、ave()、max()、min()

分组函数查询:group by

举例:查询student2表中的数据,按照gender字段进行分组 :SELECT * FROM student2 GROUP BY gender;

好久没看图了,来一张图康康好啦

image-20211206192441007

还记得我们之前搞渗透(猜密码)的时候,就说了这个group by可以把数据库全显示出来来着的

分组函数+聚合函数

举例:将student2表按照gender字段进行分组查询,计算出每组共有多少个人:SELECT **COUNT(*)** ,gender FROM student2 **GROUP BY** gender;

GROUP BY HAVING 关键字

举例:将student2表按照gender字段进行分组查询,查询出grade字段值之和小于300的分组

SELECT **sum(grade)**,gender FROM student2 GROUP BY gender **HAVING** SUM(grade) < 300;

使用 LIMIT 限制查询结果的数量

查询student2表中的前四条记录SELECT * FROM student LIMIT 4;

说白了就是限制输出数据的量

为表和字段取别名

(一)有时候表的名字就很长,占空间就很大,所以我们可以给他在语句里取个小名,不用定义先的,把后面的属性输对就ok了

例:select * from users as u where u.id=1;

这样输出的就是id值为1的字段了,不用打出它的名字,这一句话等同于"select * from users where id=1; "

其实我感觉下面的要更方便一些

(二)同理改变字段的名字

image-20211206195824220

MySQL的子查询

where子查询

select * from users where id in (select id from users where id>10);

image-20211206202900202

from子查询

.FROM 子查询的数据来源是另外一个查询的结果,这个子查询的结果是一个集合,相当于一张临时数据表

select * from (select * from users where id>10) as ages_10;

先执行括号里的,这个里查询出来的是一个别名为age_10的集合

exists子查询

select * from users where EXISTS (select * from users where id>1) ;

例:查询所有的学生,前提条件是班级存在

step1:确定数据源

 select * from t_student where ?;

 step2:确定条件是否满足

 Exists(select * from t_class);

 step3:SQL语句

 SELECT * FROM t_student WHERE EXISTS(SELECT * FROM t_class);

union联合查询

UNION的作用是将两个select查询结果合并

像我们之前的靶机上就是输入 union select 1,2,3,最后跳出来了2,3的信息,于是我们就可以在接下来只对2和3进行改写

image-20211206213404237

union语句一般就都是这样子的,判断显示位,找出相关信息,比如有什么表或者是字段

image-20211206214059002

看好嗷,这上面是两个表,接下来magic...

image-20211206213917658

各种连接

背景

先按暗月说的来把navicat注册一下

image-20211207181010197

然后会看到有好几个数据库,直接看心情选一个进行"新建表"的操作

image-20211207181253843

会出现一个新界面

image-20211207181834332

我们自己新加三个字段(包括设置名、类型、长度、空值、自动递增),顺便把id设置成主键

哦哦,记得要把主键那一列的"允许空值"取消,因为主键不能有空的嗷

image-20211207182623044

吼吼,a_class表 这就建好啦,接下来就是填填东西进去了,不然太空了就

image-20211207182958777

当当,okkkkk

然后继续再多加个 b_class 表

image-20211207183557453

内连接

关键字:inner join on

我们要通过内连接来把这两张表的信息联系起来

本题内连接语句:select * from a_user a inner join b_class b on a.class_id=b.user_id

image-20211207184314060

就相当于把a和b表有对应id值的都输出来,诶我忘记把a表的序号截图了,没事没事,就就就懂就好了

左连接

关键字:left join on / left outer join on

就把上面内连接的 inner 改成 left 点击"运行"就ok了

select * from a_user a left JOIN b_class b on a.class_id=b.user_id

image-20211207185456737

这个的意思就是把a表的东西全显示出来,b表只显示符合要求的记录

右连接

关键字:right join on / right outer join on

跟左连接相反就就就,没啥好说的,就把b表的东西全显示出来,加上a表和b表(内连接)重合的部分

语句:select * from a_table a right outer join b_table b on a.a_id = b.b_id;

image-20211207191601998

MySQL查询

IFORMATION_SCHEMA

是 MySQL 自带的信息数据库

image-20211207193048101

在powershell里面的语句是:SHOW DATABASES;

image-20211207195611768

TABLES

存储数据库中的表信息(包括视图),包括表属于哪个数据库,表的类型、存储引擎、创建时间等信息

image-20211207194732198

在powershell里面的语句是:SHOW TABLES FROM XX;

image-20211207195555344

COLUMNS

存储表中的列信息,包括表有多少列、每个列的类型等

image-20211207195800951

在powershell里面的语句是:SHOW COLUMNS FROM schemaname.tablename

image-20211207200001374

MYSQL注入语句分析

首先我们先查询整体的信息,直接上SCHEMATA

image-20211207200907258

因为我们一般都不需要太多,目标很明确,把靶机日了,所以我们直奔主题——查CHEMA_NAME

SELECT SCHEMA_NAME FROM information_schema.SCHEMATA

image-20211207201419606

又因为这种东西有时候就超级多,而且重要的一般都是藏在第一条里的,所以我们限制一下输出

image-20211207201701654

SELECT SCHEMA_NAME FROM information_schema.SCHEMATA LIMIT 1
select table_name from information_schema.tables where TABLE_SCHEMA=database() limit 3,2;

image-20211207210410719

十六进制绕过

如果一个网站不让输入某个单词或者语句

我们就可以把那个单词或者语句转化成十六进制

例:如果不能输入"xjw",那就转换成"0x786a77"

image-20211207213506938