对于数据库的安装就不在这里介绍了,如果想看可以去看这位大佬的博客:
https://www.cnblogs.com/xuexianqi/p/12795890.html
在这边只说一说mysql的应用:
MYSQL的命令执行
注意:以下是在cmd中运行
mysql -h 127.0.0.1 -p 3306 -uroot -p(完整版链接数据库)
mysql -uroot -p(简略版链接数据库)
quit\exit(链接数据库后想退出可以输入)
\c(当你输入命令不对又不想返回错误信息)
mysqld --install(将mysql制作成系统服务)
mysqld --remove(将mysql从系统服务中移除)
mysqladmin -uroot -p原密码 password 新密码(更改密码)
taskkill /f /pid pid号 (强行删除进程 /f强制)
mysqld --skip-grant-tables (跳过用户名密码登录,必须是管理员模式)
注意:以下可以在cmd中的mysql下运行,也可以直接在mysql中运行
一定要加';'!!!!!!!!!!
关于库相关:
create database 库名;(增加库)
drop database 库名;(删除库)
use 库名;(选择库)
show databases;(查看数据库中所有的库)
show create database 库名;(查看库)
alter database 库名 操作;(修改库)
关于表相关:
select database();(查看当前库的名字)
以下会在你当前选择的库创建删除或修改添加
create table 表名;(名字 类型,名字 类型,……) 创建表
show tables;(查看当前库下所有的表名)
show create table 表名;(查看表)
alter table 表名 modify 名字 类型;(修改表中的类型)
drop table 表名;(删除表)
关于数据相关:
以下会在你当前选择的库创建删除或修改添加
insert into 表名 values();(插入值)(可以插入多个)
select xx from 表名;(查看表名中的表头里的所有信息)
select * from 表名;(查看表中所有信息)
update 表名 set 表头 = xx where 条件;(根据条件更新数据)
delete from 表名 where 条件;(根据条件删除数据)
delete from 表名;(删除表中的数据)
MYSQL的主要存储引擎
1. lnnodb
是MYSQL5.5版本之后的默认储存引擎
会在文件中产生两个文件分别是 .frm与 .ibd
前者是表结构,后者是表数据
相对于myisam来说,存储数据更加的安全
2. myisam
是MYSQL5.5版本之前的默认存储引擎
会在文件中产生3个文件分别是 .frm, .MYD与 .MYI
第一个是表结构,第二个是表数据,第三个是索引(相当于目录)
相对于lnnodb来说,搜索数据更加的快速
3. memory
将数据全放在内存中
会在文件中产生1个文件 .frm
作用是表结构,因为数据在内存中无需保存
4. blackhole
无论是否保存,都会立刻消失相当于一个黑洞
跟memory一样只有一个表结构
至于用法:
show engines; 查看所有表的存储引擎
create table xx engine=innodb(myisam,memory,blackhole)
创建表的注意事项
1. 同一张表中字段名不能重复
2. 设置的类型与存储的类型必须相同或符合其条件
3. 条件结尾不能有逗号
4. 在5.7版本以前默认不开启严格模式,而在5.7以后(包括5.7)默认开启严格模式。
如无开启严格模式,规定只能存一个字符,你给了多个字符,那么会自动帮你截取
如开启严格模式,那么规定存几个字符,就得存几个字符不然会报错
至于怎么取消严格模式,就是在条件后加入not null
例如:create table xx(id int,name char not null)
修改表与复制表
# MySQL对大小写是不敏感的
"""
1 修改表名
alter table 表名 rename 新表名;
2 增加字段
alter table 表名 add 字段名 字段类型(宽度) 约束条件;
alter table 表名 add 字段名 字段类型(宽度) 约束条件 first;
alter table 表名 add 字段名 字段类型(宽度) 约束条件 after 字段名;
3 删除字段
alter table 表名 drop 字段名;
4 修改字段
alter table 表名 modify 字段名 字段类型(宽度) 约束条件;
alter table 表名 change 旧字段名 新字段名 字段类型(宽度) 约束条件;
5 复制表
create table 表名 select * from 旧表; 不能复制主键 外键 ...
create table new_dep2 select * from dep where id>3;
"""
严格模式
# 如何查看严格模式
show variables like "%mode";
模糊匹配/查询
关键字 like
%:匹配任意多个字符
_:匹配任意单个字符
# 修改严格模式
set session 只在当前窗口有效
set global 全局有效
set global sql_mode = 'STRICT_TRANS_TABLES';
set global sql_mode='NO_ENGINE_SUBSTITUTION,STRICT_TRANS_TABLES'全局开启严格模式
修改完之后 重新进入服务端即可
基本数据类型
整形(TINYINT, SMALLINT, MEDUIMINT, INT, BIGINT)
默认情况下会携带符号
如超出限制只存最大可接受值
如需不想携带符号可以加入unsigned
例: create table xx(in tinyint unsigned);
至于在整形后加上宽度,则代表限制位数!
但是整形中有个怪胎(int)
int里的宽度不是限制位数,而是说宽度有多少,里面就有多少位
如位数不够则会自动添加‘空格’
当然不喜欢空格还可以自动添加'0'
create table xx(id int(8) unsigned zerofill)
注意:针对整型字段 括号内无需指定宽度 因为它默认的宽度以及足够显示所有的数据了
浮点型(FLOAT, DOUBLE, DECIMAL)
float类型表示单精度浮点数值,double类型表示双精度浮点数值,float和double都是浮点型,而decimal是定点型;
float和double在不指定精度时,默认会按照实际的精度来显示,而DECIMAL在不指定精度时,默认整数为10,小数为0。
float和double求SUM的结果都是不精确的,只有decimal求SUM得到的是精准数值:
所以,decimal 类型是适合财务和货币计算的128位数据类型。
字符类型(char, varchar)
char(4) 数据超过四个字符直接报错,不够4个字符空格补全
varchar(4) 数据超过4个字符直接报错,不够有几个存几个
统计字段长度 char_length
select char_length(name) from xx
char
缺点:浪费空间
优点:存取都很简单
直接按照固定的字符存取数据即可
存按照五个字符存 取也直接按照五个字符取
varchar
优点:节省空间
缺点:存取较为麻烦
存的时候需要制作报头
取的时候也需要先读取报头 之后才能读取真实数据
首先可以肯定的是 char硬盘上存的绝对是真正的数据 带有空格的
但是在显示的时候MySQL会自动将多余的空格剔除
再次修改sql_mode 让MySQL不要做自动剔除操作
set global sql_mode = 'STRICT_TRANS_TABLES,PAD_CHAR_TO_FULL_LENGTH';
时间类型(date,datetime,time,Year)
date : 年月日
datetime : 年月日时分秒
time : 时分秒
Year : 年
集合与枚举
这两个唯一不同的点是:枚举时只能选择一个存储,集合时可以选择多个存储
create table xx(
id int,
name char(16),
sex enum('boy' , 'girl'),
hobby set('read','play','sleep')
)
insert into xx values(1,'a','boy','read,sleep')
关于mysql的其他方法
default 默认值
create table xx(
id int,
hobby enum('read','play','sleep') default 'play'
);
insert into xx(id,hobby) values(1);
unique 值唯一
单列唯一
create table xx(
id int unique,
name char(16)
);
insert into xx values(1,'a'),(1,'b')#报错 ,因为id唯一
联合唯一
create table xx(
id int,
ip char(16),
port int,
unique(ip,port)
);
insert into t4 values(1,'127.0.0.1',8080); #正确
insert into t4 values(2,'127.0.0.1',8081); #正确
insert into t4 values(3,'127.0.0.2',8080); #正确
insert into t4 values(4,'127.0.0.1',8080); #报错!因为t4的ip与port与t1相同
primary key主键
除开约束效果,它还是innodb存储引擎组织数据的依据,innodb存储引擎在创建表的时候必须要有primary key,因为它类似于书的目录 能够帮助提示查询效率并且也是建表的依据
如果表中没有主键也没有其他任何的非空且唯一字段 那么Innodb会采用自己内部提供的一个隐藏字段作为主键,隐藏意味着你无法使用到它 就无法提示查询速度
约束效果与unique相同
单列唯一
create table t5(id int primary key);
联合唯一
create table t7(
ip char(16),
port int,
primary key(ip,port)
);
auto_increment 自增(一般来说无法停止并且写在主键上)
当编号过多时,人为的维护太麻烦了,因此
create table t8(
id int primary key auto_increment,
name char(16)
);
insert into t8(name) values('jason'),('egon'),('kevin');
注意!!!
delete from t1 删除表中数据后 主键的自增不会停止
truncate t1 清空表数据并且重置主键
表与表之间的关联
表与表之间的关联用外键来联系,也就是: foreign key
foreign key
1 一对多表关系 外键字段建在多的一方
2 在创建表的时候 一定要先建被关联表
3 在录入数据的时候 也必须先录入被关联表
在表与表之间最多只有四种关系
一对多关系
在判断一对多前需换位思考,分别站在两张表的角度考虑,
先创建被关联的一方,然后
create table dep(
id int primary key auto_increment,
dep_name char(16),
dep_desc char(32)
);
create table emp(
id int primary key auto_increment,
name char(16),
gender enum('male','female','others') default 'male',
dep_id int,
foreign key(dep_id) references dep(id)
on update cascade # 同步更新
on delete cascade # 同步删除
);
多对多关系
在写多对多关系的时候,不能用两张表去互相关联,因为这样会造成类似于‘死锁’现象,
因此写多对多的时候我们要去创建第三张表然后去调用他们
create table book(
id int primary key auto_increment,
title varchar(32),
price int
);
create table author(
id int primary key auto_increment,
name varchar(32),
age int
);
create table book2author(
id int primary key auto_increment,
author_id int,
book_id int,
foreign key(author_id) references author(id)
on update cascade # 同步更新
on delete cascade, # 同步删除
foreign key(book_id) references book(id)
on update cascade # 同步更新
on delete cascade # 同步删除
);
一对一关系
一对一 外键字段建在任意一方都可以 但是推荐建在查询频率比较高的表中
create table authordetail(
id int primary key auto_increment,
phone int,
addr varchar(64)
);
create table author(
id int primary key auto_increment,
name varchar(32),
age int,
authordetail_id int unique,
foreign key(authordetail_id) references authordetail(id)
on update cascade # 同步更新
on delete cascade # 同步删除
)
没有关系
就跟平常一样创建就好了