MySQL数据表的管理与操纵-> 万字详解+示例代码

1.MYSQL数据类型

数字类型

数字类型包括整数类型数值类型
整数类型从小到大:TINYINT SMALLINT MEDIUMINT INT BIGINT
数值类型包括:精确数值型DECIMAL;近似数值型FLOAT DOUBLE REAL
在实际应用中,用户可以根据实际的需求来选择合适的整数类型,当出现位数太多而且是小数时,我们可以采用数值的近似类型。

类型大小范围(有符号)范围(无符号)用途
TINYINT1 Bytes(-128,127)(0,255)小整数值
SMALLINT2 Bytes(-32 768,32 767)(0,65 535)大整数值
MEDIUMINT3 Bytes(-8 388 608,8 388 607)(0,16 777 215)大整数值
INT或INTEGER4 Bytes(-2 147 483 648,2 147 483 647)(0,4 294 967 295)大整数值
BIGINT8 Bytes(-9,223,372,036,854,775,808,9 223 372 036 854 775 807)(0,18 446 744 073 709 551 615)极大整数值
FLOAT4 Bytes(-3.402 823 466 E+38,-1.175 494 351 E-38),0,(1.175 494 351 E-38,3.402 823 466 351 E+38)0,(1.175 494 351 E-38,3.402 823 466 E+38)单精度 浮点数值
DOUBLE8 Bytes(-1.797 693 134 862 315 7 E+308,-2.225 073 858 507 201 4 E-308),0,(2.225 073 858 507 201 4 E-308,1.797 693 134 862 315 7 E+308)0,(2.225 073 858 507 201 4 E-308,1.797 693 134 862 315 7 E+308)双精度 浮点数值
DECIMAL对DECIMAL(M,D) ,如果M>D,为M+2否则为D+2依赖于M和D的值依赖于M和D的值小数值

字符串类型

字符串类型用于存储字符串数据,包括 CHAR VARCHAR TEXT
TEXT用于存储二进制字符串:TINYTEXT TEXT MEDIUMTEXT LONGTEXT

  • CHAR和VARCHAR:CHAR是固定长度字符串,如果字符串短于你指定的长度,则会自动填充到指定的长度;VARCHAR时可变长度字符串,指定一个最大长度,VARCHAR可以根据你的输入自动变化长度。
  • VARCHAR和TEXT是可变长类型,其存储需求取决于字符串的实际长度。
类型大小用途
CHAR0-255 bytes定长字符串
VARCHAR0-65535 bytes变长字符串
TINYBLOB0-255 bytes不超过 255 个字符的二进制字符串
TINYTEXT0-255 bytes短文本字符串
BLOB0-65 535 bytes二进制形式的长文本数据
TEXT0-65 535 bytes长文本数据
MEDIUMBLOB0-16 777 215 bytes二进制形式的中等长度文本数据
MEDIUMTEXT0-16 777 215 bytes中等长度文本数据
LONGBLOB0-4 294 967 295 bytes二进制形式的极大文本数据
LONGTEXT0-4 294 967 295 bytes极大文本数据

时间日期类型

表示时间和日期的数据类型包括:TIME DATE YEAR DATETIME TIMESTAMP

  • YYYY表示年,MM表示月,DD表示天,HH表示时,MM表示分钟,SS表示秒
  • TIMESTAMP:时间戳,表示现在距离1970年1月1日0:0:0有多少秒,受时区的差异。
类型大小 ( bytes)范围格式用途
DATE31000-01-01/9999-12-31YYYY-MM-DD日期值
TIME3‘-838:59:59’/‘838:59:59’HH:MM:SS时间值或持续时间
YEAR11901/2155YYYY年份值
DATETIME8‘1000-01-01 00:00:00’ 到 ‘9999-12-31 23:59:59’YYYY-MM-DD hh:mm:ss混合日期和时间值
TIMESTAMP4‘1970-01-01 00:00:01’ UTC 到 ‘2038-01-19 03:14:07’ UTC结束时间是第 2147483647 秒,北京时间 2038-1-19 11:14:07,格林尼治时间 2038年1月19日 凌晨 03:14:07YYYY-MM-DD hh:mm:ss混合日期和时间值,时间戳

二进制类型

由0和1组成的字符串的字段成为二进制类型。
二进制类型有:BIT BINARY VARBINARY TINYBLOB BLOB MUDIUMBLOB LONGBLOB

  • BLOB:常用来存放图片视频等二进制图像,存储可变的数据
  • BIT:是位字段类型
