• MySQL数据库基础知识(二)


    1. 表(DDL语句:create alter drop)

    1.1 创建表

    1.建表的语法格式:

    create table 表名(字段名1 数据类型,字段名2 数据类型,...,字段名n 数据类型);
    表名:建议以t_或者tbl_开始,可读性强,见名知意
    字段名:见名知意即可
    表名和字段名都属于标识符。
    命名规范:所有的标识符全部都是小写,单词执念用下划线进行衔接
    建表时varcharchar类型必须有长度,不然会报错。
    
    例:
    CREATE TABLE T_STUDENT(
    	NO INT,
    	NAME VARCHAR(32),
    	SEX CHAR(1),
    	AGE INT,
    	EMAIL VARCHAR(32)
    );
    
    建表时如果需要指定某个字段的默认值:
    CREATE TABLE T_STUDENT(
    	NO INT,
    	NAME VARCHAR(32),
    	SEX CHAR(1) default ‘m’,
    	AGE INT,
    	EMAIL VARCHAR(32)
    );
    
    快速创建表:将一次查询结果当做一张表新建
    create table emp2 as select * from  emp;
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27

    2.MySql中的数据类型

    数据类型用法
    varchar(最长255)可变长度的字符串,比较智能,节省空间,可根据实际的数据长度动态分配空间,所以缺点是速度慢
    char(最长255)固定长度字符串,无论实际数据多长,都分配固定的长度空间,优点:速度快,缺:使用不当会造成空间浪费
    int(最长11位)整型,等同于Java中的int
    bigint长整型,等同于Java中的long
    float单精度浮点型数据
    double双精度浮点型数据
    date短日期类型
    datetime长日期类型
    clob(Character Large OBject)字符大对象,最多可以存4G的字符串,比如存一篇文章,一个说明等。超过255个字符的都要用CLOB字符大对象来存储
    blob(Binary Large OBject)二进制大对象,专门用来存储图片、声音、视频等流媒体数据,往BLOB类型的字段上插入数据时需要使用IO流才行

    1.2 删除表

    drop table tablename;-- 如果表不存在会报错
    drop table if exists tablename;
    
    • 1
    • 2

    1.3 给表中插入数据(DML)

    INSERT INTO 表名(字段名1,字段名2,字段名3...) VALUES(1,2,3...);
    注意: 1.字段名和值要一一对应,数量和数据类型都要对应
    	  2.INSERT语句只要执行成功了,表中必然会多一条记录。
    例:
    INSERT INTO T_STUDENT(NO,NAME,SEX,AGE,EMAIL) VALUES(1,'ZHANGSAN','男',20,'zhangsan.com');
    INSERT INTO T_STUDENT(EMAIL,AGE,SEX,NAME,NO) VALUES ('lisi.com', 20,'f', 'LISI', 2);
    INSERT INTO T_STUDENT(NO) VALUES (3);-- 没有给其他字段赋值是,默认值为NULL
    INSERT INTO T_STUDENT VALUES ('wangwu.com', 21,'f', 'WANGWU', 4); -- 字段名如果省略,默认为都有,此时值都要写上,并且与建表时的顺序要一一对应。
    SELECT * FROM T_STUDENT; 
    create table t_user(
    	id int,
    	name varchar(32),
    	birth date, -- date是短日期,只包括年月日,默认格式:%Y-%m-%d
    	create_time datetime -- datetime是长日期,包括年月日时分秒,默认格式:%Y-%m-%d %h:%i:%s
    );
    insert into t_user (id,name,birth,create_time) values (1,'zhangsan','1990-06-20','2022-06-20 22:33:59');
    insert into t_user (id,name,birth,create_time) values (1,'zhangsan','1991-06-20',now());
    -- now()函数可以获取系统当前时间,并且是datetime类型的
    insert into t_user (id,name,birth,create_time) values (1,'zhangsan','1991-06-20',now()), (2,'lisi','1992-06-20',now());
    -- insert一次插入多条数据: insert into TableName(字段名1,字段名2) values(),(),(),();
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21

    1.4 修改表中数据update(DML)

    语法格式:

    UPDATE 表名 set 字段名1=1,字段名2=2,字段名3=3...where 条件;
    注意:没有条件限制会导致所有数据全部更新,所以记得加where条件。
    例如:
    update t_user set id=1, name='jack' where name = 'zhangsan'; --将名字叫zhangsan的改为jack
    
    • 1
    • 2
    • 3
    • 4

    1.5 删除表中数据delete(DML)

    语法格式:

    delete from 表名 where 条件;
    注意:没有条件会删除整张表所有的数据。
    例如:
    delete from t_user where id =1;
    
    • 1
    • 2
    • 3
    • 4

    1.6 快速删除表中数据truncate(DDL)

    • delete语句删除数据原理: 表中的数据虽然被删除了,但是这个数据在硬盘上的真实存储空间不会被释放
      优: 支持回滚,后悔了可以恢复数据
      缺:删除效率较低
    • truncate语句删除数据原理:表被一次截断,物理删除。
      优:快速。
      缺点:不支持回滚,删除之后数据无法恢复。
      用法:truncate table 表名;

    1.7 对表结构进行修改alter(DDL)

    基本不用

    2. 约束(*重要)

    约束:constraint
    在创建表的时候,我们可以给表中的字段加上一些约束,来保证这个表中数据的完整性,有效性,约束就是为了保证表中的数据有效。

    2.1 约束分类

    • 非空约束:not null
    • 唯一性约束: unique
    • 主键约束:primary key(简称PK)
    • 外键约束:foreign key(简称FK)
    • 检查约束:check (mysql不支持,oracle支持)

    2.1.1 非空约束:NOT NULL

    非空约束not null约束的字段不能为NULL;

    create table t_vip(
    	id int,
    	name varchar(32) not null
    );
    insert into t_vip(id, name) values(1,'zhangsan');
    insert into t_vip(id) values(2); --会报错:Field 'name' doesn't have a default value
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    NOTE: xxxx.sql文件是sql脚本文件,其中写了大量的sql语句,在mysql中使用source …/xxx.sql(文件位置)来批量执行SQL语句,执行SQL脚本文件的时候,该文件中所有的sql语句会全部执行!

    2.1.2 唯一性约束:UNIQUE

    唯一性约束的字段不能重复,但是可以都为NULL,都为null不算重复

    create table t_vip(
    	id int(5),
    	name varchar(32) unique --约束直接添加到列后面的叫列级约束
    );
    insert into t_vip values (1, 'lisi');
    insert into t_vip values (2, 'zhangsan');
    insert into t_vip values (3, 'zhangsan');-- 报错:Duplicate entry 'zhangsan' for key 
    insert into t_vip(id) values (4);
    insert into t_vip(id) values (5);-- 不报错
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    2.1.2.1 两个字段联合起来具有唯一性
    create table t_vip(
    	name varchar(32),
    	email carchar(255)
    	unique(name,email) --约束没有直接添加在列后面的叫表级约束
    );
    insert into t_vip values ('zhangsan','zhangsan@qq.com');
    insert into t_vip values ('zhangsan','zhangsan@123.com');--不报错,name和email都一样时才会报错
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    2.1.2.2 NOT NULL和unique的联合使用

    在MySQL中,如果一个字段同时被NOT NULL和UNIQUE约束,该字段自动变成主键(oracle中不是!)

    create table t_vip(
    	id int(5),
    	name varchar(32) not null unique
    );
    insert into t_vip values (1, 'zhangsan');
    insert into t_vip values (2, 'zhangsan'); --报错,name不能重复
    insert into t_vip(id) values (3);  --报错,name不能为null
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    2.1.3 主键约束PRIMARY KEY

    主键约束相关术语:

    • 主键约束:就是一种约束
    • 主键字段:该字段上添加了主键约束,这样的字段叫主键字段
    • 主键值:主键字段中的每一个值
    • 主键的作用:
      主键是每一行记录的唯一标识,是每一行记录的身份证号
    • 主键的特征:
      not null+ unique(主键值不能为NULL,同时也不能重复)
    • 一张表主键约束只能添加一个
    • 主键值建议使用:int,bigint,char等类型,不建议使用varchar,主键一般都是数字,并且是定长的

    给一张表中添加主键:

    单一主键:
    create table t_vip(
    	id int(5),
    	name varchar(32) primary key -- 列级约束,单一主键
    );
    insert into t_vip values (1, 'zhangsan');
    insert into t_vip values (2, 'zhangsan'); --报错,name不能重复
    insert into t_vip(id) values (3);  --报错,name不能为null
    
    复合主键:在实际开发中不建议使用复合主键
    create table t_vip(
    	id int(5),
    	name varchar(32),
    	email varchar(255),
    	primary key(id,name) -- 表级约束,用来给多个字段联合起来添加约束,叫复合主键
    );
    insert into t_vip values (1,'zhangsan','zhangsan@qq.com');
    insert into t_vip values (1,'lisi','lisi@qq.com');--不报错,id和name都一样时才会报错
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18

    主键除了单一主键和复合主键的分类之外,还可以分为自然主键和业务主键
    自然主键:主键值是一个自然数,和业务没关系
    业务主键:主键值和业务紧密相关,例如拿银行卡号做主键值。
    在实际开发中,自然主键使用较多,因为主键只需要做到不重复就行,不需要有意义,主键一旦和业务挂钩,那么当业务发生变动的时候,可能会影响到主键值,所以不建议使用。

    在MySQL中,有一种机制,可以帮我们自动维护一个主键值:auto_increment,表示自增,从1开始,以1自增

    create table t_vip(
    	id int(5) primary key auto_increment,
    	name varchar(32)
    );
    insert into t_vip(name) values ('zhangsan');
    insert into t_vip(name) values ('zhangsan');
    insert into t_vip(name) values ('zhangsan');
    insert into t_vip(name) values ('zhangsan');
    insert into t_vip(name) values ('zhangsan');
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

    2.1.4 外键约束FOREIGN KEY

    外键约束相关术语:

    • 外键约束:就是一种约束
    • 外键字段:该字段上添加了外键约束,这样的字段叫外键字段
    • 外键值:外键字段中的每一个值
    • 外键的作用:保证外键字段的值是有效的
    • 子表中的外键引用的父表中的某个字段,该字段不一定是主键,但至少得具有唯一性
    • 外键值可以为NULL
    • 一旦有外键约束,外键值就不能随便写了,它来自于父表中的某个字段中的值

    设计数据库表,来描述班级和学生的信息
    方案1:学生信息和班级信息放在同一张表中

    NONAMECLASSNOCLASSNAME
    1zhangsan10实验第一中学高三一班
    2jack10实验第一中学高三一班
    3lisi10实验第一中学高三一班
    4lilei20实验第一中学高三二班
    5hanmeimei20实验第一中学高三二班
    6wangwu20实验第一中学高三二班

    以上方案的缺点:数据冗余,空间浪费
    方案2:学生信息和班级信息放在不同的表中
    班级表(父表):

    classnoclassname
    10实验第一中学高三一班
    20实验第一中学高三二班

    学生表(子表):

    NONAMECNO(外键)
    1zhangsan10
    2jack10
    3lisi10
    4lilei20
    5hanmeimei20
    6wangwu20

    当cno字段没有任何的约束时,可能会导致存入无效的数据,比如存入30,单30班级并不存在。为了避免这种事情发生,保证cno字段中的值都是有效值,就需要给cno字段添加外键约束。那么,cno字段就是外键字段,cno中的每一个值都是外键值。
    注意:

    • 删除表的顺序:先删子,再删父(父表的顺序要在子表中用)
    • 创建表的顺序:先创建父,再创建子
    • 删除数据的顺序:先删子,再删父
    • 插入数据的顺序:先插入父,在插入子

    sql语句:

    create table t_class(
    	classno int primary key,
    	classname varchar(32)
    );
    insert into t_class values (10,'实验第一中学高三一班'), (20,'实验第一中学高三二班');
    
    create table t_student(
    	no intint primary key auto_increment,
    	name varchar(32),
    	cno int,
    	foreign key(cno) references t_class(classno)
    );
    
    insert into t_student(name,cno) values ('zhangsan',10),('jack',10),('lisi',10),('lilei',20),('hanmeimei',20),('wangwu',20);
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14

    如果改成不存在的值,会报错:
    在这里插入图片描述

  • 相关阅读:
    Amazon Braket 与量子计算
    GraphQL 查询:一个全面指南
    Linux从入门到精通(十二)——shell编程
    final/override 控制
    《IIS系列》IIS日志文件管理
    【无标题】
    Spring Cloud(九):Spring Cloud Gateway 断言、过滤器、限流、源码分析
    GB28181学习(十五)——流传输方式
    Java之CloneNotSupportedException
    数据结构--单链表操作
  • 原文地址:https://blog.csdn.net/weixin_46138661/article/details/125322354