关系型数据库和非关系型数据库的种类和区别和关系型数据库基本操作
数据库 类型 特性 优点 缺点 关系型数据库 SQLite、Oracle、mysql 1、关系型数据库,是指采用了关系模型来组织 数据的数据库; 2、关系型数据库的最大特点就是事务的一致性; 3、简单来说,关系模型指的就是二维表格模型, 而一个关系型数据库就是由二维表及其之间的联系所组成的一个数据组织。 1、容易理解:二维表结构是非常贴近逻辑世界一个概念,关系模型相对网状、层次等其他模型来说更容易理解; 2、使用方便:通用的SQL语言使得操作关系型数据库非常方便; 3、易于维护:丰富的完整性(实体完整性、参照完整性和用户定义的完整性)大大减低了数据冗余和数据不一致的概率; 4、支持SQL,可用于复杂的查询。 1、为了维护一致性所付出的巨大代价就是其读写性能比较差; 2、固定的表结构; 3、高并发读写需求; 4、海量数据的高效率读写; 非关系型数据库 MongoDb、redis、HBase 1、使用键值对存储数据; 2、分布式; 3、一般不支持ACID特性; 4、非关系型数据库严格上不是一种数据库,应该是一种数据结构化存储方法的集合。 1、无需经过sql层的解析,读写性能很高; 2、基于键值对,数据没有耦合性,容易扩展; 3、存储数据的格式:nosql的存储格式是key,value形式、文档形式、图片形式等等,文档形式、图片形式等等,而关系型数据库则只支持基础类型。 1、不提供sql支持,学习和使用成本较高; 2、无事务处理,附加功能bi和报表等支持也不好;
先上一个比较表述专业化的表格分析。
关系型数据库优点:
-
用的都是表结构,比较容易理解
-
使用的是通用的SQL语言
-
减少了数据的冗余和数据不一致的情况发生
-
可以进行表或者多个表之间的复杂查询
关系型数据库缺点:
-
固定的表结构,灵活性欠缺
-
为了维持表结构而牺牲了读写性能
-
高并发读写能力较差
非关系型数据库优点:
-
格式灵活,数据类型多种多样,可以是键对值,甚至是文档,图片,应用场景广泛,但是关系型数据库只支持原有的数据类型
-
由于是非关系型,数据没有耦合性,容易扩展
-
无须通过sql层的解析,读写能力较高
-
成本低,nosql数据库部署简单,基本都是开源软件
非关系型数据库缺点:
-
不提供sql支持,学习成本高
-
无事务支持
-
由于数据类型灵活,也导致了数据结构相对复杂,在复杂查询方面比较麻烦
总结
数据库操作
1.创建数据库:create database ${new_Database_Name}
2.删除数据库:drop database${database_Name}
3.建表: create table ${table_Name} {
${'field_name1'} ${field_type} primary key,
//设立第一个字段的名字和字段类型且将第一个字段作为主键,设立主键也是为了保障数据之间的关联性
${'field_name1'} ${field_type},
//设立第二个字段的名字和字段类型
}
4.删除表 drop table ${table_name}
5.插入数据 insert into ${table_name} values(value1,value2,value3)
insert into ${table_name}(field1,field2) values(value1,value2) //指定字段插入
-
数据库查询 select ${field_name2,filed_name2} from ${database_name}
where 表达式
-
删除数据 delete from ${table_name}
where 表达式
表达式中可以包含LIKE,REGEXP ,并且可以后接union select 进行联合查询
8.数据更新 update ${table_name} set ${field_name}=${value} where 表达式
数据类型
数值
类型 | 大小 | 范围(有符号) | 范围(无符号) | 用 途 |
---|---|---|---|---|
TINYINT | 1 字节 | (-128,127) | (0,255) | 小整数值 |
SMALLINT | 2 字节 | (-32 768,32 767) | (0,65 535) | 大整数值 |
MEDIUMINT | 3 字节 | (-8 388 608,8 388 607) | (0,16 777 215) | 大整数值 |
INT或INTEGER | 4 字节 | (-2 147 483 648,2 147 483 647) | (0,4 294 967 295) | 大整数值 |
BIGINT | 8 字节 | (-9,223,372,036,854,775,808,9 223 372 036 854 775 807) | (0,18 446 744 073 709 551 615) | 极大整数值 |
FLOAT | 4 字节 | (-3.402 823 466 E+38,-1.175 494 351 E-38),0,(1.175 494 351 E-38,3.402 823 466 351 E+38) | 0,(1.175 494 351 E-38,3.402 823 466 E+38) | 单精度 浮点数值 |
DOUBLE | 8 字节 | (-1.797 693 134 862 315 7 E+308,-2.225 073 858 507 201 4 E-308),0,(2.225 073 858 507 201 4 E-308,1.797 693 134 862 315 7 E+308) | 0,(2.225 073 858 507 201 4 E-308,1.797 693 134 862 315 7 E+308) | 双精度 浮点数值 |
DECIMAL | 对DECIMAL(M,D) ,如果M>D,为M+2否则为D+2 | 依赖于M和D的值 | 依赖于M和D的值 | 小数值 |
日期时间
类型 | 大小 (字节) | 范围 | 格式 | 用途 |
---|---|---|---|---|
DATE | 3 | 1000-01-01/9999-12-31 | YYYY-MM-DD | 日期值 |
TIME | 3 | '-838:59:59'/'838:59:59' | HH:MM:SS | 时间值或持续时间 |
YEAR | 1 | 1901/2155 | YYYY | 年份值 |
DATETIME | 8 | 1000-01-01 00:00:00/9999-12-31 23:59:59 | YYYY-MM-DD HH:MM:SS | 混合日期和时间值 |
TIMESTAMP | 4 | 1970-01-01 00:00:00/2038 结束时间是第 2147483647 秒,北京时间 2038-1-19 11:14:07,格林尼治时间 2038年1月19日 凌晨 03:14:07 | YYYYMMDD HHMMSS | 混合日期和时间值,时间戳 |
字符串类型
类型 | 大小 | 用途 |
---|---|---|
CHAR | 0-255字节 | 定长字符串 |
VARCHAR | 0-65535 字节 | 变长字符串 |
TINYBLOB | 0-255字节 | 不超过 255 个字符的二进制字符串 |
TINYTEXT | 0-255字节 | 短文本字符串 |
BLOB | 0-65 535字节 | 二进制形式的长文本数据 |
TEXT | 0-65 535字节 | 长文本数据 |
MEDIUMBLOB | 0-16 777 215字节 | 二进制形式的中等长度文本数据 |
MEDIUMTEXT | 0-16 777 215字节 | 中等长度文本数据 |
LONGBLOB | 0-4 294 967 295字节 | 二进制形式的极大文本数据 |
LONGTEXT | 0-4 294 967 295字节 | 极大文本数据 |
实践
先创建一个新的库作为练手,最后使用use语句选择则新创建的数据库
在test库中分别建立了digit,time,string三个表来分别存储数值,日期时间,字符串三种不同的类型数据
这里可以通过desc语法查看表的结构
进行简单的数据插入操作
然后进行查询操作
这里进行查询操作,由于表中只有一条数据就不后加whre和表达式了,可以看到数据被更改成10了
这里进行数据删除的操作,先插入一条无用的数据
进行删除
可以看到之前插入的数据消失了,删除成功,至此mysql的基本操作学习完成。
----------分隔符---------
mysql指令
limit指令
limit [位置偏移量,]行数
若第一条记录的偏移量为0,可以理解为跳过了多少条记录,行数则代表从偏移量开始返回多少条数据
偏移量默认为0
limit 4 代表 返回4条数据
limit 0,3 代表从0开始返回3条数据
REGEXP正则表达式
匹配模式内容过多,这里不用于阐述
补充:关于LIKE和REGEXP的区别:LIKE匹配整个列。如果被匹配的文本仅在列值中出现,LIKE并不会找到它,相应的行也不会返回(当然,使用通配符除外)。而REGEXP在列值内进行匹配,如果被匹配的匹配的文本在列值中出
查看表结构
descript ${table_name} 可以省略为desc
增添新用户
授权:grant select on 数据库.* to 用户名@登录主机 identified by “密码”
例子:grant select,insert,update,delete on test.digit to test1@localhost “%” Identified by “abc”;
例子中增加了一个用户test1密码为abc且只可以在本地登录,且对test库的digit表具有插入,查询,插入三中操作权限的用户
收回权限: 例子:revoke delete ON test.digit from test1@localhost;
将test1对test库中digit表的删除权限去除。
-
ALTER: 修改表和索引
-
CREATE: 创建数据库和表
-
DROP: 抛弃(删除)数据库和表
-
INDEX: 创建或抛弃索引
-
INSERT: 向表中插入新行
-
SELECT: 检索表中的记录
-
UPDATE 修改现存表记录
-
FILE: 读或写服务器上的文件
-
PROCESS: 查看服务器中执行的线程信息或杀死线程
-
RELOAD: 重载授权表或清空日志。主机缓存或表缓存
-
SHUTDOWN: 关闭服务器
-
ALL: 所有权限,ALL PRIVILEGES同义词 USAGE: 特殊的“无权限”权限
除此之外还有十二种单独授权,可以搭配起来进行使用
删除用户
例子:Delete FROM user Where User='test' and Host='localhost'; 删除一个user为test且host为本地网络的账号
这里也可以使用update语句修改用户user的password字段
加索引
mysql> alter table 表名 add index 索引名 (字段名1[,字段名2 …]); 例子: mysql> alter table employee add index emp_name (name);
加主关键字的索引
mysql> alter table 表名 add primary key (字段名); 例子: mysql> alter table employee add primary key(id);
加唯一限制条件的索引
mysql> alter table 表名 add unique 索引名 (字段名); 例子: mysql> alter table employee add unique emp_name2(cardnumber);
删除某个索引
mysql> alter table 表名 drop index 索引名; 例子: mysql>alter table employee drop index emp_name;
增加字段
mysql> ALTER TABLE table_name ADD field_name field_type;
例如:在表MyClass中添加了一个字段passtest,类型为int(4),默认值为0 mysql> alter table MyClass add passtest int(4) default '0'
修改原字段名称及类型: mysql> ALTER TABLE table_name CHANGE old_field_name new_field_name field_type;
删除字段: MySQL ALTER TABLE table_name DROP field_name;
修改表名
命令:rename table 原表名 to 新表名;
例如:在表MyClass名字更改为YouClass mysql> rename table MyClass to YouClass;
当你执行 RENAME 时,你不能有任何锁定的表或活动的事务。你同样也必须有对原初表的 ALTER 和 DROP 权限,以及对新表的 CREATE 和 INSERT 权限。
如果在多表更名中,MySQL 遭遇到任何错误,它将对所有被更名的表进行倒退更名,将每件事物退回到最初状态。
附录:sqli-lab 安装
uname -a //保证linux内核是3.01以上
sudo apt-get install -y docker.io
docker version //检查安装情况
sudo groupadd docker //建立新的用户组
sudo gpasswd -a ${USER} docker //然后把当前用户加入docker组
sudo service docker restart //重启服务
newgrp - docker //切换到docker用户组
//默认情况下, docker 命令会使用 Unix socket 与 Docker 引擎通讯。
//而只有 root 用户和docker 组的用户才可以访问 Docker 引擎的Unix socket。
//这就是换源的原因
sudo vim /etc/docker/daemon.json //这一步用于换docker源,镜像源自寻
docker search sqli-lab
docker pull ${mirror-name}
docker run -dt --name sqli -p 5000:80 --rm acgpiano/sqli-labs //启动sqli-lab-dt 让其在后台运行
//-dt 让其在后台运行 --name 给其命名 -p 本地端口:docker中的端口 是将docker的端口映射到本地端口
//--rm 当其关闭后将删除开启的资源
这时候打开本地的5000端口即可运行sqli-lab