#Linux数据库管理Day03:库管理,表管理,MySQL数据类型,字段基本约束

一、库管理

1.1 创建库

库命名规范
  • 库的作用:用于存放表
  1. 仅可使用数字、字母、下划线,不能纯数字
  2. 区分字母大小写
  3. 库名全局唯一
  4. 不可使用SQL关键字(如CREATE等,会造成混乱)、特殊字符

可以把数据库(database)类比成操作系统里的文件夹 / 目录:存放多张数据表;

数据表就相当于目录里的一个个文件,文件存文本,表存结构化数据

创建语法
sql 复制代码
-- 库名重复会直接报错
CREATE DATABASE 库名;

-- 库不存在才创建,存在则忽略,无报错
CREATE DATABASE IF NOT EXISTS 库名;

-- 输出建该数据库完整的 SQL 建库语句和该库默认使用的字符集、排序规则(校对集)
SHOW CREATE DATABASE 库名;
-- 只针对已经存在的数据库使用
实操示例
sql 复制代码
#建库
mysql> CREATE DATABASE gamedb;                

#忽略报错(如果该库不存在,则创建)
mysql> CREATE DATABASE IF NOT EXISTS gamedb;  

#库名严格区分大小写
mysql> CREATE DATABASE GAMEDB;                     

1.2 数据库相关操作命令

SQL命令 功能说明
SHOW DATABASES ; 查看当前服务器所有已有库
USE 库名; 切换当前操作的数据库
SELECT DATABASE(); 查看当前正在使用的库
SHOW TABLES; 查看当前库下所有数据表
DROP DATABASE 库名; 删除指定数据库,库内所有表同步删除
DROP DATABASE IF EXISTS 库名; 库存在才删除,不存在不报错

重要提醒:删除库操作为高危操作,请慎用。删除库会连带删除库内全部数据表!

删除库实操示例
sql 复制代码
 #删除库
mysql> DROP DATABASE gamedb;     
          
#删除库时,忽略报错
mysql> DROP DATABASE IF EXISTS gamedb;      

#删除库时,忽略报错
mysql> DROP DATABASE IF EXISTS GAMEDB;      

二、表管理

2.1 创建表格

  • 表:专门用于存储数据
    • 表组成:表结构(字段、类型)+ 表记录(真实数据)
    • 查看表结构语法:DESC 库名.表名;
建表标准语法
sql 复制代码
CREATE TABLE 库名.表名 (
    表头1     数据类型 [约束],
    表头2     数据类型 [约束],
    表头3     数据类型 [约束],
    表头n     数据类型 [约束]
);

约束可加可不加,需视情况而定

实操案例:创建studb库与stuinfo表

需求:表包含name、class、gender、age字段

sql 复制代码
mysql> CREATE DATABASE studb;                  #创建studb库
mysql> CREATE TABLE studb.stuinfo(             #创建表格
    -> name CHAR(10),
    -> class CHAR(15),
    -> gender CHAR(8),
    -> age INT);
mysql> SHOW TABLES FROM studb;                  #查看指定库下所有表
mysql> DESC studb.stuinfo;                      #查看表结构

2.2 修改表

通用语法:ALTER TABLE 库名.表名 操作命令;

支持操作:新增字段、修改字段类型、修改字段名、修改表名、删除字段

修改数据类型同时也可以修改约束条件

2.2.1 添加字段 ADD

语法:ALTER TABLE 库名.表名 ADD 字段名 类型 [FIRST | AFTER 已有字段];

  • 不加位置参数:默认追加到表末尾
  • FIRST:放到表最前方
  • AFTER 字段名:放在指定字段后方

实操示例

sql 复制代码
#在最后添加mail字段
mysql> ALTER TABLE studb.stuinfo ADD mail char(30);      
mysql> DESC studb.stuinfo;
#最前方添加id字段
mysql> ALTER TABLE studb.stuinfo ADD id int first;       
mysql> DESC studb.stuinfo;
#name字段后方添加school字段
mysql> ALTER TABLE studb.stuinfo ADD school char(20) after name;  
mysql> DESC studb.stuinfo;
2.2.2 修改字段数据类型 MODIFY

语法:ALTER TABLE 库名.表名 MODIFY 字段名 新数据类型 [约束];

注意:新数据类型不能和表中已存储数据冲突,否则报错。(如原表头下存储的char字符串类型,改成int整数类型会报错)

实操示例

sql 复制代码
mysql> DESC studb.stuinfo;
mysql> ALTER TABLE studb.stuinfo MODIFY school varchar(25);  #修改school字段数据类型
mysql> ALTER TABLE studb.stuinfo MODIFY mail  varchar(20);   #修改mail字段数据类型
mysql> DESC studb.stuinfo;
2.2.3 修改字段名 CHANGE

