欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

SQL(MySQL)

程序员文章站 2022-06-01 07:53:13
...

大佬实力展示验证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;

相关标签: mysql数据库