数据库MySql
打开MySQL的步骤
step1.打开phpstudy
step2.打开MySQL文件
step3.找到这个路径
step4.点鼠标右键选择"在Window终端打开"
会跳出这样一个界面
输入".mysql -uroot -p"
会跳出一个输入password的命令
我们输入root就ok了
基本操作
数据库
添加数据库
先创建个叫xjw的数据库
哦哦记得要在每一句最后加个";",不然系统以为你没打完,会很贴心地一直在下一行出现" ->"这个,让你继续
再看看有什么
就是说刚创的就啥也没有
然后我们试试查那些我们之前就有的数据库
记得database要加个s,因为数据库不止一个哈哈哈哈
还可以查看databases里其他的,比如mysql
就是说每次都忘记加";"就很尴尬
删除数据库
不舍得删xjw,那就拿mysql下手好了哈哈哈哈
数据表
数据表-包含
指定数据库
搜一下xjw里面的所有表
真的就empty,那等一下看看怎么加点登西进去
那就看看东西多一点的先好了叭
东西太多了就不一一展示好了,总共有61行
数据表-信息
语句:select from where user='*';
例:
注释符
1、#... //加了后 后面内容都不起作用
2、"-- ..." //(注意:--后面有一个空格)
3、/*...*/ //加了后 里面内容都不起作用
增删改查
上面的例子里已经提到了增(create database)、删(drop database)、查(show databases)了
接下来说说改(alter database charset )好了
这里的改指的是编号,用utf8放引号里才可以,数据库名还会有其他的语句来改的
创建个表
step1.先选择一个数据库
step2.用" create table moon(id int) "输入
于是我们去查找的话就可以有数据出现啦
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;
例
数据表约束
约束条件 | 说明 |
---|---|
PRIMARY KEY | 主键约束用于唯一标识对应的记录 |
FOREIGN KEY | 外键约束 |
NOT NULL | 非空约束 |
UNIQUE | 唯一性约束 |
DEFAULT | 默认值约束,用于设置字段的默认值 |
超键、候选键、主键、外键
例:
超键(爷爷)候选键(爸爸)主键(自己)外键(舅舅家的我)
我身上有爷爷的遗传基因,但是继承爸爸的遗传基因更多,外公那边的遗传基因只有外公有遗传,而舅舅和表弟的遗传基因和我一点关系都没有
数据
修改数据名
这里是修改了数据库中数据表中数据的名字
增删改查
(一)增
例:step1.先看看数据库中有哪些表
step2.挑选想要加入数据的表,再用insert语句执行:
INSERT INTO 表名(字段名1,字段名2,…) VALUES(值1,值2,…);
在这道指定字段名的例题是这样子的:
insert into users (id,username,password)values(1,'moon','123456');
如果不指定字段名(id,username,password这一类)也没事,直接输入"insert into values(null,'test','123456');"输出也是不变哒
如果只给指定的字段添加数据如下:
增加多条数据
INSERT INTO 表名[(字段名1,字段名2,…)]VALUES (值1,值2,…),(值1,值2,…),
(二)删
第一种方法:
DELETE FROM 表名 [WHERE 条件表达式
第二种方法:truncate
它的作用是清空表或者说是截断表,只能作用于表
truncate会重置表的自增值,就是默认从1开始,而且一删就删整个表的所有记录;但是用 delete 不会,而且可以只删除表中的部分数据
(三)改
UPDATE 表名 SET 字段名1=值1,[ ,字段名2=值2,…][ WHERE 条件表达式 ]
例:先看好我们原来还没变过的表哈
然后加一个update语句,把密码变一下,记得要把id说一下,不然会一下子把"moon"和"alex1"的密码都修改了
要修改多个数据也是一样的
(四)查
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;
好久没看图了,来一张图康康好啦
还记得我们之前搞渗透(猜密码)的时候,就说了这个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;
"
其实我感觉下面的要更方便一些
(二)同理改变字段的名字
MySQL的子查询
where子查询
select * from users where id in (select id from users where id>10);
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进行改写
union语句一般就都是这样子的,判断显示位,找出相关信息,比如有什么表或者是字段
看好嗷,这上面是两个表,接下来magic...
各种连接
背景
先按暗月说的来把navicat注册一下
然后会看到有好几个数据库,直接看心情选一个进行"新建表"的操作
会出现一个新界面
我们自己新加三个字段(包括设置名、类型、长度、空值、自动递增),顺便把id设置成主键
哦哦,记得要把主键那一列的"允许空值"取消,因为主键不能有空的嗷
吼吼,a_class表 这就建好啦,接下来就是填填东西进去了,不然太空了就
当当,okkkkk
然后继续再多加个 b_class 表
内连接
关键字:inner join on
我们要通过内连接来把这两张表的信息联系起来
本题内连接语句:select * from a_user a inner join b_class b on a.class_id=b.user_id
就相当于把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
这个的意思就是把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;
MySQL查询
IFORMATION_SCHEMA
是 MySQL 自带的信息数据库
在powershell里面的语句是:SHOW DATABASES;
TABLES
存储数据库中的表信息(包括视图),包括表属于哪个数据库,表的类型、存储引擎、创建时间等信息
在powershell里面的语句是:SHOW TABLES FROM XX;
COLUMNS
存储表中的列信息,包括表有多少列、每个列的类型等
在powershell里面的语句是:SHOW COLUMNS FROM schemaname.tablename
MYSQL注入语句分析
首先我们先查询整体的信息,直接上SCHEMATA
因为我们一般都不需要太多,目标很明确,把靶机日了,所以我们直奔主题——查CHEMA_NAME
SELECT SCHEMA_NAME FROM information_schema.SCHEMATA
又因为这种东西有时候就超级多,而且重要的一般都是藏在第一条里的,所以我们限制一下输出
SELECT SCHEMA_NAME FROM information_schema.SCHEMATA LIMIT 1
select table_name from information_schema.tables where TABLE_SCHEMA=database() limit 3,2;
十六进制绕过
如果一个网站不让输入某个单词或者语句
我们就可以把那个单词或者语句转化成十六进制
例:如果不能输入"xjw",那就转换成"0x786a77"
评论已关闭