类型名称说明存储需求
BIT(M)位字段类型大约 (M+7)/8 字节
BINARY(M)固定长度二进制字符串M 字节
VARBINARY (M)可变长度二进制字符串M+1 字节
TINYBLOB (M)非常小的BLOBL+1 字节,在此,L<2^8
BLOB (M)小 BLOBL+2 字节,在此,L<2^16
MEDIUMBLOB (M)中等大小的BLOBL+3 字节,在此,L<2^24
LONGBLOB (M)非常大的BLOBL+4 字节,在此,L<2^32

其他类型

ENUM 类型

允许在给定的集合中选择一个值:性别选择一个男或者女。

ENUM('男','女')

SET类型

可以从给定集合中选择多个值

  • 不可能包含两个相同的元素
  • 在set中插入一个非给定集合中的值,MYSQL会插入一个空字符串

2.数据表的管理

创建数据表

常见术语

  • Table Name: 要创建的表名
  • Charset/Collation:字符集/校对规则
  • Engine:存储引擎
  • Cormment:为表名取的注释
  • Column Name:表中某个字段的名字,不允许重复
  • Data Type:数据类型
  • Primary Key:字段是否是主码
  • Not Null:字段是否为空
  • Unique:字段是否唯一
  • Binart:二进制
  • Unsigned:无符号数
  • Zero Fill:填充0
  • Auto Increment:插入行时,字段值自增,只有整数类型可以
  • Generated:基于其他字段商生成值的字段
  • Default:默认值

使用SQL语句创建数据表

使用CREATE TABLE创建数据表

CREATE [TEMPORARY] TABLE [IF NOT EXIST] <表名>
[([<字段定义>]),...,] [<索引定义>])]
[table_option] [select_statement];
  • temporary:表示是一个临时表

  • IF NOT EXIST:判断存不存在同名表

  • <表名>:要创建的表名。

  • <字段定义>

    • <字段名> <数据类型> [DEFAULT] [AUTO_INCREMENT] [COMMENT ‘String’] [列约束]
    • DEFAULT:字段具有默认值
    • AUTO_INCREMENT:设置自增属性,只能用于整数
    • COMMENT ‘String’ :注释名:String
  • <索引定义>:为表中相关字段指定索引

  • table_option:表示选项,存储引擎,字符集

  • select_statement:定义表的查询语句

示例:在Student数据库中创建学生表S:

//首先创建数据库
CREATE DATABASE Student
DEFAULT CHARACTER SET utf8mb4
DEFAULT COLLATE utf8mb4_0900_ai_ci;

//使用此数据库
use Student;

//创建S的表头
CREATE TABLE s
(
	sno CHAR(15)  NOT NULL COMMENT '学号',
	sn VARCHAR(20) NOT NULL COMMENT '姓名',
	sex ENUM('男','女') NOT NULL COMMENT '性别',
	age INT NOT NULL COMMENT '年龄',
	maj VARCHAR(20) NOT NULL COMMENT '专业',
	dept VARCHAR(20) NOT NULL COMMENT '院系',
	PRIMARY KEY (sno)	//sno可以唯一确定一个学生,设置为此表的主码
)ENGINE=INNODB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci;

在这里插入图片描述

在这里插入图片描述
简单的图例:

  • 我们自主选择每个字段的存储类型,对于不可变的,我们要使用定长CHAR,指定CHAR一个长度,不够则填充;对于不确定长度的,我们要使用VARCHAR来动态存储字符,给定一个最大的字符长度。
  • NOT NULL:表示了我们不能让此字段所处的列为空,即,我们在填入数据时必须填写此字段,不能为空!
  • COMMENT:表示了为此字段取一个备注:如学号,姓名。请注意,字段名要尽量以英文形式写,因为方便以后的操作。
  • PRIMARY KEY:指定此字段为主码
  • ENGINE:设置存储引擎;DEFAUTL CHARASET:设置默认字符集;COLLATE:设置字符校对规则

什么是主码?

  • 在一个表中,可以唯一确定某一行的一个字段。
  • 例如:在学生表中,我们用sno来确定唯一一个学生,因为每个学生的学号是唯一的,根据这个唯一的字段,我们就可以确定这个学生,身份证也可作为主码,因为身份证也是唯一的,可以确定某一个学生。
  • 简单来说:可以唯一确定某一行的字段,一个表中一定要有一个主码。

什么是外码?

  • 如果一个字段不是这个表的主码,但是这个字段却是其他表的主码。
  • 例如:“院系“不是学生表的主码,因为它不能唯一确定一个学生的信息,但是如果存在另外一个表,叫做院系表,一个院系对应一些信息,院系是主码,则院系同时存在于两个表中,院系是学生表的外码。
  • 简单来说:此字段不是此表主码,但却是另一个表的主码,这个字段称为外码