语法:ALTER TABLE 库名.表名 CHANGE 旧字段名 新字段名 新类型 [约束];

说明:修改字段名称时可同步修改字段类型,数据类型不能与现有数据冲突。

实操示例

sql 复制代码
mysql> ALTER TABLE studb.stuinfo CHANGE class 班级 CHAR(15);  #将class字段改为班级字段
mysql> DESC studb.stuinfo;
2.2.4 修改表名 RENAME

语法:ALTER TABLE 库名.旧表名 rename 库名.新表名;

实操示例

sql 复制代码
mysql> ALTER TABLE studb.stuinfo rename studb.stu;  #修改表名为studb.stu
mysql> DESC studb.stu;                              #查看表结构(使用新表名)
mysql> SHOW TABLES FROM studb;                      #查看表名,已修改
mysql> ALTER TABLE studb.stu rename studb.stuinfo;  #改回原表名
2.2.5 删除表字段 DROP

语法:ALTER TABLE 库名.表名 drop 字段1, drop 字段2, drop 字段n;

支持一次性删除多个字段。

实操示例

sql 复制代码
mysql> ALTER TABLE studb.stuinfo  drop school,  drop 班级,  drop mail;  #删除多个字段
mysql> DESC studb.stuinfo;                                              #查看表结构

2.3 表记录管理

2.3.1 插入记录 INSERT
方式1:不指定字段,全字段插入

要求:值的顺序、数量、数据类型必须和建表字段完全匹配

sql 复制代码
-- 插入单行
INSERT INTO 库名.表名  VALUES (值列表);
-- 插入多行
INSERT INTO 库名.表名  VALUES (值列表),(值列表), ...;

(INTO可以省略,但建议加上)

示例:

假设表头为:name,age,phone

INSERT INTO 库名.表名 VALUES ("zhangsan",12,999999);

表数据会变成:

name age phone

zhangsan 12 999999

方式2:指定字段插入

仅给指定字段赋值,未指定字段自动填充默认值/NULL

sql 复制代码
-- 插入单行
INSERT INTO 库名.表名(表头名列表)  VALUES (值列表);
-- 插入多行
INSERT INTO 库名.表名(表头名列表)   VALUES (值列表),(值列表) ,...;

假设表头为:name,age,phone

示例:INSERT INTO 库名.表名(name,phone) VALUES ("zhangsan",999999);

表数据会变成:

name age phone

zhangsan null/默认值 999999

实操示例
sql 复制代码
mysql> INSERT INTO studb.stuinfo VALUES
    -> (1,"jim","man",18),
    -> (2,"lucy","woman",30),
    -> (3,"bob","man",27);

mysql> INSERT INTO studb.stuinfo(name) VALUES("mike"),("tom");   #指定字段插入多行数据
mysql> SELECT * FROM studb.stuinfo;                              #查询全表数据

2.4 修改表记录 UPDATE

语法说明:强烈建议搭配WHERE 条件,否则会批量修改全表数据

注意,修改的值也需要和表头对应的数据类型等约束相匹配,否则会报错

sql 复制代码
-- 无WHERE:全表批量修改
UPDATE 库名.表名  SET 字段=值 , 字段=值;

-- 带WHERE:仅修改匹配条件的行
UPDATE 库名.表名  SET 字段=值 , 字段=值 WHERE 条件;

实操示例

sql 复制代码
mysql> UPDATE studb.stuinfo SET age = 19 WHERE name="tom";  #修改tom的age为19
mysql> SELECT * FROM studb.stuinfo;                         #查看数据,已更新

2.5 删除表记录 DELETE / TRUNCATE

两种方式仅删除数据,表结构保留,操作谨慎使用

语句 功能
DELETE FROM 库名.表名 WHERE 条件; 仅删除满足条件的行
DELETE FROM 库名.表名; 清空整张表 所有数据,保留表结构 (自增主键不清零)
TRUNCATE TABLE 库名.表名; 清空整张表,重置自增主键,效率高于DELETE
不重置自增主键 :删除数据后,新增记录的自增ID会从删除前的最后一个值继续递增。

实操示例

sql 复制代码
mysql> DELETE FROM studb.stuinfo WHERE name in ("mike","tom");   #删除满足条件的行

三、MySQL数据类型

3.1 概述

关系数据库使用二维表格存储数据,每个字段通过数据类型限制存储数据的类型、取值范围、占用存储空间。

