[MySQL]MySQL数据库基础知识与操作
MySQL基础知识
为什么要有数据库?
文件存储的缺点
- 1.没有以某种特定的数据格式存储数据,查找不方便,只能遍历
- 2.安全性:数据误操作后不能回滚
- 3.每次操作数据都要用户自己操作
- 4.数据量大的时候,操作的成本很高
创建一个库的本质——在对应路径下创建目录
创建一个表的本质——对应路径下创建文件(先选中数据库——进入对应目录)
SQL语句可分为如下三类:
- DDL(Data Definition Language)数据定义语言,用来维护存储数据的结构。比如create语句、drop语句、alter语句等。
- DML(Data Manipulation Language)数据操作语言,用来对数据进行操作。比如insert语句、delete语句、update语句等。
- DCL(Data Control Language)数据控制语言,主要负责权限管理和事务。比如grant语句、revoke语句、commit语句。
mysql的架构
mysql主要由四层组成
- 连接层:主要完成一些类似连接处理,授权认证及相关的安全方案。
- 服务层:在MySQL数据库系统处理底层数据之前的所有工作都是在这一层完成的,包括权限判断、SQL接口、SQL解析、SQL分析优化、缓存查询的处理以及部分内置函数执行等。各个存储引擎提供的功能都集中在这一层,如存储过程、触发器、试图等。
- 引擎层:由多种可拔插的存储引擎共同组成,真正负责MySQL中数据的存储和提取,每个存储引擎都有自己的优点和缺陷,服务层是通过存储引擎API来与它们交互的。
- 存储层:将数据存储在裸设备的文件系统之上,完成存储引擎的交互。
存储引擎
存储引擎就是数据库管理系统如何存储数据、如何为存储的数据建立索引、如何更新数据、如何查询数据等技术的实现方法,MySQL中的存储引擎是插件式的存储引擎,它可以支持多种存储引擎
可以通过show engines来查看引擎
最常用的是InnoDB和MyISAM
默认是使用InnoDB,该存储引擎支持事务,行级锁,外键等,MyISAM则不支持
用InnoDB创建表,在对应的目录下会多两个文件
用MyISAM创建表,在对应的目录下会多三个文件
创建文件的不同其实是因为不同的引擎采用不同的数据结构进行存储数据(以后会讲到)
数据库的介质
主要有磁盘数据库与内存数据库
磁盘数据库
- 数据主要存储在磁盘上,在数据持久化保存上有优势,例如MySQL
- 为了提高数据的存储效率,磁盘数据库也有自己的缓存机制,在某一个时刻,不一定所有的数据都被刷新到磁盘上了
内存数据库
- 数据主要存储在内存上,大大提高数据的读取速度,减少访问数据库的时间
- 不意味着内存数据库完全不适用磁盘,数据库的启动信息,初始数据还是存在磁盘中的,只是数据主要在内存中进行存储和运算
- 为了防止掉电数据丢失,数据库服务关闭前通常需要把内存中的数据转移到磁盘,甚至一些数据在运行的时候就被拷贝到磁盘
库操作
库的增删改
增加库:create database db_name;
删除库:drop database db_name;
显示库:show databases;
库的备份:mysqldump -P3306 -uroot -p -b db1,db2>back.sql
备份其实是将库从创建到现在所执行的每一句sql都记录到文件back.sql中
库的恢复其实就是将back.sql的语句逐步执行——source back.sql
创建一个库的本质——在对应路径下创建目录
表操作(DDL)
创建表
CREATE TABLE [IF NOT EXISTS] table_name(
field1 datatype1 [COMMENT '注释信息'],
field2 datatype2 [COMMENT '注释信息'],
field3 datatype3 [COMMENT '注释信息']
)[CHARSET=charset_name] [COLLATE=collation_name] [ENGINE=engine_name];
查看表
DESC table_name
SHOW CREATE TABLE 表名\G
修改表
ALTER TABLE table_name ADD 新增列名 新增列的属性;
ALTER TABLE table_name MODIFY 列名 修改后的列属性;
ALTER TABLE table_name DROP 列名;
ALTER TABLE table_name RENAME [TO] 新表名;
ALTER TABLE table_name CHANGE 列名 新列名 新列属性;
删除表
DROP [TEMPORARY] TABLE [IF EXISTS] table_name;
查看当前库下所有表
SHOW TBALES
数据类型
文本
char(L):定长,适合存储身份证,电话号码——存储可能浪费但访问快,每次访问固定长度
vchar(L):变长,适合存储名字,地址等——存储小但访问慢,要先加载信息,在访问
vchar类型中需要1~2个字节来存储实际数据长度,还要1字节来存储其他控制信息
text:存储大文本信息
blob:存储二进制文件
这里的L指的是字符,一个汉字也算一个字符(mysql进行这样的处理更方便了)
字符串类型
enum——enum('男','女'),多选一
set——set('玩游戏','敲代码','打篮球'),多选多
find_in_set(str,strlist)函数查询strlist中是否含有str,如果有则返回str在strlist中的位置
示例:select *from user where find_in_set('玩游戏',hobby);
这样就能找出爱好包含玩游戏的用户了
时间类型
date——日期类型:YYYY—MM—DD,占用3字节
datatetime——日期类型:YYYY—MM—DD HH:MM:SS占用8字节
timestamp——时间戳,以YYYY—MM—DD HH:MM:SS格式展示,占用4字节,可用在论坛时间