定义表约束

约束包括:

  1. NULL/NOT NULL(非空约束)
  2. UNIQUE约束(唯一约束)
  3. PRIMARY KEY约束(主码约束)
  4. FOREIGNKEY约束(外码约束)
  5. CHECK约束(检查约束)

NULL/NOT NULL(非空约束)

  • NULL:允许为空,表示不知道,没有数据,不确定
  • NOT NULL:不允许为空,一定要有数据,不能出现空值

我们刚才创建的表S就是NOT NULL约束的,即所有的字段都不能为空

UNIQUE约束(唯一约束)

表示字段中的值不能重复出现,用于保证数据表在某一字段或者段的组合上的取值必须是唯一的。
定义了UNIQEU的字段称为唯一码,唯一码允许为空,即Null,但是为了保证唯一性,只能有一个Null值出现。

使用方法:

<字段名> <数据类型> UNIQUE

示例1:创建表S,姓名sn设置为UNIQUE约束

	//选取关键部分
	sn VARCHAR(20) UNIQUE COMMENT '姓名',

只需要在数据类型后面加上约束条件UNIQUE即可。
示例2:创建表S,设置sn+sex为唯一码,UNIQUE约束

CREATE TABLE s
(
	sno CHAR(15)  NOT NULL COMMENT '学号',
	sn VARCHAR(20) NOT NULL COMMENT '姓名',
	sex ENUM('男','女') NOT NULL COMMENT '性别',
	age INT NOT NULL COMMENT '年龄',
	maj VARCHAR(20) NOT NULL COMMENT '专业',
	dept VARCHAR(20) NOT NULL COMMENT '院系',
	//设置他们两个为唯一码
	UNIQUE ('sn','sex')
	
)ENGINE=INNODB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci;

PRIMARY KEY约束(主码约束)

用于定义表的主码,起到唯一标识的作用,保证数据的唯一性,此字段中不能出现Null,不能重复,以此来保证数据的实体完整性。
一个表只能由一个主码,但是主码可以是多个段的组合
刚才我们定义的表S,使用的就是PRIMARY KEY设置了sno为表的主码

使用方法:

<字段名> <数据类型> PRIMARY KEY

示例1:设置sno为此表主码

	sno CHAR(15)  NOT NULL PRIMARY KEY COMMENT '学号',

在数据类型后面加上PRIMARY KEY即可。

示例2:创建一个选课表sc_primar,设置sno+cno两个,为表的主码:

CREATE TABLE sc_primary(
	sno CHAR(10) NOT NULL COMMENT '学号',
	cno CHAR(10) NOT NULL COMMENT '课程号',
	score DECIMAL(5,2) COMMENT '成绩',
	PRIMARY KEY (sno,cno)
)ENGINE=INNODB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci;

PRIMARY KEY约束与UNIQUE约束的区别:

  • 一个表中只能定义一个PRIMARY KEY约束,但是可以定义多个UNIQUE约束
  • PRIMARY KEY约束的一个或者多个字段,一定不为Null,一定不重复;但是UNIQUE约束允许最多有一个为Null
  • 不能同时为一个或者多个字段设置PRIMARY KEY约束和UNIQUE约束。

FOREIGN KEY约束(外码约束)

用于在两个表之间建立联系:在表A中的一个外码,一定是另一个表(设为B)的主码,因此他们肯定具有相同的连接字段,即A的外码(B的主码)。
通过 FOREIGN KEY约束来保证两表的参照完整性

使用方法:

 FOREIGN KEY (<从表A字段名> [从表A的另一个字段名]) 
 REFERENCES <主表B表名> (<主表B字段名> [<主表B的另一个字段名>])
 [其他条件] 

ps:主码B指定的字段名一定是表的主码或者候选码

注意:[其他条件]

  1. RESTRICT:拒绝对表B的删除或者更新操作
  2. CASCADE:从主表B删除或者更新,会自动更新和删除表A对应的外码字段
  3. SET NULL:主表B进行删除时,从表A对应的外码设置为NULL
  4. NO ACTION:同RESTRICT,拒绝对B执行删除或者更新

示例:建立选课表sc_foreign,设置学号sno和课程号cno为表的外码:

CREATE TABLE sc_foreign(
	sno CHAR(10) NOT NULL COMMENT '学号',
	cno CHAR(10) NOT NULL COMMENT '课程号',
	score DECIMAL(5,2) COMMENT '成绩',
	FOREIGN KEY(cno) REFERENCES sc_primary (cno),
	FOREIGN KEY(sno) REFERENCES s (sno)
)ENGINE=INNODB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci;

