1. 简介
数据库就是一个可以操作文件并且基于网络通信的应用程序,
任何基于网络通信的底层都是socket
SQL语句:MySql不单单支持MySQL自己的客户端还支持其他编程语言来充当客户端,统一采用SQL语句进行通信
2. 数据库的分类
2.1 关系型数据库
特点:
- 数据之间彼此有关系或者约束
- 存储数据的表现形式通常是以表格形式呈现
- 例如:MySQL、Oracle、db2、access、sql server
2.2 非关系型数据库
特点:
- 存储数据通常以k、v键值对的形式
- 例如:redis、MongoDB、memcache
3. SQL语句的使用
3.1 SQL语句以;
分号结尾
3.2 基本命令
show databases
:查看所有库名\c
: 取消quit
:退出exit
:退出use db1
: 切换数据库db1select database()
: 查看当前所在库的名字set global xxx
: 设置全局属性,如set global sql_mode='STRICT_TRANS_TABLES,PAD_CHAR_TO_FULL_LENGTH'
3.3 游客模式
只输入mysql
3.4 库操作
-
增
create database db1; create database db1 charset='utf-8';
-
删
drop database db1;
-
改
alter database db1 charset='gbk';
-
查
show database; show create database db1;
3.5 表操作
在进行表(文件)操作时,需要指定所在的库(文件夹)
-
增
# 用绝对路径的形式操作不同的库 create table db1.t1(id int,name char(4)) # 完整写法 create table db1.t1(字段名1 类型(宽度),字段名2 类型(宽度), 约束条件1, 约束条件2)
- 在同一张表中字段名不能重复
- 宽度和约束条件是可选的
- 最后一行不能有逗号
-
删
# 删除表 drop table db1.t1 # 删除字段 alter table 表名 drop 字段名;
-
改
# 修改字段属性 alter table db1.t1 modify name char(16) comment 注释 # 修改字段名 alter table db1.t1 change 旧字段 新字段 char(8) comment 注释 # 重命名表名 alter table 旧表名 rename to 新表名 # 新注释 alter table comment 注释 # 默认在最后增加添加新的字段 alter table 表名 add 新增字段名 字段类型[约束条件] # 在最前增加添加新的字段 alter table 表名 add 新增字段名 字段类型[约束条件] first # 在其他字段后增加添加新的字段 alter table 表名 add 新增字段名 字段类型[约束条件] after 其他字段名
关键字:
- add
- modify
- change
- first
- after
- comment
- rename to
-
查
# 显示所有表 show tables; # 显示指定表 show create table db1.t1; # 格式化显示 desc db1.t1
3.6 数据操作
-
增
# 不指定字段,按字段顺序填充, insert into db1.t1 values(1,'aaa'),(2,'bbb'),(3,'ccc') # 指定字段(name,id) insert into db1.t1(name,id), values('aaa',1)
关键词:
insert to
-
删
# 删除表中数据,删除以后主键的自增不会停止 delete from db1.t1; # 限定条件 delete from db1.t1 where id=1; # 清空表数据并且重置主键 truncate db1.t1
关键词:
delete from
truncate
-
改
# 修改name值为hhh的所有项,新值设置为dba update db1.t1 set name='dba' where name='hhh'
-
查
# 查询所有字段 select * from db1.t1; # 查询name字段 select name from db1.t1; # 查询id>1的 id和name 字段 select id,name from db1.t1 where id>1
关键词:
select xxx from
4. 存储引擎
存储引擎就是不同的处理机制,针对不同的数据(txt,pdf,word....)应该有对应的不同的处理机制来存储
innodb
:5.7以后的默认引擎,存储数据更加安全,有事务,外键等myisam
:5.7以前的默认引擎,速度比innodb更快memory
: 内存引擎,数据存储在内存中,断电数据丢失blackhole
: 无论存什么都立即消失
# 查看引擎
show engines;
# 创建表时设置引擎
create table t1(id int) engine=innodb # xx.frm xx.ibd
create table t2(id int) engine=myisam # xx.frm xx.MYD xx.MYI
create table t3(id int) engine=memory # xx.frm
create table t4(id int) engine=blackhole # xx.frm
5. 数据的类型
-
整型
tinyint(m) 1个字节 范围(-128~127) smallint(m) 2个字节 范围 (-32768~32767) mediumint(m) 3个字节 范围(-8388608~8388607) int(m) 4个字节 范围(-2147483648~2147483647) bigint(m) 8个字节 范围(+-9.22*10的18次方) 默认情况下整型是带符号的,超出限制只存最大可接收的值(非严格模式,严格模式下报错)
取值范围如果加unsigned,则为无符号,最大值翻倍,如
tinyint unsigned
取值范围为(0~256)特例:只有整型括号里面的数字不是表示限制位数如:
- id int(8) 如果数字没有超出8位 那么默认用空格填充至8位
- 如果数字超出了8位 那么有几位就存几位(但是还是要遵守最大范围)
针对整型字段 括号内无需指定宽度 因为它默认的宽度int(11)足够显示所有的数据了
-
浮点型
float(m,d) 单精度 8位有效位(4字节) m表示总长度,d表示小数部分长度 double(m,d) 双精度 16位有效位(8字节)m表示总长度,d表示小数部分长度 decimal(m,d) 定点类型 m表示总长度,d表示小数部分长度 精度比较:float<double<decimal
decimal适用于科学计算,金融方面,它是最精确的值
-
日期类型
date 日期格式 2000-12-1 time 时间格式 12:24:23 datetime 2008-12-2 22:06:44 timestamp 自动存储记录修改时间 Year 年2008 -
字符串
char(m) 固定长度,最多255个字符,位数不够是空格(默认)补位 varchar(m) 固定长度,最多65535个字符,位数不够有几个存几个 char与varchar对比:
- 存储空间:char浪费空间(固定的字符存数据),varchar节省空间(存的时候需要制作报头,1bytes),
- 存取速度:char存取简单,varchar存取复杂(取的时候先读取报头,),
-
枚举
enum(选择1,选择2,...) 多选一 -
集合
set(选择1,选择2,...) 多选多
6. 约束条件
宽度是用来限制数据的存储,约束条件是在宽度的基础上额外的约束
- not null: 不能为空
- zerofill: 位数不够补0
- unsigned: 无符号操作
- default: 默认值
- unique: 唯一
- 联合唯一: 在最后写unique(id,port)
- 单列唯一: 在字段类型后写unique
- primary key: 主键(非空且唯一)
- 单一主键: 如 id int primary key
- 联合主键: primary key(id,port)
- auto_increment: 自增 通常加在主键上,不能给普通字段加
7. 表与表之间
7.1 外键:
外键是建立表与表之间关系的纽带,写法:foreignkey(当前表中的键名) references 主表表名(主表表中的键名)
如:foreign key(t2_id) reference t2(id)
表示将t2_id字段设置为外键,关联t2表中的id字段
外键创建的时机:
-
创建表时创建
create table t2(id int primery key,addr varchar(50),t1_id int,foreign key(t1_id) references t2(id))
-
修改表时添加
# 外键忘记关联:先删除后添加 show create table 表名 # 查找外键名称 # CONSTRAINT `emp_ibfk_1` FOREIGN KEY (`dep_id`) REFERENCES `dep` (`id`) alter table t2 drop foreign key 外键名 # 添加外键 alter table t2 add foreign key(t1_id) references t1(id)
级联操作:
alter table t2 add foreign key(t1_id) references t1(id)
on update cascade # 如果主键表中被参考字段更新,外键表中也更新
on delete cascade # 主键表中的记录被删除,外键表中改行也相应删除
表与表之间两种建立关系的方式:
-
通过外键强制建立关联
-
通过sql语句逻辑上建立联系
delete from t1 where id=1; delete from t2 where id=1;
创建外键会消耗一定的资源,并且增加表与表之间的耦合度在实际项目中,如果表很多,可以不建立外键而是采用逻辑上建立联系的方式去建立联系
7.2 表关系
一对多
举例:员工表和部门表,
- 先站在员工表思考一个员工能否对应多个部门(一条员工数据能否对应多条部门数据) ,答案是不能!! (不能直接得出结论 一定要两张表都考虑完全)
- 再站在部门表思考一个部门能否对应多个员工(一个部门数据能否对应多条员工数据),答案是能!!! 得出结论
- 员工表与部门表示单向的一对多所以表关系就是一对多
# 部门表
create table dep(
id int premary key auto_increment,
dep_name char(16),
dep_desc char(32)
);
# 员工表
create table dep(
id int primery 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 # 同步删除
)
总结:
- 一对多关系,外键字段建在多的一方,如上:一个部门(部门表)对应多个员工(员工表),外键建在员工表中
- 在创建表的时候,一定要先建立被关联的表,如上:先建立部门表,部门表是被员工表关联的关联表
- 在录入数据的时候,也必须先录入别关联表, 如上:先录入部门数据
- 真正做到数据之间有关系,级联更新与删除:
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 # 同步删除
);
一对一
如果一个表的字段特别多,每次查询又不是所有字段都用到,可以分表
举例:用户表和用户详情表
用户表中的字段: id,name,age
用户详情表的字段:id, addr ,phone ,hobby, email........
一个用户只能对应一个用户详情,这就是一对一关系
# 详情表
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 # 同步删除
)
外键的位置:建立在任何一方都可以,但是推荐建立在查询频率较高的表中
标签:int,t1,key,mysql,db1,table,id From: https://www.cnblogs.com/hyf120/p/17948265