MySQL 数据类型是定义数据表字段所能存储数据的种类、取值范围与占用存储空间的规范。

3.2 字符类型

3.2.1 定长 CHAR
  1. 格式:CHAR(字符个数)
  2. 最大限制:最多255个字符
  3. 存储规则:数据不足指定长度,右侧自动补空格;超出长度无法写入
  4. 支持中文,MySQL8默认字符集utf8mb4

特性:建议实际需要多少字符就分配多少长度。因为: 如 char(20)

限制最大20个字符,数据库就会拨给它20个字符的空间。如果实际存入字符只有10个字符,剩下的10个字符空间被空格补齐,也就是说会有10个字符的空间被浪费

建表示例

sql 复制代码
mysql> CREATE DATABASE db1;          #创建db1库
mysql> CREATE TABLE db1.t1(          #创建db1.t1表
    -> name CHAR(5),
    -> homedir CHAR(50)
    -> );
mysql> DESC db1.t1                   #查看表结构

插入测试

sql 复制代码
mysql> INSERT INTO db1.t1 VALUES("lisi","Beijing");                #正确
mysql> INSERT INTO db1.t1 VALUES("tom","Shanghai");                #正确
mysql> INSERT INTO db1.t1 VALUES("janner","Tianjin");              #报错,字符超出长度约束
mysql> INSERT INTO db1.t1 VALUES("张大山","内蒙古");        #插入中文正常

查看表字符集

sql 复制代码
mysql> SHOW CREATE table db1.t1;
3.2.2 变长 VARCHAR
  1. 格式:VARCHAR(字符个数)
  2. 存储规则:按数据实际长度分配空间(不会像char造成空间浪费),最大65532字符
  3. 超过限制无法写入
  4. 超大文本( 超过65532 字符时)使用TEXT/BLOB
  • VARCHAR底层会额外占用 1~2 字节用来记录当前字符串实际长度,损耗极小,可以忽略。所以:
    • 固定长度的短数据建议使用char
    • 长度不固定的数据建议使用VARCHAR

建表&插入示例

sql 复制代码
mysql> CREATE TABLE db1.t2(
    -> name CHAR(5),
    -> email VARCHAR(30)
    -> );
mysql> DESC db1.t2;  #查看表结构

mysql> INSERT INTO db1.t2 VALUES
    -> ("tom","tom@test.com"),
    -> ("jerry","jerry@test.com"),
    -> ("lucy","lucy@163.com");

3.2.3 整型

仅存储整数,支持unsigned无符号修饰,扩大正数取值范围

对于一些不能是负数的数据,可以使用无符号进行限制

实操案例:创建游戏信息表

需求:name(CHAR10)、level(TINYINT无符号)、money(INT)

sql 复制代码
mysql> CREATE TABLE db1.gameinfo(
    -> name CHAR(10),
    -> level TINYINT unsigned,
    -> money INT
    -> );

mysql> INSERT INTO db1.gameinfo VALUES("潘多拉","10",10000);
mysql> INSERT INTO db1.gameinfo VALUES("奥摩","9",12000);
mysql> INSERT INTO db1.gameinfo VALUES("塞斯","8",8000);
mysql> SELECT * FROM db1.gameinfo;

3.2.4 浮点型

存储带小数数字,区分单精度float、双精度double

  1. float:有效数字6~7位
  2. double:有效数字15~16位,精度更高
  3. 有效数字:从第一个非0数字开始计数

    在数据量小、无密集数值计算、对精度容忍度高的普通业务场景里,两者使用体验几乎没有差别,不用刻意纠结区分
定点写法 FLOAT(M,D) / DOUBLE(M,D)

M=总数字长度,D=小数位数

sql 复制代码
#创建表格
mysql> CREATE TABLE db1.t3(pay FLOAT,id DOUBLE);              
#限制长度。pay总长度:5位,小数位:2位;id总长度:4位,小数位:2位
mysql> CREATE TABLE db1.t4(pay FLOAT(5,2),id DOUBLE(4,2));   
#成功写入 
mysql> INSERT INTO db1.t4 VALUES (123.12,99.99);          
#写入失败,超出总长度范围    
mysql> INSERT INTO db1.t4 VALUES (12345.12,9999.99);    
#写入成功,自动补0小数      
mysql> INSERT INTO db1.t4 VALUES (999,99);                    

3.2.5 枚举与集合类型

ENUM 枚举类型(单个选择)

字段值只能从定义的列表中 选择单个值

sql 复制代码
mysql> CREATE TABLE db1.t5(
    -> name CHAR(10),
    -> gender ENUM("boy","girl")
    -> );