CHECK约束(检查约束)

CHECK用于检查数据表中所允许的范围,例如:月份只能输入整数,而且是限定1-12输入。在更新表中的数据时,系统会检查,更新后的数据是否满足CHECK约束的限定条件。
使用方法:

CHECK(<条件>)

注意:

  1. 条件:用于指定需要检查的限定条件
  2. MySql可以使用简单的表达式来实现CHECK约束,也可以使用复杂的表达式作为限定条件,例如加入子查询
  3. 将CHECK约束字句置于所有字段的定义以及主码约束和外码定义之后,则这种约束也成为CHECK的表约束,可以同时对表中的多个字段设置限定条件。

示例:建立选课表sc_check,定义成绩score的取值范围:0-100


CREATE TABLE sc_check(
	sno CHAR(10) NOT NULL COMMENT '学号',
	cno CHAR(10) NOT NULL COMMENT '课程号',
	score DECIMAL(5,2) CHECK(score>=0 AND score<=100) COMMENT '成绩',
	PRIMARY KEY (sno,cno)
)ENGINE=INNODB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci;

在这里插入图片描述
在这里插入图片描述

修改数据表

ADD

**用于增加新字段和完整性约束**

使用方法:

ALTER TABLE <表名>
ADD [<新字段名><数据类型>] [<完整性约束>] [FIRST | ALTER已有字段名]
  • FIRST:表示新添加的字段为第一个字段
  • ALTER已有字段:表示将新添加的字段放到”此字段“之后。

示例:在学生表s中添加一个字段class_no字段:

ALTER TABLE s
ADD class_no VARCHAR(10);

在这里插入图片描述
可知:在默认情况下, 最后的参数位置默认表示添加到最后一个字段之后。

示例2:在学生表s中,在age字段之后添加一个家庭住址address字段:

ALTER TABLE s
ADD address VARCHAR(45) AFTER age;

示例3:在表中添加多个字段:

ALTER TABLE s
ADD (class_NO1 VARCHAR(10),addRess1 NVARCHAR(20));

同时添加了class_NO1和addRess1字段,在表的末尾

示例4:添加age的新的完整性约束 0 - 100:

ALTER TABLE s
ADD CONSTRAINT s_chk CHECK(age BETWEEN 0 AND 50);

此后,age便只能输入0-50。另外,CONSTRAINT s_chk可以省略,则系统自动为CHECK约束提供一个约束名。

CHANGE

**用于修改字段名**

使用方法:

ALTER TABLE 字段名
CHANGE <旧字段名> <新字段名> <新数据类型>

示例:把学生表s的sn改为name:

ALTER TABLE s
CHANGE sn name VARCHAR(20);

在这里插入图片描述
注意:即使不需要数据类型,也要写上数据类型,即使和以前一样,不能省略。

RENAME

**用于修改表名**

使用方法:

ALTER TABLE 旧表名
RENAME [TO] 新表名

示例:把学生表s表名改为student:

ALTER TABLE s
RENAME TO student;

在这里插入图片描述
注意:修改表名不修改数据的结构。

MODIFY

**用于修改字段数据类型和字段排序**

使用方法:

ALTER TABLE 表名
MODIFY <字段名1> <数据类型> [FIRST |AFTER字段名2]
  • 修改数据类型:<数据类型>表示修改后的字段的新的数据类型
  • 修改字段排序:FIRST表示将字段名1作为表的第一个字段;AFTER表示将字段名1放在字段名2的后面,数据类型不可省略。

示例:把学生表student的姓名name改为CHAR(50):

ALTER TABLE student
MODIFY name CHAR(50)

示例2:把年龄age的顺序查到性别sex的前面:

ALTER TABLE student
MODIFY sex ENUM('男','女') AFTER age;

注意顺序:age到前面来,即sex放到age的后面

ENGINE

**修改表的存储引擎**

使用方法:

ALTER TABLE 表名
ENGINE=<修改后的存储引擎名>

DROP

用于删除字段和完整性约束

  1. 删除字段:
    语法:
ALTER TABLE 表名
DROP <字段名>

示例:删除student中新添加的class_NO1和addRess1字段:

ALTER TABLE student
DROP class_NO1,
DROP addRess1;
  1. 删除完整性约束:
    语法:
ALTER TABLE 表名
DROP CONSTRAINT <约束名>

示例: 删除学生表student中的CHECK约束s_chk

ALTER TABLE student
DROP CONSTRAINT s_chk;
  • 删除主码约束:由于表中只能有一个主码,因此无需指定主码名,可以直接删除:
ALTER TABLE 表名
DROP PRIMARY KEY
  • 删除NOT NULL约束时:
ALTER TABLE 表名
CHANGE [COLUMN] <字段名> <字段名> <数据类型> NULL

删除数据表

删除一个或者多个数据表
语法:

DROP TABLE [IF EXISTS] <表名>

IF EXISTS 为可选项。表示如果存在则删除此数据表

示例:删除学生表student:

DROP TABLE IF EXISTS student;

查看数据表

查看已创建的数据表

当我们已经创建完成表后:

SHOW TABLE;

来查看数据表内容

查看数据表的结构

使用DESCRIBE(DESC)或者SHOW CREATE TABLE查看数据表结构

DESCRIBE/DESC <表名>
SHOW CREATE TABLE <表名>
  • DESCRIBE/DESC <表名>:可以查看表的字段信息。
  • SHOW CREATE TABLE <表名>:可以查看创建表的详细语句。

示例:分别使用这两个语句来查看学生表s的结构:

USE student;
DESCRIBE s;

在这里插入图片描述
示例2:使用DESC查看学生表s的结构

USE student;
DESC s;

在这里插入图片描述
示例3:使用SHOW语法查看学生表s的结构

USE student;
SHOW CREATE TABLE s;

Navicat运行如下,不同的工具可能会产生不同的结果
在这里插入图片描述


3.数据表中数据的操纵

表中添加新数据

添加一条新纪录

语法:

INSERT | REPLACE INTO <表名> [(<字段名1> [<字段名2>...])] VALUES(<>);
  • 表名:要添加的新数据的表名
  • 字段名:是一个可选项,指定待添加的字段。
  • VALUES:指定待添加的数据的具体值,指定字段名时,VALUES中值的排序顺序必须和指定字段名的排序顺序一致,且个数相同,数据类型对应。

示例:使用INSERT和REPLACE分别在学生表s中插入数据:


USE student;
INSERT INTO s(sno,name,age,sex,address,maj,dept,class_no)
VALUES('s1','张三','18','男','中国','计算机','信息学院','20211');

在这里插入图片描述

REPLACE INTO s(sno,name,age,sex,address,maj,dept,class_no)
VALUES('s2','李四','18','男','中国','计算机','信息学院','20211');

在这里插入图片描述
注意:

  • 必须用逗号分隔每一个数据,且必须用单引号括起来。
  • INTO子句中没有指定字段名,则默认为全部字段,必须按照顺序和数据类型添加。
  • REPLACE添加的记录,若主码或者UNIQUE约束已经存在,则必须删除已有记录后在添加

同理,添加部分数据也是如此,我们只需要指定任意的字段名即可。

添加多条数据

INSERT | REPLACE INTO <表名> [(<字段名1> [<字段名2>...])] VALUES(<>),(<>),(<>)...;

示例:添加多条数据:

REPLACE INTO s(sno,name,age,sex,address,maj,dept,class_no)
VALUES('s2','李四','18','男','中国','计算机','信息学院','20211'),
('s3','王五','18','男','中国','计算机','信息学院','20211'),
('s4','赵六','18','男','中国','计算机','信息学院','20211');

在这里插入图片描述

修改表中的数据

语法:

UPDATE <表名>
SET <字段名>=<表达式> [,<字段名>=<表达式>]...
[WHERE <条件>]

示例:修改一条数据,把张三转入会计学院:

UPDATE s
SET dept='会计学院'
WHERE name='张三';

在这里插入图片描述
示例2:修改多条数据:把所有学生年龄增加一岁:

UPDATE s
SET age=age+1;

在这里插入图片描述

删除表中的数据

语法:

DELETE 
FROM <表名>
[WHERE <条件>]

示例:删除一条数据,学生表s中会计学院删除:

DELETE 
FROM s
WHERE dept='会计学院';

在这里插入图片描述
张三已被成功删除。

示例2:删除所有学生的所有字段:

DELETE 
FROM s;

在这里插入图片描述
相当于删除表的所有数据。

删除多条语句可以使用DELETE,也可以使用TRUNCATE语句,TRUNCATE专门用于清空表数据:

TRUNCATE [TABLE] <表名>;

推荐使用TRUNCATE:因为TRUNCATE删除内容,不删除定义,但是释放空间;DELETE删除内容,不删除定义,但是不释放空间

小结

本节我们学习了数据库表的创建,修改,删除,查看;表数据的添加,修改,删除。

posted @ 2022-09-15 21:50  hugeYlh  阅读(30)  评论(0编辑  收藏  举报  来源