一、数据库基础
关系型数据库:mysql Oracle
非关系型数据库(NoSQL):MongoDB,Redis,Oracle NoSQ,Cassandra
NoSQL数据库
文档数据库——这些数据库通常将每个键与称为文档的复杂数据结构配对。文档可以包含键数组对、键值对甚至嵌套文档。示例:MongoDB、Apache CouchDB、ArangoDB、Couchbase、Cosmos DB、IBM Domino、MarkLogic、OrientDB。
键值存储——每个单独的项都存储为键值对。键值存储是所有NoSQL数据库中最简单的数据库。示例:Redis, Memcached, Apache Ignite, Riak。
宽列存储——这些类型的数据库针对大型数据集上的查询进行了优化,它们将数据列存储在一起,而不是行。示例:Cassandra,Hbase,Scylla。
图形存储——这些存储关于图形、网络的信息,例如社会关系、路线图、交通链接。示例:Neo4j,AllegroGraph。
二、初识mysql
2.1 进入mysql客户端
$mysql
mysql> select user(); #查看当前用户
mysql> exit # 也可以用\q quit退出
# 默认用户登陆之后并没有实际操作的权限
# 需要使用管理员root用户登陆
$ mysql -uroot -p # mysql5.6默认是没有密码的
#遇到password直接按回车键
# 远程登陆
$ mysql -uroot -p123 -h 192.168.10.3
2.2 当前库设置密码
mysqlmysql> set password = password('root'); # 给当前数据库设置密码
2.3 用户相关
1.创建用户
mysql> create user 'name'@'192.168.10.%' IDENTIFIED BY '123';# %指示网段
mysql> create user 'name'@'192.168.10.5' # 指示某机器可以连接
mysql> create user 'name'@'%' #指示所有机器都可以连接
mysql> show grants for 'name'@'192.168.10.5';查看某个用户的权限
2.给用户授权
mysql> grant all on *.* to 'name'@'%'; # 第一个星表示库名
mysql> grant 权限类型 on 库名.* to 'name'@'*'
mysql> flush privileges; # 刷新使授权立即生效
# 创建账号并授权
mysql> grant all on *.* to 'eva'@'%' identified by '123'
# 查看用户权限
show grants for 用户名
# 删除用户
drop user 用户名@'%'
# Navicat连接mysql8+时报2059错误使用
ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY 'password';
2.4操作数据库
1.操作库
# 查看所有的数据库
show databases;
# 创建一个数据库
create database
# 切换到这个库下
use 数据库的名字
# 查看这个库下有多少表
show tables;
# 删除数据库
drop database 库名;
三、操作表
3.1 创建表
create table 表名(
字段名1 类型 [(宽度) 约束条件],
字段名2 类型 [(宽度) 约束条件],
);
3.2 查看表结构
describe [tablename];这种方法和desc [table] 效果相同,可以查看当前的表结构。
desc [table] :查看多少个字段、类型、长度、,看不到编码、引擎,具体的约束信息只能看到一部分
show create table:字段、类型、长度、编码、引擎、约束,查看创建表的SQL语句,
除了可以看到表定义之外,还可以看到engine(存储引擎)和charset(字符集)等信息。
3.3 修改表结构
语法:
1. 修改表名
ALTER TABLE 表名
RENAME 新表名;
2. 增加字段
ALTER TABLE 表名
ADD 字段名 数据类型 [完整性约束条件…],
ADD 字段名 数据类型 [完整性约束条件…];
3. 删除字段
ALTER TABLE 表名
DROP 字段名;
4. 修改字段
ALTER TABLE 表名
MODIFY 字段名 数据类型 [完整性约束条件…];
ALTER TABLE 表名
CHANGE 旧字段名 新字段名 旧数据类型 [完整性约束条件…];
ALTER TABLE 表名
CHANGE 旧字段名 新字段名 新数据类型 [完整性约束条件…];
5.修改字段排列顺序/在增加的时候指定字段位置
ALTER TABLE 表名
ADD 字段名 数据类型 [完整性约束条件…] FIRST;
ALTER TABLE 表名
ADD 字段名 数据类型 [完整性约束条件…] AFTER 字段名;
ALTER TABLE 表名
CHANGE 字段名 旧字段名 新字段名 新数据类型 [完整性约束条件…] FIRST;
ALTER TABLE 表名
MODIFY 字段名 数据类型 [完整性约束条件…] AFTER 字段名;
3.4 删除表
drop table 表名
四、数据类型
4.1 数值类型
严格数值数据类型(INTEGER、SMALLINT、DECIMAL和NUMERIC),以及近似数值数据类型(FLOAT、REAL和DOUBLE PRECISION)。
int 不约束长度,最多表示10位
float(m, n) m:一共多少位 ,n:小数多少位
4.2 日期和时间类型
表示时间值的日期和时间类型为DATETIME、DATE、TIMESTAMP(时间戳)、TIME和YEAR。每个时间类型有一个有效值范围和一个"零"值,当指定不合法的MySQL不能表示的值时使用"零"值。
- date 20200710
- time 131959
- datetime 20200710131959
# 插入当前时间
insert into tablename values(now(),now(),now(),now(),now())
4.3 enum/set
enum/set(单选/对选行为)
create table t(
id int,
name char(20),
gender enum('male', 'female'),
);
五、完整性约束
约束数据使不符合规范的数据不能进入数据库,约束条件和数据宽度都是可选参数
# NOT NULL :非空约束,指定某列不能为空;
# UNIQUE : 唯一约束,指定某列或者几列组合不能重复
# PRIMARY KEY :主键,指定该列的值可以唯一地标识该列记录
# FOREIGN KEY :外键,指定该行记录从属于主表中的一条记录,主要用于参照完整性
create table student(
id int unsigned
);
5.1 NOT NULL
create table tablename(id int not null);
create table student(id int unsigned not null);
5.2 DEFAULT
如果一列中经常有重复的内容,需要频繁的插入,可以设置默认值解决。
创建列时可以指定默认值,当插入数据时如果未主动设置,则默认添加默认值。
create table t(id int not null default 6666)
5.3 唯一约束
唯一约束,指定某列或者几列组合不能重复
mysql可以写入多个Null,即使设置了unique
create table student(
id int,
name varchar(20) unique
# 或unique(name)
);
联合唯一
create table t(
id int,
ip char(15),
port char(5),
unique(ip, port)
);
# ip 和port 联合确定一条记录,单独的ip和port是可以重复的
5.4 PRIMARY KEY
主键保证了表中的每一条数据都是该字段的唯一值。唯一的标识表中一条记录。
主键可以包含一个字段或多个字段。当主键包含多个栏位时,称为组合键 (Composite Key),也可以叫联合主键。
主键可以在建置新表格时设定 (运用 CREATE TABLE 语句),或是以改变现有的表格架构方式设定 (运用 ALTER TABLE)。
主键必须唯一,主键值非空;可以是单一字段,也可以是多字段组合。
1、单字段主键
# 方法一:not null+unique
create table department1(
id int not null unique, #主键
name varchar(20) not null unique,
comment varchar(100)
);
#方法二:在某一个字段后用primary key
create table department2(
id int primary key, #主键
name varchar(20),
comment varchar(100)
);
#方法三:在所有字段后单独定义primary key
create table department3(
id int,
name varchar(20),
comment varchar(100),
primary key(id); #创建主键并为其命名pk_name
);
2、多字段主键
create table service(
ip varchar(15),
port char(5),
service_name varchar(10) not null,
primary key(ip,port)
);
5.5 自增
自增只对数字有效,自带非空约束,至少是unique的约束之后才能使用auto_increment。
crate table t(
id int unique auto_increment,
name char(20)
);
# 一般这么写
crate table t(
id int primary key auto_increment,
name char(20)
);
5.6 外键
create table stu(
class_id int,
foreign key (class_id) references class(cid) # class是表名
);
必须先往class表中写数据,因为stu关联到了class表