一、Navicat 安装与使用指南
1、Mysql客户端
上一篇文章中,我们已经对Mysql进行了安装,并可以通过Mysql自带的
Command Line Client 操作Mysql服务端,但是这种命令行的客户端对于新手来说不是很友好,操作也不方便,所以,我们可以通过一些带有图形化界面的客户端来操作Mysql服务器。
2、常用的GUI客户端
2.1 MySQL Workbench【了解】
免费的 MySQL 可视化工具,由 MySQL 官方供应商提供。
2.2 Navicat【重点】
Navicat 是一套功能强大的数据库管理工具,支持 MySQL、MariaDB、SQL Server、Oracle、PostgreSQL 和 SQLite 等多种数据库系统。但是需要收费,有14天的免费试用。
下载安装
下载路径:
需要地址的可以关注私信我~~~~
双击exe文件进行安装
解压Navicat16.3补丁.zip压缩包
双击运行
打开Navicat
3、Navicat的使用
3.1 配置数据库连接
点击左上角的“连接”,选择mysql
3.2 连接数据库
其中,information_schema,mysql,performance_schema,sys是当前数据库管理系统默认管理的4个数据库
- information_schema
- 功能:提供数据库元数据访问
- 作用:
- 包含所有数据库、表、列、索引、权限等元信息
- 只读视图,不存储实际数据
- 用于查询数据库结构信息
- 符合SQL标准,其他数据库系统也有类似结构
- mysql
- 功能:存储MySQL系统数据
- 作用:
- 包含用户账户和权限信息
- 存储存储过程、事件定义
- 包含时区、日志等系统表
- 是MySQL正常运行的核心数据库
- performance_schema
- 功能:性能监控和统计
- 作用:
- 提供服务器运行时性能数据
- 监控服务器事件和资源使用情况
- 用于性能分析和故障排查
- 数据存储在内存中,重启后不保留
- sys
- 功能:简化performance_schema的访问
- 作用:
- 基于performance_schema和information_schema的视图和存储过程
- 提供更易读的性能数据
- 包含常用的诊断查询
这四个系统数据库共同为MySQL提供了元数据管理、权限控制、性能监控和诊断的功能,是MySQL正常运行和管理的核心组成部分。
3.3 查看表、表结构、表内容
查看数据库管理的表


打开表:查看表中的数据
会打开一个窗口,展示表中的数据

设计表:查看表的结构
会打开一个窗口,展示表的设计结构

3.4 SQL语句的编写与执行
我们前面知道,SQL是操作数据库的命令,在Navicat中,如何编写并执行SQL呢?

执行sql


保存编写过的SQL
Ctrl+S保存