mysql> INSERT INTO db1.t5 VALUES
    -> ("dc","boy"),
    -> ("eve","girl"),
    -> ("jack","boy");

ENUM 枚举的所有选项值,必须是字符串格式,要用引号包裹

SET 集合类型(多项选择)

可在存储列表中选择多个值,逗号分隔填写

sql 复制代码
mysql> CREATE TABLE db1.t6(
    -> name CHAR(10),
    -> gender ENUM("boy","girl"),
    -> likes SET("唱","跳","rap","睡觉")
    -> );

mysql> INSERT INTO db1.t6 VALUES
    -> ("zhangsan","boy","eat,game,music"),
    -> ("janner","girl","唱,跳");
-- 多个选项写在一个引号内用逗号隔开

3.2.6 日期时间类型

特性区分:

  1. TIMESTAMP:不赋值时自动填充当前系统时间
  2. DATETIME:不赋值默认NULL(但是需要指定:DEFAULT CURRENT_TIMESTAMP)
  3. YEAR支持2位简写:01-69 = 2001-2069,70~99 = 1970-1999。推荐4位数标准写法赋值

建表与插入示例

sql 复制代码
mysql> CREATE TABLE db1.t7(
    -> 姓名 CHAR(10),
    -> 生日 DATE,
    -> 出生年份 YEAR,
    -> 家庭聚会 DATETIME,
    -> 聚会地点 VARCHAR(15),
    -> 上班时间 TIME
    -> );

mysql> INSERT INTO db1.t7 VALUES
    -> ("张三丰",19920625,1992,20261005183030,"北京饭店",090000),
    -> ("武松",19821016,1982,20260807190310,"景阳冈",083000);

mysql> SELECT * FROM db1.t7;

四、字段基本约束

4.1 约束作用

约束是字段的限制规则,控制字段允许存入的数据,保证数据完整性。

4.2 约束分类

  1. NOT NULL:非空约束,字段禁止存储NULL空值
  2. DEFAULT:默认值约束,无手动赋值时自动填入预设值
  3. UNIQUE:唯一约束,字段值不能重复,允许存NULL
  4. PRIMARY KEY:主键约束,等价 UNIQUE + NOT NULL,值唯一且不能为空
  5. FOREIGN KEY:外键约束,关联两张表,从表字段取值必须来自主表主键

4.3 查看约束

执行 DESC 库名.表名;

查看表结构,Key、Default、Extra列展示约束信息。

4.4 约束实操案例

sql 复制代码
mysql> CREATE TABLE  db1.学生表(
    姓名 CHAR(10)  NOT NULL ,
    年龄 TINYINT unsigned DEFAULT  21,   #无符号类型(代表不为负数),默认值21
    学号 INT  UNIQUE,
    班级 CHAR(7)  NOT NULL  DEFAULT  "cloud"
)DEFAULT  CHARSET=utf8;
验证1:NOT NULL 非空约束
sql 复制代码
mysql> INSERT INTO db1.学生表 VALUES (null,20,1,"cloud01");        #姓名字段为空,直接报错
验证2:DEFAULT 默认值
sql 复制代码
mysql> INSERT INTO db1.学生表 VALUES ("宋江",19,1,"cloud01");    #完整赋值
mysql> INSERT INTO db1.学生表(姓名,学号,班级) VALUES("卢俊义",2,"cloud01"); #仅指定部分字段
mysql> SELECT * FROM db1.学生表; #未赋值的年龄自动填充默认值21
验证3:UNIQUE 唯一约束
sql 复制代码
mysql> INSERT INTO db1.学生表 VALUES ("林冲",25,1,"cloud01");    #学号1已存在,重复报错
mysql> INSERT INTO db1.学生表 VALUES ("林冲",25,null,"cloud01");    #唯一约束允许存入NULL

五、整体知识点总结

  1. 库管理:创建库、查看库、切换库、删除库,库名命名规范
  2. 表管理
    • 建表语法规范
    • 修改表:新增字段、修改字段类型、修改字段名、修改表名、删除字段
    • 表记录:插入、更新、删除数据操作语法
  3. 数据类型
    • 字符:CHAR定长、VARCHAR变长
    • 整数:TINYINT/SMALLINT/MEDIUMINT/INT/BIGINT,unsigned无符号
    • 浮点:float、double精度与取值范围
    • 枚举集合:ENUM单选、SET多选
    • 日期时间:YEAR/DATE/TIME/DATETIME/TIMESTAMP特性与区别
  4. 字段约束:NOT NULL、DEFAULT、UNIQUE、PRIMARY KEY、FOREIGN KEY功能与实操验证