SQL(MySQL)
大佬实力展示验证SQL约束攻击
很有意思的是
比如SQL约束字段最长不超过15,
那么如果超过这个数,之后的就不会被保存进数据库去,
比如如果某个数据库之前有过注册用户名为’admin’的,如果我们再注册用户名为’admin 1’(中间空格数加上admin和1要超过15) 这样的话我们可以注册成功,保存在数据库的用户名是’admin’,此时使用admin登录,实际返回的会是第一个admin,也就是别人的
在SQL中执行字符串处理时,字符串末尾的空格符将会被删除。(like语句是例外)
解决方法:(2,3不是很理解)
1.unique约束
2.最好使用’id’作为数据库表的主键。并且数据应该通过程序中的id进行跟踪
3.为了更加安全,还可以用手动调整输入参数的限制长度(依照数据库设置)
bugku中有一道login1(SKCTF),
要管理员登录,注册用户名为admin,发现已经存在,使用’admin '注册,可以注册,再使用admin访问,访问的 是之前存在的用户名为admin的内容,也就是flag
正式讲MySQL
先知道:SQL是结构化查询语言;
MySQL是关系型数据库管理系统
本记录是在MySQL中练习SQL语法等
实验楼(<-相当详细,有操作环境)
mysql的标注为#,sql不区分大小写
安装
sudo apt-get install mysql_server #安装服务端,核心程序:
sudo apt-get install mysql_client #安装客户端:
验证是否安装成功:
sudo netstat -tap | grep mysql
启动sql服务
sudo service mysql start #启动mysql服务:
mysql -u root #使用root用户登录
关于数据库的操作
mysql -u root; #创建数据库时,注意要进入sql交互环境
否则会出现zsh: command not found:create,错误
create database mysql_shiyan; #创建名为mysql_shiyan的数据库
show databases; #查看有哪些数据库,注意分号
use information_schema #连接 information_schema数据库,进入这个库
drop database XXX; #删除数据库:
单选 enum(‘a’,‘b’,‘c’)
多选 set(‘a’,’,b’)
变长字符串varchar 真正的长度会多1,额外那个1是用来储存字符串本身的长度
长文本数据 text
mysql数据类型
mysql数据类型
enum,set,varchar,time,year,date,text需要用单引号括起数据
关于表的操作
show tables; #查看有哪些**表**,注意分号
创建表 以下
create table xxx(id int(19),name char(10)); #数据类型 列名,长度`,创建表
或者
creat table xxx #xxx是表名,后面里面的东西是列名 可以这种方式写,一目了然
->(
->id int(19),
->name char(10)
->);
在表里插入数据
insert into XXX(表名)
比如:
insert into employee(id,name) values(01,'Sandra');
insert into employee values(02,'Wendy');
查看表employee里的数据:
select: #查看表里内容
select * from XXX(表名) (#表示查找所有内容)
select XXX(列名) from XXXX(表名) where XX(限制条件) (where可以由=,<,>,<=,>= 所限制)
也可以 where age between 17 and 49; 来取得包括17 和49 的数。
in ;not in
select name,age,house from XX where house in('house1','house2');
筛选出house列里值为house1,house2的几行
no in 用法同上
like
like和通配符(未知字符,sql里是% 和_)一起使用
_(一个未指定字符)
%(不定个未指定字符)
where phone like '1510000____'; #(这里有四个_)可以记为'电话号码好像是1510000。。。。
where name like 'J%'; #名字好像是J开头来着
order by
默认是升序(asc升序,desc降序)
select name,salary,age,phone from employee order by salary desc;
修改表名
rename table XXX to XX;
alter table XXX rename XX;
alter table XXX rename to XX;
删除表
drop table XXX;
sql内置函数:
max,min, (数字,字符,日期时间)
count(计数,对象可以是任意类型),
sum,avg(数字)
select max(age) as max_age,min(age) from people;
#从people表里选出年龄最大的用as重命名为max_age,选出年龄最小的
#这里age的最大值会重命名为max_age,最小值还是min;
约束(协助)
primary key(在一张表中通过主键就能准确定位到一行。主键不能有重复且不能为空。);
not null;
unique key(一张表中指定的一列的值必须不能有重复值,即这一列每个值都是唯一的);
default;
foreign key(一个表可以有多个外键,每个外键必须 REFERENCES (参考) 另一个表的主键,被外键约束的列,取值必须在它参考的列中有对应值。)
#!!!外键要灵活使用
使用约束:
create table XXX(
->AAA int(10) primary key, #AAA,CCC为列名,BBB表名,这是主键
->CCC int(10) ,foreign key(cid) references BBB(cid) #CCC里的cid值跟BBB里的cid值一样
);
PS:实验楼挑战一注意使用外键
git clone http://... #git语句将http://..里的东西克隆到本地
在数据库中 source /home/。。(位置),可以让位置里的数据库在show databases里出现,加载文件中的数据
如果有->突然变成 ‘>,无法退出的问题,可以: ‘>’ ,补一个’ (解决引号不成对问题)
- 子查询
连接查询
select id,name,people_num
->from employee,department
->where employee.in_dpt=department.dpt_name
->order by id;
这段代码实现的是:
最后呈现id,name,people_num三列,其中,id,name来自employee表,people_num来自department表(代码里只有employee表里有id,name),其中employee表里in_dpt列的数据和department表里dpt_name数据是一样的。employee.in_dpt只有全部的不重复集合,department.dpt_name更具体,将具体的赋值过去后写出来,就是新的people_num列
select id,name,people_num
->from employee join department
->on employee.in_dpt=department.dpt_name
->order by id;
效果同上
对表的内容(列)进行修改
(似乎都是alter开头,alter意思是改变,修改,下面可以记为修改名为XXX的表。。。)
增加一列:
alter table XXX add column XX int(X) default 120;
alter table 表名 add column 列名 数据类型 约束限制;(不写column也可以达到效果)
alter table XXX add XX int(X) default (X) after XXx(列名);(在XXx列后面加名为XX的列)
alter table XXX add XX int X default X first;(插在第一列的位置)
删除一列:
alter table XXX drop (column) XX; #这里加不加column效果一样;
修改列名:
alter table XXX change 原列名 新列名 数据类型 约束限制;
(数据类型不能省,而且修改数据类型可能会导致原来数据的丢失,慎用!)
alter table XXX change age nianlin int(4) default 20;#将表名为XXX里的age列名修改为nianlin
数据类型可以单独改变
alter table XXX modify XX 新的数据类型
修改表中某个数据
比如:
(修改前后可以先select * from XXX where name=‘Wendy’; 来观察前后变化)
update table XXX set age=1,salary=22 where name='Wendy';
将XXX表里name列值为Wendy的相应age,salary 列进行数据修改,注意指定where,否则那一列全部改掉了,就。。。
删除一行数据
比如:
delete from XXX where name='Wendy';
索引
第一种:alter table XXX add index 索引名(列名);
比如
alter table employee add index id_dex(id);
第二种: create index 索引名 on 表名(列名);
show index from XXX(表名); (查看刚刚添加的索引)
视图: create view 视图名(列a,列b,列c) as select 列1,列2,列3 from 表名;
只看到对自己有用的数据(视图是虚拟的表)
create view v_emp(v_name,v_age,v_phone) as select name,age,phone from employee;
select * from v_emp;
新建一个v_emp表,表里只有v_name,v_age,v_phone 三列数据,数据来自于employee表里的name,age,phone
导入
load data infile ‘文件路径/文件名’ into table 表名;
sudo cp -a …/SQL6 /var/… 拷贝命令,将var…的内容拷贝到SQL6里
sudo vim /var… 查看var…内容
导出
备份
备份退出mysql进行操作
mysqldump -u root 数据库名 > 备份名 #备份数据库
mysqldump -u root 数据库名 表名 > 备份名 #备份表
恢复
source tmp/SQL6/MySQL-06.sql 这就是吧MySQL6里的数据库恢复的命令
退出MySQL
Ctrl+Z可以退出MySQL
可以 quit; 或者 exit;
上一篇: 获取日期,日期与时间戳的转换,以及获取前后几天的日期
下一篇: javascript的变量命名规则