MySql的用法总结-1
本节内容:
一、基本操作
二 、数据库的操作
三、数据类型
四、约束
五、联合索引
六、表之间关系及存储引擎
一、基本操作
1、登录
localhost => 127.0.0.1 本地ip
mysql -uroot -p -h ip地址
-u :用户
-p :密码
-h :ip地址
-P :端口号,默认为3306
2、 退出
\q 或者 exit
3、 设置密码
# 查询当前登录用户 select user(); # 设置密码 set password = password("123"); # 去除密码 set password = password("");
4、添加账号
# 给具体某个ip下设置一个账号 , 用来连接数据库 create user "lianxi100"@"192.168.107.1" identified by "111" # 给具体192.168.107.% 这个网段下的所有ip设置一个账户 create user "lianxi101"@"192.168.107.%" identified by "222" # 给所有ip设置账户 create user "lianxi102"@"%" identified by "333"
5、授权完整语法
select user() # 先查询ip用户,然后写在授权for的后面 # 查看当前ip下的用户有什么权限 show grants for "lianxi102"@"%";
grant 权限 on 数据库.表名 to "用户名"@"ip地址" identified by "密码"
- select 查询权限
- insert 添加权限
- update 修改权限
- delete 删除权限
- all 所有
- * 所有数据库,数据表
- % 所有ip
# 授予查询,添加权限 grant select,insert on *.* to "lianxi102"@"%" identified by "444"; # 授予所有权限 grant all on *.* to "lianxi102"@"%" identified by "555"; # 移除删除权限(删除数据库/数据表) revoke drop on *.* from "lianxi102"@"%" # 刷新权限 , 立刻生效 flush privileges;
二、数据库的操作
1、操作数据库(操作文件夹)
(1)增加
# 创建数据库 create database db100 charset utf8;
(2) 查看
# 查看所有数据库 show databases; # 查看建库语句 show create database db100;
(3)改变
#改变字符编码 alter database db100 charset gbk
(4)删除
#删除数据库 drop database db100
2、 操作数据表(操作文件)
(1)、增加
# 选择数据库 use db100; # 创建表(字段1 类型1 , 字段2 类型2 , 字段3 类型3 .... ) create table t1(id int , name char );
(2)、查看
# 查看数据表 show tables; # 查看建表语句 show create table t1; # 查看表结构 desc t1;
字段 类型 是否为空 键 默认值 备注
+-------+---------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-------+---------+------+-----+---------+-------+
| id | int(11) | YES | | NULL | |
| name | char(1) | YES | | NULL | |
+-------+---------+------+-----+---------+-------+
(3)、更改
# modify 改变类型 alter table t1 modify name char(10); # change 改变类型 + 字段名 alter table t1 change name name999 char(20); # add 添加字段 alter table t1 add age int; # drop 删除字段 alter table t1 drop age ; # rename 更改表名 alter table t1 rename t3123;
(4)删除
drop table t1;
3、操作记录(数据)
(1)增加
# 一次插入一条数据 insert into t1(id , name ) values(1,"张三"); # 一簇插入多条数据 insert into t1(id , name) values(2,"李琦"),(3,"王雨涵"),(4,"石磊"),(5,"菲菲"); # 不指定字段,插入数据 insert into t1 values(6,"赵沈阳"); # 可以具体指定个别字段插入 insert into t1(name) values("王生福");
(2)查找
# 查询所有数据 select * from t1; # 查询单个字段数据 select name from t1; # 查询多个字段 select id,name from t1;
(3)更改
# update 表名 set 字段=值 where 字段=值 update t1 set name = "小黄人" where id = 1 # 如果不指定条件,默认更改所有数据 update t1 set name = "小黄人1111" ;
(4) 删除
# delete from 表名 where 条件 delete from t1 where id = 1 # 危险操作,慎用 delete from t1 # 重置表( 重置数据 + 重置id(自增id) ) truncate table t1
三、 数据类型
1、整型
- tinyint : 1个字节 有符号: [-128 ~ 127] 无符号 [0 ~ 255] unsigned 小整型值
- int: 4个字节 有符号: [-21亿 ~ 21个亿左右] 无符号 [0 ~ 42亿]unsigned 大整型值
create table t2(id int , sex tinyint ) ; insert into t2(id,sex) values(2100000000,127);
2、浮点型
float(255,30) 30代表小数保留30个,整数+小数位数总长= 255
默认进行四舍五入
- float(255,30) 单精度
- double(255,30) 双精度
- decimal(255,30) 金钱类型
# 情况一 create table t3(f1 float(5,3) , d2 double(5,3) , d3 decimal(5,3) ); insert into t3(f1,d2,d3) values(2.3888888888888888888 , 2.388888888888888888 , 2.388888888888888); insert into t3(f1,d2,d3) values(2345.38888888888888888 , 2345.3888888888888888888 , 2345.3888888888888888); insert into t3(f1,d2,d3) values(23.388888888888888888888 , 23.388888888888888888 , 23.388888888888888888);
# 情况二 """默认: float 保留5位 double 保留16位 decimal只保留整数""" create table t4(f1 float , d2 double , d3 decimal ); insert into t4(f1,d2,d3) values(2.38888888888888888 , 2.388888888888888888888888 , 2.3888888888888888888888888);
3、字符串
- char(11) 定长:固定开辟11个字符长度空间(邮政编码,身份证,手机号,银行卡) [开辟空间的速度上快于varchar,从数据结构的查询上来看,速度不快]
- varchar(11) 变长:动态最多开辟11个字符长度的空间( 评论,个性签名,广告 ) [开辟空间的速度上慢于char,从数据结构的查询上来看,速度ok]
- text 文本类型: (毕业论文,文章,长篇小说)
create table t6(c char(11) , v varchar(11) , t text); insert into t6 values("你好啊好啊","你好啊好啊","你好啊好啊"); insert into t6 values("你好啊好啊","你好啊好啊你好啊好啊你好啊好啊","你好啊好啊"); error insert into t6 values("你好啊好啊11","你好啊好啊你2","你好啊好啊33"); # concat 可以做字段的拼接 select concat(c , "||" , v , "||" , t) from t6;
4、数据库内置方法
# 显示当前用户 select user() ## 字符串拼接 select concat() # 显示当前数据库 select database() # 显示当前时间 select now()
5、枚举和集合
- enum 枚举 : 从列出来的数据当中选1个 (性别)
- set 集合 : 从列出来的数据当中选多个 (爱好)
1 create table t7( 2 id int , 3 name varchar(10), 4 sex enum("男性","女性","人妖","半兽人","狼人","小黄人") , 5 money float(5,3), 6 hobby set("大保健","吃药","吃大腰子","生命一号") 7 ); 8 9 # 正常写法 10 insert into t7(id,name,sex,money,hobby) values(1,"李琦","人妖" , 99.5555555 , "大保健,吃大腰子" ); 11 # 自动去重 12 insert into t7(id,name,sex,money,hobby) values(1,"李琦","人妖" , 99.5555555 , "大保健,吃大腰子,吃大腰子,吃大腰子,吃大腰子" ); 13 # 异常报错 14 insert into t7(id,name,sex,money,hobby) values(1,"李琦","人妖" , 99.5555555 , "大保健,黄赌毒" ); error
6、时间类型
- date YYYY-MM-DD 年月日 (出生日期,结婚日期,春运,项目启动时间)
- time HH:MM:SS 时分秒 (长跑记录,体育竞赛)
- year YYYY 年份 (化石,红酒年份)
- datetime YYYY-MM-DD HH:MM:SS 年月日 时分秒 (订单流水,日志时间)
create table t1(d date , t time , y year , dt datetime); insert into t1 values("2021-01-07" , "09:22:40" , "2021" , "2021-01-07 09:22:40"); insert into t1 values(now(),now(),now(),now());
- timestamp YYYYMMDDHHMMSS (时间戳) 自动更新时间 (系统自动写入,不需要手动更新) (用来记录修改的时间)
create table t2(dt datetime , ts timestamp); insert into t2 values(20210107092930 , 20210107092930); insert into t2 values(null , null); # 插入null时,自动更新时间 insert into t2 values(20400107092930 , 20400107092930); error 时间戳超过2038年错误
四 、约束
约束 : 对数据的一种限制,不满足约束条件的数据会报错
- unsigned : 无符号
- not null : 不为空
- default : 默认值
- unique : 唯一值 唯一索引
- primary key : 主键
- auto_increment : 自增加一
- zerofill : 0填充
- foreign key : 外键
(1)unsigned : 无符号
# 顺序 : 字段名 字段类型 字段约束 create table t3(id int unsigned); create table t3_333(id int); insert into t3 values(-100); error insert into t3_333 values(-100);
(2)not null : 不为空
create table t4(id int not null , name varchar(100)); insert into t4 values(1,"卓培峰"); insert into t4 values(null,"卓培峰"); error insert into t4(name) values("卓培峰"); error
(3)default : 默认值
create table t5(id int not null , name varchar(255) default "李炯辉"); insert into t5 values(1 , null); insert into t5(id) values(2);
(4)unique : 唯一值
默认创建一个唯一的[索引] 作用:加快查询速度,适当的加索引可以加快速度,加的太多适得其反
UNI : 当前这个字段唯一,不能有重复值 , 但是可以为null
create table t6(id int unique , name char(255) default "非非"); insert into t6(id) values(1); insert into t6(id) values(1); error insert into t6(id) values(null); success insert into t6(id) values(null); success
(5)primary key : 主键 [唯一 + 不能空]
PRI : 当前这个字段是主键,标记一条记录的唯一性
create table t7(id int primary key , name varchar(255) default "王永捐"); insert into t7(id) values(1); insert into t7(id) values(1); error insert into t7(id) values(null); error # 主键 <=> [unique + not null] create table t8(id int unique not null , name varchar(255) default "王永捐"); # 主键 + [unique + not null] 同时存在时,会把id2显示成主键 create table t9(id1 int unique not null , id2 int primary key); # 一个表里面只能有一个字段为单个主键 create table t10(id1 int primary key , id2 int primary key); error
(6)auto_increment : 自增加一 (特指: 配合主键,和唯一索引使用)
create table t11(id int primary key auto_increment , name varchar(255) default "王永捐"); insert into t11 values(1,"荷叶"); insert into t11 values(2,"孙杰龙"); insert into t11 values(null,"孟凡伟"); insert into t11(id) values(null); # 自动插入数据 insert into t11 values();
(7)zerofill : 0填充
create table t12(id int(8) zerofill ); insert into t12 values(123); insert into t12 values(1234567899);
# 括号中限制字符的长度 (补充)
char(255) max <= 255
varchar(21845) max < 21845 (内部会占用一定空间保留数据的长度)
(8)foreign key 外键
外键:把多张表通过一个关联字段联合在一起,这样的字段可以设置成外键(好处:可以联级更新,联级删除)
- 语法 : foreign key(字段1) references 表(字段)
- 条件 : 带有关联关系的字段,套上外键的约束;
- 要求 : 被关联的字段,必须具有唯一性
student1:
id name age classid
1 wangwen 18 1
2 heye 80 1
3 wangyongjuan 15 2
class1:
id classname
1 python33
2 python34
# 创建class1 create table class1(id int , classname varchar(255)); # 临时更改id 为unique alter table class1 add unique(id); # 插入数据 insert into class1 values(1,"python33"); insert into class1 values(2,"python34");
# 创建student1 create table student1( id int primary key auto_increment, name varchar(255) , age int , classid int , foreign key(classid) references class1(id) ) # 插入数据 insert into student1 values(null,"wangwen",18,1); insert into student1 values(null,"heye",80,1); insert into student1 values(null,"wangyongjuan",15,2);
delete from class1 where id = 1; 删不掉 (需要先删掉带有关联关系的数据) delete from student1 where id = 1; delete from student1 where id = 2;
联级更新和删除 (谨慎使用)
- 联级更新 : on update cascade
- 联级删除 : on delete cascade
1 # 创建 class2 2 create table class2(id int primary key , classname varchar(255)); 3 # 插入数据 4 insert into class2 values(1,"python33"); 5 insert into class2 values(2,"python34"); 6 7 8 # 创建 student2 9 create table student2( 10 id int primary key auto_increment, 11 name varchar(255) , 12 age int , 13 classid int , 14 foreign key(classid) references class2(id) on update cascade on delete cascade 15 ) 16 # 插入数据 17 insert into student2 values(null,"wangwen",18,1); 18 insert into student2 values(null,"heye",80,1); 19 insert into student2 values(null,"wangyongjuan",15,2); 20 21 # 可以直接联级删除 22 delete from class2 where id = 1; 23 # 可以连接更新 24 update class2 set id=900 where classname = "python34";
(9) 额外补充( 关于约束的添加和删除)
1 # 1 添加/删除 约束 not null 2 #alter table 表名 modify 字段名 类型 3 alter table t1 modify id int not null 4 alter table t1 modify id int 5 6 # 2 添加/删除 unique 唯一索引 7 # alter table 表名 add unique(id) 8 alter table t1 add unique(id) 9 alter table t1 drop index id 10 11 # 3 添加/删除 primary key 12 # alter table 表名 add primary key(id); 13 alter table t1 add primary key(id); 14 alter table t1 drop primary key; 15 16 # 4 添加/删除 foreign key 外键 (先通过desc 表 找到外键名字,然后再删) 17 alter table student1 drop foreign key student1_ibfk_1; #删除 18 alter table student1 add foreign key(classid) references class1(id) #添加
五、联合索引
联合多个字段创建索引:
- unique(字段1,字段2,字段3 .... )
- primary key(ip,port)
- index(ip,port)
- 主键索引: PRI => primary key
- 唯一索引: UNI => unique
- 普通索引: MUL => index
1.联合唯一索引
unique(字段1,字段2,字段3 .... ) 合在一起表达该数据的唯一性
# PRI create table t1_server(id int , server_name varchar(255) not null ,ip varchar(15) not null , port int not null , unique(ip,port) ) insert into t1_server values(1,"百度","192.168.107.128",3306); insert into t1_server values(1,"百度","192.168.107.128",80); insert into t1_server values(1,"百度","192.168.107.129",80); insert into t1_server values(1,"百度","192.168.107.129",80); error insert into t1_server values(2,"阿里云",null,null); # error
# MUL create table t2_server(id int , server_name varchar(255) not null ,ip varchar(15) , port int , unique(ip,port) ) insert into t2_server values(2,"阿里云","192.168.107.128",3306); insert into t2_server values(2,"阿里云","192.168.107.128",443); insert into t2_server values(2,"阿里云",null,null); # success # insert into t1_server values(1,"百度","192.168.107.128",80); # insert into t1_server values(1,"百度","192.168.107.129",80); # insert into t1_server values(1,"百度","192.168.107.129",80); error
2.联合唯一主键
primary key(ip,port) 把几个字段合在一起表达数据的唯一性
create table t3_server(id int , server_name varchar(255) not null ,ip varchar(15) , port int , primary key(ip,port) ) insert into t3_server values(3,"腾讯云","192.168.107.128",3306); insert into t3_server values(3,"腾讯云","192.168.107.128",20);
3.联合普通索引
index(ip,port) 把几个字段合在一起,加快查询速度
create table t4_server(id int , server_name varchar(255) not null ,ip varchar(15) , port int , index(ip,port) )
六、表之间关系及存储引擎
1、表之间关系
(1) 一对一 : 把表1 id name sex guanlian 表2 id height bloodtype
(2) 一对多(多对一) : 班级和学生之间, 班级是1,学生是多
(3) 多对多 : 学员可以学习很多学科, 一个学科也可以被很多学员学习 (多对多关系表一定要创建第三张关系表)
书和作者也是多对多,一本书可以被多个作者联名出版,一个作者可以出版多本书;
2、存储引擎 : 存储数据的方式
主数据库: 增删改
从数据库: 查询
# show engines 查看存储引擎
表级锁 : 只有一个线程做数据的更改,就会锁表
行级锁 : 只对当前这行修改的数据上锁,其他行数据仍可使用
事务处理 : 在执行sql语句时,必须全部成功,才最后commit提交数据,否则rollback回滚数据;
begin : 开启事务处理
commit : 提交数据
rollback : 回滚
常用存储引擎
- MyISAM : 表级锁 (mysql5.5之前 默认引擎)
- InnoDB : 行级锁 , 事务处理 , 外键 (mysql5.5之后 默认引擎)
- MEMORY : 把数据存储在内存中,应用在缓存;
- BLACKHOLE : anything you write to it disappears
BLACKHOLE作用: 不存储数据,主要用来同步主从数据库,转发binlog日志;
create table myisam1(id int ,name varchar(255) ) engine=MyISAM; #myisam1.frm 表结构 #myisam1.MYD 表数据 #myisam1.MYI 表索引 create table innodb1(id int ,name varchar(255) ) engine=InnoDB; #innodb1.frm 表结构 #innodb1.ibd 表数据 + 表索引 create table memory1(id int ,name varchar(255) ) engine=MEMORY; #memory1.frm 表结构 create table blockhole1(id int ,name varchar(255) ) engine=BLACKHOLE; #blockhole1.frm 表结构