mysql

发布时间 2024-01-05 22:54:57作者: 转角90

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: 切换数据库db1
  • select 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对比:

    1. 存储空间:char浪费空间(固定的字符存数据),varchar节省空间(存的时候需要制作报头,1bytes),
    2. 存取速度: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 # 主键表中的记录被删除,外键表中改行也相应删除

表与表之间两种建立关系的方式:

  1. 通过外键强制建立关联

  2. 通过sql语句逻辑上建立联系

    delete from t1 where id=1;
    delete from t2 where id=1;
    
创建外键会消耗一定的资源,并且增加表与表之间的耦合度在实际项目中,如果表很多,可以不建立外键而是采用逻辑上建立联系的方式去建立联系

7.2 表关系

一对多

举例:员工表和部门表,

  1. 先站在员工表思考一个员工能否对应多个部门(一条员工数据能否对应多条部门数据) ,答案是不能!! (不能直接得出结论 一定要两张表都考虑完全)
  2. 再站在部门表思考一个部门能否对应多个员工(一个部门数据能否对应多条员工数据),答案是能!!! 得出结论
  3. 员工表与部门表示单向的一对多所以表关系就是一对多
# 部门表
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  # 同步删除
)

外键的位置:建立在任何一方都可以,但是推荐建立在查询频率较高的表中