数据库
相关知识(了解)
数据库是一类软件(程序),这与我们之前所学的数据结构不同,数据结构是一门学科。但是数据库这个软件内部也运用到了很多的数据结构。学习数据结构的目的是为了组织数据
数据库的功能就是用来组织数据,这些数据通常是存储在磁盘上的。数据库这类软件提供的功能就是对数据的管理(增删改查)。
冯诺依曼是计算机行业的祖师爷。
内存:访问速度快,空间小,成本较高,如果掉电了,内存中数据丢失,俗称运存
外存:访问速度满,空间大,成本较低,,俗称内存,如果掉电了,外存数据保留,磁盘,硬盘,包括U盘,光盘等都是外存
内存与外存的访问速度差距在3-4个数量级,也就是几千上万倍
1s=1000ms,1ms=1000us,1us=1000ns,1ns=1000ps
计算机中读取一次内存数据时间为:ps-ns级别
读取一次磁盘时间为:ns-us级别
操作一次mysql时间为:ms-s级别
所以,存在内存里可以极大的提高速度
在实际开发中,数据库往往需要存储很多的数据,同时很容易达到系统性能的瓶颈
对于任何一个公司,数据都是命脉,而公司的数据主要都是通过数据库来存储与管理的。
SQL是一种编程语言,而MySQL这是一个具体的数据库,一般通过SQL语言来操作数据库。
MySQL是数据库这类软件的一个典型代表,而Oracle是数据库一哥,SQL Server 是微软开发的数据库软件,而SQLite是使用最广泛的数据库,每一个手机上都内置了SQLite,还有Redis、HBase、MongoDB、MariaDB等这些都是数据库的软件。
而数据库分为关系型数据库和非关系型数据库,关系型数据库对于数据的约束比较严格,都是使用表这样的结构来存储数据的。而非关系型数据库对于数据的约束没那么严格,通常都是通过文档这样的结构来存储数据的。MySQL就是关系型数据库,而Redis、Hbase、MongoDB都是非关系型数据库。
服务器:被动接收请求的一端就叫服务器,响应Response
客户端:主动发送请求的一端就叫客户端,请求Request
文本:文件/数据中只包含字符
二进制:可能包含其它内容
区分二进制与文本的方法就是用记事本打开文件,如果是能看懂(没有乱码)则是文本文件。
SQL语言时写在MySQL客户端的,先把sql从客户端发送到服务器,服务器收到sql进行解析执行,完成数据插入,告知结果,操作成功与否,影响多少行。
库的相关操作
创建一个名为lit的数据库:(创建成功时会提示OK,1 row affected;失败时提示error)数据库的库名不能重复
--SQL里使用两个减号来备注,lit为数据库库名
create database lit;
--这样也可以创建,如果已有该名数据库,则发出警告,但不会报错,如果有改名数据库,则不创建。
create database if not exists lit;
--如果系统没有lit的数据库,则创建一个使用utf8mb4字符集库名为lit的数据库,如果有则不创建
create database if not exists lit character set utf8mb4;
调用此数据库;也就是使用此数据库:
--使用名为lit的数据库
use lit;
删除数据库:慎用
--删除名为qqq的数据库
drop database qqq;
--删除名为qqq的数据库,如果没有qqq的数据库则不删除
drop database if exists qqq;
查看当前所有数据库:
--查看当前所有数据库
show databases;
数据类型
数值类:
数值类型可以指定为无符号 unsigned,表示不取负数,1字节 bytes =8 bit 但是一般不会使用无符号。
常用数值类型为:BIT[(M)]、INT 、DECIMAL(M,D)
数据类型 | 大小 | 备注 |
---|---|---|
BIT[ (M) ] | M指定位数,默认为1 | 二进制数,M范围为1~64,存储值范围为0到2M-1 |
TINYINT | 1字节 | 对应java中的byte |
SMALLINT | 2字节 | 对应java中的short |
INT | 4字节 | 对应java中的integer |
BIGINT | 8字节 | 对应java中的long |
FLOAT(M, D) | 4字节 | 单精度,M指定长度,D指定小数位数,会发生精度丢失,对应java中的float |
DOUBLE(M,D) | 8字节 | 对应java中的double |
DECIMAL(M,D) | M/D最大值+2 | 双精度,M指定长度,D表示小数点位数。精确数值 |
NUMERIC(M,D) | M/D最大值+2 | 同上 |
字符串类型:
常用VARCHAR(255)、TEXT;
数据类型 | 大小 | 备注 |
---|---|---|
VARCHAR (SIZE) | 0-65,535字节 | 可变长度字符串 |
TEXT | 0-65,535字节 | 长文本数据 |
MEDIUMTEXT | 0-16 777 215字节 | 中等长度文本数据 |
BLOB | 0-65,535字节 | 二进制形式长文本数据 |
日期类型:
数据类型 | 大小 | 备注 | 表示 |
---|---|---|---|
DATETIME | 8字节 | 范围从1000~9999年,不会进行时区的检索及转换 | 年月日时分秒 |
TIMESTAMP | 4字节 | 范围从1970到2038年,自动检索当前时区并进行转换。 | 时间戳,是计算机里存储和表示时间的方式,计算与1970:1:1:00:00:00的时间差。 |
使用时间戳的原因:占用的空间小,方便计算。在记录日志的时候经常会用到时间戳。
日志:log println 通过日志来反应出程序的工作状态,如果日志比较多,就需要记录当前这个日志对应的时间,这样就可以通过这个时间很好的知道整个程序在各个时间段中的运行情况了。
表的相关操作
需要操作数据库中的数据表时,需要先使用该数据库:
-- 使用库名为lit的数据库
use lit;
查看当前库中所有的表:
show tables;
创建一个表:
如 创建一个员工表 表中有员工的id 名称 年龄 备注
--先写表中属性名,再写类型
--comment写在属性类型之后为备注 comment后加单引号表示备注的内容;
create table staff(
id int comment 'id',
name varchar(20),
age int,
comment varchar(20)
);
ps: 在数据库中,MySQL中的关键字是不能作为表名/列名的,如果非要做表明名列名,则用反引号(TAB上面这个键)引起来。
查看表的结构,表中现有的属性会以表的形式展现其中会有每个属性的类型、属性名等信息:
其中field为字段,也就是属性的属性名(如 student表中name就是student表中name属性的属性名)
Type为类型,也就是属性的属性类型(如 name就是字符串varchar类型)
Null为空,表示此属性是否可以为空(如 name不为空,但是类似备注之类的属性就可以为空)
Key为键,若为主键、外键,此列才会显示,否则不显示。
Default为默认值,表示在插入时,如果没有内容,则代表插入的为默认值。
Extra为扩充,
--查看 名为staff的表的结构
--desc: description
desc staff;
删除一个表:
--在当前数据库中删除表名为staff的表
drop table staff;
--如果当前数据库存在名为staff的表,则删除。
drop table if exists staff;
清空一个表:
--清空表中数据,不改变表结构,不会重置自增
delect from staff;
--清空表中数据,不改变表结构,重置自增
truncate staff;
补充
修改密码:
alter user 'root'@'localhost' identified by '新密码';
运行sql文件:(直接运行文件内所有的sql语句)
source 文件目录/文件名