传统文件保存数据的缺点:
文件的安全性问题
文件不利于查询管理数据;(如果我要中间插入,难道要打开文件遍历解着插入移动后半部分数据吗?)
文件不利于海量数据存储(不断地插入删除,意味着不断地打开关闭IO流,效率问题?)
文件在程序中控制不方便
因此,专家设计出了数据库这个东西,专门来高效管理数据;
数据是it业的石油,数据库的水平是衡量一个程序员水平的重要指标;
SQL Sever:微软的产品,.Net程序员的最爱,中大型项目。
Oracle:甲骨文产品,适合大型项目,复杂的业务逻辑,并发一般来说不如MySQL。
MySQL:世界上最受欢迎的数据库,属于甲骨文,并发性好,不适合做复杂的业务。主要用在电商,SNS,论坛。对简单的SQL处理效果好。
SQLite:是一款轻型的数据库,是遵守ACID的关系型数据库管理系统,它包含在一个相对小的C库中。它的设计目标是嵌入式的,而且目前已经在很多嵌入式产品中使用了它,它占用资源非常的低,在嵌入式设备中,可能只需要几百K的内存就够了。
安装数据库的同时会安装数据库服务器和数据库客户端;
为保存应用中实体的数据,一般会在数据库中创建多个表,以保存程序中实体的数据;(正式员工表,外包员工表)
数据库服务器、数据库和表的关系如下:
我们主要研究Linux下,mysql5.7版本数据库(安装client端和server端过程省略)为了更好的可视化和便捷操作,可以选择win端配合如SQLyog这类可视化工具进行操作;
mysql -h 127.0.0.1 -P 3306 -u root -p //Liunx连接sql服务器
/*SQL语句每部分后面都需要加;否则识别不出来;*/
create database helloworld; /* 创建数据库helloworld */
use helloworld /* 使用(进入)数据库 */
create table student( /* 在数据库中创建表(列属性) */
id int,
name varchar(32),
gender varchar(2)
);
insert into student (id, name, gender) values (1, '张三', '男');/* 表中插入数据 */
insert into student (id, name, gender) values (2, '李四', '女');
insert into student (id, name, gender) values (3, '王五', '男');
select * from student /* 查询表中所有数据(后可跟where name = 'xxx';查询限定条件的记录) */
在Linux下连接mysql后,需要执行shellcode的话需要在指令前面加system [shellcode]
MySQL 是一个可移植的数据库,几乎能在当前所有的操作系统上运行,如 Unix/Linux、Windows、Mac 和 Solaris。各种系统在底层实现方面各有不同,但是 MySQL 基本上能保证在各个平台上的物理体系结构的一致性。
存储引擎是:数据库管理系统如何存储数据、如何为存储的数据建立索引和如何更新、查询数据等技术的实现方法。
MySQL的核心就是插件式存储引擎,支持多种存储引擎。
show engines; //查看存储引擎
create database xxx [charset=utf8 collate utf8_general_ci];//[字符集,校验规则]为可选项,一般配置好的default自动填;
create database test1 [collate utf8_general_ci];//utf8_general_ci校验规则不区分大小写
create database test2 [collate utf8_bin区分大小写];//utf8_bin区分大小写
创建库之后,对应的文件会多出这个库的有关文件用来保存;
则假设有表:
create table person(name varchar(20));
insert into person values('a');//四条记录
insert into person values('A');
insert into person values('b');
insert into person values('B');
utf8_general_ci校验规则不区分大小写查询结果:
utf8_general_ci校验规则不区分大小写排序结果:
utf8_bin区分大小写排序
可见,校验规则根据业务设定的不同有重要作用;
eg:将 mytest 数据库字符集改成 gbk
DROP DATABASE db_ name;
执行删除之后的结果:
这个工作一般是DBA数据库管理员做的;
备份:
mysqldump -P3306 -u root -p123456 -B mytest > D:/mytest.sql //备份表只需要在mytest数据库名后添上表名
mysqldump -P3306 -u root -p123456 -B mytest table1 > D:/mytest.sql //备份表
还原:
source D:/mysql-5.7.22/mytest.sql;
show processlist; //查看多少人连接了你的MySQL服务器
create table users (
id int,
name varchar(20) comment '用户名',
password char(32) comment '密码是32位的md5值',
birthday date comment '生日'
) character set utf8 engine MyISAM;
自定义的属性名 : 类型(comment +'xx’代表说明,类似注释)
id : int
name : varchar(20)
password : char(30)
birthday : date
desc 表名;
insert into users values(1,'a','b','1982-01-04'),(2,'b','c','1984-01-04'); //users表中插入两条记录
users表中添加属性
alter table users add path varchar(100) comment '图片路径' after birthday; //添加path属性在birthday后面!,之前的记录这个属性自动设为NULL;
修改users表中name属性,长度变为60
alter table users modify name varchar(60); //修改name属性,长度变为60
删除password列
注意:删除字段一定要小心,删除字段及其对应的列数据都没了
alter table users drop password;
修改名称
alter table users rename to employee;//修改表名为employee
alter table employee change name xingming varchar(60); //将name列修改为xingming,注意修改名称也需要重新定义类型
可以看到,修改表内容操作关键就是看第四个单词,有drop(删除属性),rename(修改表名),change(更换属性名称),modify(修改属性大小),add(添加属性)
删除整个表
drop table t1;