我们最近学习Mysql,核心学习SQL语法,所以,Navicat只是方便我们查看SQL的运行结果,我们所有的操作还是通过SQL执行。
二、数据库的基本操作
我们通常不会对mysql自带的四个数据库做操作,如果我们想要管理我们自己的数据,会创建新的数据库,把数据保存到我们自己创建的数据库中。对于一些中小型项目,一个项目对应一个数据库。下面我们学习数据库的基本操作,包括创建、删除、使用、查看。
1、创建数据库
语法:
CREATE DATABASE database_name;
上述语法中,database_name表示要创建的数据库的名字,同一个数据库管理系统下的数据库名字不能重复,命名的格式也要符合规范:
- 由字母、数字、下划线、@、#和$符号组成
- 首字母不能是数字和$符号
- 不能是关键字
- 关键字表示有特殊意义的单词,比如CREATE、DATABASE等
- 如果非要使用关键字,则使用``符号包裹,如: `CREATE`
- 默认不区分大小写
- 不允许有空格和特殊字符
- 长度小于128位
- 如果数据库名字由多个单词组成,则多个单词之间使用下划线连接
例子
创建一个数据库,名字为test
CREATE DATABASE test;
2、查看和选择数据库
我们对数据库的操作一定是基于某个数据库,所以在数据操作之前,要选择某个数据库,但是,我们要先查看我们管理了哪些数据库,防止选择的数据库不存在。
2.1 查看数据库
一般对于一个经验丰富的开发人员,在对数据库操作之前,都会先查看有哪些数据库,防止创建同名数据库或者选择了一个没有的数据库。
语法
SHOW DATABASES;
2.2 选择数据库
在数据操作之前一定是先选择某个数据库;
语法
USE database_name;
例子
执行SQL语句USE,选择名为test的数据库
如果我们用的命令行的客户端
大家可以尝试一下,如果我们选择了一个不存在的数据库执行结果会如何。
3、删除数据库
注意:删除数据库后,数据库中的所有表和数据以及其他数据库对象也会全部删除,所以删除数据库之前一定要仔细、小心。
语法
DROP DATABASE database_name;
database_name表示我们要删除的数据库的名称。我们可以根据数据库名称,删除数据库,比如我们要删除刚刚创建的test数据库。
补充[了解]:
查看当前正在使用的数据库:
SELECT DATABASE();
查看数据库创建时的语句
SHOW CREATE DATABASE 数据库名;
三、数据类型
1、为什么需要数据类型
有了数据库的操作,那么我们就可以在数据库中进行数据管理了,但是,所有的关系型数据库,数据都是存储到
表中的,所以,
表是数据存储的最小结构单位,数据不能脱离表而存在。
我们先看一个表:
这是一个产品表
|
字段名
|
说明
|
|
id
|
产品ID
|
|
name
|
产品名称
|
|
category_id
|
分类ID,关联产品分类表
|
|
price
|
产品售价,十进制数(总位数10,小数位2)
|
|
cost_price
|
产品成本价
|
|
stock
|
库存数量
|
|
sku
|
库存单位编码(唯一产品标识)
|
|
barcode
|
商品条形码
|
|
description
|
产品详细描述
|
|
image_url
|
产品主图URL地址
|
|
status
|
产品状态:1-上架,0-下架
|
我们看“库存数量”这一列,存储的都是整数,如果我们填入的是“三十”、“贰拾”等这些值,是否方便计算?
所以,我们要保证每一列数据的正确性,需要对他们进行“规范”,这种限制数值种类的“规范”,我们称为列的数据类型。
Mysql数据库管理系统提供了整数类型、浮点数类型、定点数类型和位类型、日期和时间类型、字符串等。。
2、整数类型
在具体使用 MySQL 数据库管理系统时,如果需要存储整数类型数据,则可以选择TINYINT、SMALLINT、MEDIUMINT、INT、INTEGER 和BIGINT类型,至于选择这些类型中的哪一个,首先需要判断存储整数数据的取值范围,
当不超过255时,那选择TINYINT类型就足够了。虽然BIGINT 类型的取值范围最大,最常用的整数类型却是INT类型。
3、浮点数、定点数类型
MySQL中使用浮点数和定点数来表示小数。浮点数类型有两种:
单精度浮点类型(FLOAT)和双精度浮点类型(DOUBLE)。定点数类型只有一种:
DECIMAL。浮点数类型和定点数类型都可以用(M,N)来表示。其中,M称为精度,表示总共的位数;N称为标度表示小数的位数。
在具体使用MySQL数据管理系统时,如果需要存储小数数据,则可以选择FLOAT和DOUBLE类型,至于选择这两个类型中的哪一个,则需要判断存储小数数据需要精确的小数位数,
当需要精确到小数点后10位以上,就需要选择DOUBLE类型。
在具体使用MSQL数据库管理系统时,如果需要存储小数数据,除了可以选择FLOAT和DOUBLE类型外,还可以选择DEC和DECIMAL类型,
当要求小数数据精确度非常高时,则可以选择 DEC 和 DECIMAL类型,它们的精确度比 DOUBLE 类型还要高。
4、日期与时间类型
MySQL中有多种表示日期的数据类型,主要有DATETIME ,DATE、TIMESTAMP、TIME和YEAR。例如,当只记录年信息的时候可以只使用YEAR类型,而没有必要使用DATE。每一个类型都有合法的取值范围,当指定确实不合法的值时系统将“零”值插入到数据库中。
在具体使用 MySQL 数据库管理系统时,要根据实际应用来选择满足需求的最小存储的日期类型。例如,如果应用只需存储“年份”,则可以选择存储字节为1的YEAR 类型。
如果要存储年月日时分秒,并且年份的取值可能比较久远,最好使用DATETIME类型,而不是TIMESTAMP 类型因为前者比后者所表示的日期范围要长一些。如果存储的日期需要让不同时区的用户使用,则可以使用 TIMESTAMP 类型,因为只有该类型日期能够与实际时区相对应。
5、文本字符串类型
5.1 什么是字符串
字符串类型是MySQL中用于存储文本数据的数据类型,用来保存字符序列(字母、数字、符号等)。与其他数据类型相比,字符串类型专门用于处理文本信息,而不是数值、日期或二进制数据。
1 整数 --- 表示数值
'112' 字符串 --- 表示文本
5.2 CHAR和VARCHAR类型
CHAR(M)为固定长度字符串,在定义时指定字符串列长。当保存时在右侧填充空格,以达到指定的长度。M表示列长度,M的范围是0~255个字符。例如,CHAR(4)定义了一个固定长度的字符串列,其包含的字符个数最大为4。当检索到CHAR值时,尾部的空格将被删除。
VARCHAR(M)是长度可变的字符串,M表示最大列长度。M的范围是0~65535。VARCHAR的最大实际长度由最长的行的大小和使用的字符集确定,而其实际占用的空间为字符串的实际长度加1。例如,VARCHAR(50)定义了一个最大长度为50的字符串,如果插入的字符串只有10个字符,则实际存储的字符串为10个字符和一个字符串结束字符。VARCHAR在值保存和检索时尾部的空格仍保留。
5.3 TEXT类型
TEXT系列中的各种字符串类型允许的长度和存储字节不同,其中TINYTEXT字符串类型允许存储字符串长度最小,LONGTEXT字符串类型允许存储字符串长度最大。
在具体使用 MySQL数据库管理系统时,如果
需要存储大量字符串(存储文章内容的纯文本),则可以选择 TEXT系列字符串类型。至于是选择这些类型中的哪一个,则需要判断所存储字符串长度,根据存储字符的长度来决定是选择允许长度最小的TINYTEXT字符串类型,还是选择允许长度最大的 LONGTEXT 字符串类型。
5.4 ENUM类型
ENUM 是 MySQL 中的一种字符串对象类型,它允许你从一个预定义的值列表中选择一个值。
语法
字段名 ENUM('值1','值2',...,'值n')
“字段名”指将要定义的字段,“值n”指枚举列表中的第n个值。ENUM类型的字段在取值时,只能在指定的枚举列表中取而且一次只能取一个。创建的成员中有空格时,其尾部的空格将自动被删除。
5.5 SET类型
ENUM类型的列只能从ENUM的列表中选择某一个值进行插入。
如果我们想插入多个值,并且让这些值只能是预先设置的某些字符串,则可以使用SET。
语法
字段名 SET('值1','值2',...,'值n')
如果插入SET字段中列值有重复,则MySQL
自动删除重复的值;插入SET字段的值的顺序并不重要,MySQL会在存入数据库时按照定义的顺序显示;如果插入了不正确的值,默认情况下,MySQL将忽视这些值,并给出警告。
6、二进制类型
前面讲解的是如果我们想把字符串文本存入数据库,则可以使用文本字符串类型。如果我们想存储
图片、音频、视频这些数据,则可以选择二进制类型。MySQL中的二进制数据类型有BIT、BINARY、VARBINARY、TINYBLOB、BLOB、MEDIUMBLOB 和LONGBLOB。本节将讲解各类二进制字符串类型的特点和使用方法。
6.1 BIT
BIT类型是位字段类型。M表示每个值的位数,范围为1~64。如果M被省略,默认为1。
每一位上使用1或0表示,比如我们有8盏灯,要记录这8盏灯的状态,就可以使用值:
b'01001010'
来记录,而这个值就是BIT类型的。
6.2 BINARY和VARBINARY类型
BINARY和VARBINARY类型类似于CHAR和VARCHAR,不同的是它们包含二进制字节字符串。
在具体使用 MySQL 数据库管理系统时,如果需要存储少量二进制数据,则可以选择 BINARY和 VARBINARY类型。至于是选择这两个类型中的哪一个,则需要判断所存储二进制数据长度是否经常变化。如果经常发生变化则可以选择 VARBINARY 类型,否则选择BINARY 类型。
6.3 BLOB类型
BLOB是一个二进制大对象,用来存储可变数量的数据。BLOB类型分为4种:TINYBLOB、BLOB、MEDIUMBLOB和LONGBLOB它们可容纳值的最大长度不同。
BLOB列存储的是二进制字符串(字节字符串),TEXT列存储的是非二进制字符串(字符字符串)。在具体使用 MySOL数据库管理系统时,如果需要存储
大量二进制数据(存储电影等视频文件),则可以选择 BLOB 系列字符串类型。至于是选择这些类型中的哪一个,则需要判断所存储二进制数据长度,根据存储二进制数据的长度来决定是选择允许长度最小的TINYBLOB 字符串类型,还是选择允许长度最大的LONGBLOB字符串类型。
7、如何选择数据类型
7.1 整数和浮点数
如果不需要小数部分,就使用整数来保存数据;如果需要表示小数部分,就使用浮点数类型。对于浮点数据列,存入的数值会对该列定义的小数位进行四舍五入。
浮点类型包括FLOAT和DOUBLE类型。DOUBLE类型精度比FLOAT类型高,因此要求存储精度较高时应选择DOUBLE类型。
7.2 浮点数和定位数
浮点数FLOAT、DOUBLE相对于定点数DECIMAL的优势是:在长度一定的情况下,浮点数能表示更大的数据范围。由于浮点数容易产生误差,因此
对精确度要求比较高时,建议使用DECIMAL来存储。DECIMAL在MySQL中是以字符串存储的,用于定义
货币等对精确度要求较高的数据。在数据迁移中,
float(M,D)是非标准SQL定义,数据库迁移可能会出现问题,最好不要这样使用。另外,两个浮点数进行减法和比较运算时也容易出问题,因此在进行计算的时候一定要小心。进行数值比较时,最好使用DECIMAL类型。
7.3 日期与时间
MySQL对于不同种类的日期和时间有很多数据类型,比如YEAR和TIME。如果只需要记录年份,则使用YEAR类型即可;如果只记录时间,则使用TIME类型。
如果同时需要记录日期和时间,则可以使用TIMESTAMP或者DATETIME类型。由于TIMESTAMP列的取值范围小于DATETIME的取值范围,
因此存储范围较大的日期最好使用DATETIME.
TIMESTAMP也有一个DATETIME不具备的属性。默认的情况下当插入一条记录但并没有指定TIMESTAMP这个列值时,MySQL会把TIMESTAMP列设为当前的时间。
因此当需要插入记录的同时插入当前时间时,使用TIMESTAMP是方便的。另外,TIMESTAMP在空间上比DATETIME更有效。
7.4 CHAR与VARCHAR
CHAR和VARCHAR的区别如下:
- CHAR是固定长度字符,VARCHAR是可变长度字符,
- CHAR会自动删除插入数据的尾部空格,VARCHAR不会删除尾部空格。
CHAR是固定长度,所以它的处理速度比VARCHAR的速度要快但是它的缺点是浪费存储空间,所以对存储不大但在速度上有要求的可以使用CHAR类型,反之可以使用VARCHAR类型来实现。
7.5 ENUM和SET
ENUM只能取单值,它的数据列表是一个枚举集合。它的合法取值列表最多允许有65535个成员。因此,在需要从多个值中选取一个时,可以使用ENUM。比如:性别字段适合定义为ENUM类型,每次只能从'男’或'女’中取一个值。
SET可取多值。它的合法取值列表最多允许有64个成员。空字符串也是一个合法的SET值。在需要取多个值的时候,适合使用SET类型,比如要存储一个人的兴趣爱好,最好使用SET类型
ENUM和SET的值是以字符串形式出现的,但在内部,MySQL是以数值的形式存储它们的。
7.6 BLOB和TEXT
BLOB是二进制字符串,TEXT是非二进制字符串,两者均可存放大容量的信息。
BLOB主要存储图片、音频信息等,而TEXT只能存储纯文本文件。
四、数据表的基本操作
1、创建数据表
在创建完数据库之后,我们学习了列的数据类型,接下来的工作就是创建数据表。所谓创建数据表,指的是在已经创建好的数据库中建立新表。创建数据表的过程是规定数据列的属性的过程,同时也是实施数据完整性的过程。
1.1 创建表的语法
数据表属于数据库,在创建数据表之前,应该使用语句“USE <数据库名>”指定操作是在哪个数据库中进行,如果没有选择数据库就会抛出“
No database selected”的错误。
CREATE TABLE 表名 ( 列名1 数据类型, 列名2 数据类型, ... 列名n 数据类型 );
需要注意的事情:
- 要创建的表的名称,不区分大小写,不能使用SQL语言中的关键字,如DROP、CREATE、ALTER、INSERT等。
- 数据表中每一列(字段)的名称和数据类型,如果创建多列,就要用逗号隔开,最后一列后面不写逗号。
- 所有的标点符号都需要使用英文符号。
例子
创建员工表tb_emp1,结构如下所示
-- 创建数据库 CREATE DATABASE test_db; -- 切换数据库 USE test_db; -- 创建表 CREATE TABLE tb_emp1( id INT, name VARCHAR(25), deptId INT, salary FLOAT );
使用"SHOW TABLES"展示当前数据库下管理的所有表:
show tables; 查看当前数据库下管理的哪些表
1.2 查看表结构
当创建完表后,经常需要查看表信息。那么如何在MySQL软件中查看表信息呢?查看帮助文档,可以发现许多实现查看表信息的语句,例如DESCRIBE、SHOW CREATETABLE等。
DESCRIBE查看表定义
语法
DESCRIBE table_name;
table_name表示要查看的表的名称。
SHOW CREATE TABLE查看表详细定义
语法
SHOW CREATE TABLE table_name;
CREATE TABLE `tb_emp1` ( `id` int DEFAULT NULL, `name` varchar(25) DEFAULT NULL, `deptId` int DEFAULT NULL, `salary` float DEFAULT NULL ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci
1.3 练习
1. 创建学生信息表
创建一个名为 students 的表,包含以下字段:
学号(数字类型)
姓名(字符串类型)
性别(使用ENUM类型,可选'男','女','其他')
年龄(整数类型)
身高(小数类型,单位米)
是否团员(使用BIT类型表示)
CREATE TABLE students( student_id int, name varchar(30), gender ENUM('男','女','其他'), age int, height decimal(4,1), member bit );
2. 创建图书表
创建一个名为 books 的表,包含以下字段:
图书ID(数字类型)
书名(字符串类型)
图书类型(使用ENUM,可选'科技','文学','历史','艺术','其他')
价格(小数类型)
是否在馆(使用BIT类型表示)
create table books( id int, name varchar(50), type enum('科技','文学','历史','艺术','其他'), price double, is_stored bit );
3. 创建电脑配置表
创建一个名为 computer_configs 的表,包含以下字段:
配置ID(数字类型)
CPU型号(字符串类型)
内存大小(整数类型,单位GB)
硬盘类型(使用ENUM,可选'SSD','HDD','混合')
接口状态(使用BIT(8)表示8个USB接口的使用情况)
create table computer_configs( id int, cpu varchar(20), memory int, disk_type enum('SSD','HDD','混合'), state bit(8) );
2、删除表
表的操作包括创建表、查看表、删除表和修改表。所谓删除表就是指删除数据库中已经存在的表。
在具体删除表时,会直接删除表中所保存的所有数据,因此在删除表时应该非常小心。
语法
DROP TABLE table_name;
table_name表示你要删除的表的名字。
删除后,通过show tables;语句查询不到删除的表。
3、修改表结构
对于已经创建好的表,当使用一段时间后,就需要进行一些结构上的修改,即表的修改操作。该操作的解决方案是先将表删除,然后再按照新的表定义重建表。但是这种解决方案有问题,即如果表中已经存在大量数据,那么重建表后还需要做许多额外工作,例如数据的重载等。为了解决上述问题,MySOL数据库提供“
ALTER TABLE”语句实现修改表结构。
3.1 修改表名
语法
ALTER TABLE old_table_name RENAME [TO] new_table_name;
在上述语句中,old_table_name表示所要修改的表的名字,new_table_name表示修改后的新名字。所要操作的表对象必须在数据库中已经存在。
例子
创建tb_emp1表,并把tb_emp1表的名字改为employee
我们看到tb_emp1表成功改名为employee。
3.2 增加字段
对于表,可以看成是由列和行来构成的,其中“列”经常被称为字段。根据创建表的语法可以发现,字段是由字段名和数据类型进行定义的。
在表的最后一个位置增加字段
ALTER TABLE table_name ADD 属性名 属性类型;
table_name表示所要修改表的名字。
属性名为要增加字段的名称。
属性类型为所要增加字段的能存储数据的数据类型。
如,给employee表添加年龄字段:
ALTER TABLE employee ADD age int;
在表的第一个位置增加字段
ALTER TABLE table_name ADD 属性名 属性类型 FIRST;
在上述语句中,多了一个FIRST,表示所增加的字段在所有字段之前,即在表中的第一个位置。
employ表中在最前列添加一列“出生日期”
ALTER TABLE employee ADD birthday date FIRST;
在表的指定字段之后增加字段
ALTER TABLE table_name ADD 属性名 属性类型 AFTER 属性名;
在上述语句中,多了一个关键字AFTER,表示所有增加的字段在该关键字所指定的字段之后。
例如,我们想在employee的name字段后面添加手机号码(telephone)字段
ALTER TABLE employee ADD telephone CHAR(11) AFTER name;
3.3 删除字段
对于表,既然可以在修改表时进行字段的增加操作,那么也可以在修改表时进行字段的删除。所谓删除字段是指删除已经在表中定义好的某个字段。
ALTER TABLE table_name DROP 属性名;
table_name 表示所要修改表的名字。
属性名表示所要删除的字段名。
如将之前添加的age字段删除:
ALTER TABLE employee DROP age;
3.4 修改字段
根据创建表的语法可以发现,字段是由字段名和数据类型来进行定义的,如果要实现修改字段,除了可以修改字段名外,还可以实现修改字段所能存储的数据类型。由于一个表中会拥有许多字段因此还可以实现修改字段的顺序。
修改字段的数据类型
ALTER TABLE table_name MODIFY 属性名 数据类型;
table_name 参数表示所要修改表的名字,“属性名”参数为所要修改的字段名,“数据类型”为
修改后的数据类型。
我想把employee表中的telephone列的类型由char(11)改成varchar(11)
ALTER TABLE employee MODIFY telephone VARCHAR(11);
修改字段的名字
ALTER TABLE table_name CHANGE 旧属性名 新属性名 旧数据类型;
table_name 参数表示所要修改表的名字,“旧属性名”参数表示所要修改的字段名,“新属性名”参数表示所要修改成的字段名。
例如,我们想把employee表中的deptId列改成dept_id这个名字
ALTER TABLE employee CHANGE deptId dept_id int;
同时修改字段的名字和数据类型
ALTER TABLE table_name CHANGE 旧属性名 新属性名 新数据类型;
“新属性名”参数表示所要修改成的字段名,“新数据类型”为所要修改成的数据类型。
例如,我们想把employee的salary列改成bonus,数据类型改成double
ALTER TABLE employee CHANGE salary bonus double;
修改字段顺序
ALTER TABLE table_name CHANGE 属性名1 属性名1 旧数据类型 FIRST|AFTER 属性名2;
table_name 参数表示所要修改表的名字,“属性名1”参数表示所要调整顺序的字段名,“FIRST”参数表示将字段调整到表的第一个位置,“AFTER 属性名 2”参数表示将字段调整到属性名2字段位置之后。
注意:属性名1和属性名2必须是表中已经存在的字段名
例如,我想把bonus列调整到name列后面
ALTER TABLE employee CHANGE bonus bonus double AFTER name;
4、综合练习
假设你要为一个小型书店设计数据库,请完成以下任务:
(1)创建一个名为 books 的表,包含以下字段:
book_id - 整数类型
title - 字符串类型
author - 字符串类型
price - 小数类型(总共6位,小数点后2位)
publication_date - 日期类型
stock_quantity - 整数类型
category - 字符串类型
(2)创建一个名为 customers 的表,包含以下字段:
customer_id - 整数类型
name - 字符串类型
email - 字符串类型
phone - 字符串类型
registration_date - 日期类型
(3)创建一个名为 orders 的表,包含以下字段:
order_id - 整数类型
customer_id - 整数类型
order_date - 日期类型
total_amount - 小数类型(总共8位,小数点后2位)
(4)修改 books 表,添加一个新列 page_count(整数类型)
(5)修改 customers 表,将 phone 列的数据类型改为可变长度字符串(最大50个字符)
(6)删除 orders 表中的 total_amount 列
(7)创建一个新表 order_details 包含:
detail_id - 整数类型
order_id - 整数类型
book_id - 整数类型
quantity - 整数类型
unit_price - 小数类型(总共6位,小数点后2位)
(8)最后,删除 order_details 表

被折叠的 条评论
为什么被折叠?



