创建数据
一 MySQL数据库结构
一个数据链接下,可以有很多数据库,每个数据库下,又可以有很多数据表。数据表是实际数据的容器。
我们一般以不同的业务来划分数据库,比如一个公司经营着酒店、经营着港口。那么很明显,酒店里面的数据内容和港口里面的数据内容差别是很大的。那么,可以建一个数据库专门存放酒店相关的数据,而另外建立一个数据库存放港口相关的数据。
二 创建数据库
下面的语句中[]
里面的是可选的内容,<>
内的内容需要自己进行修改。MySQL
不分大小写,无论数据库名、数据表名、字段名还是具体的SQL指令都不分大小写。
当安装完成MySQL
服务及客户端后,可以依据业务需求,建立数据库,建立数据库的语句如下:
CREATE DATABASE [IF NOT EXISTS] <数据库名> [ [DEFAULT] CHARACTER SET <字符集名>] [ [DEFAULT] COLLATE <校对规则名>];
上述代码中:
-
IF NOT EXISTS
-- 是可选内容,代表如果后面的<数据库>
不存在则进行创建;数据库中,是不允许存在多个同名数据库的,当已经存在你所要创建的数据库时,语句将会报错。如果加了这句,则不会报错,只是不会再创建一次。
create database db_test; --目前数据库里已经有db_test库,此句会报错
create database if not exists db_test;
-
字节和比特CHARACTER SET
-- 指数据库的默认字符集,一般直接使用utf8
。在目前的中文使用环境里,其他字符集容易使存储的数据出现乱码。字符集,是系统把字符转化为二进制的一个规则。
简单提一下byte(字节)和bit(比特、位)。我们都知道,电脑的运行和存储,都是以二进制进行的。字符集,也就是我用几个byte去表示你实际显出出来的一个字。不同的字符集编码是不一样的。
拓展: 为什么有些软件遇到汉字路径会乱码?汉字和英文的字符集编码思路有什么不同?
一般情况下,英文、数字、半角字符,都是一个byte
;只拿数字和英文举例,英文是分字母的,一共26个,考虑大小写,一共52;数字其实也是如此,一位十进制数最多有10个;也就是英文+数字,一共只需要62个就可以表示。所以,A
的ASCII
码是0x41
,B
的是0x42
,C
是0x43
。1byte
可以表示255
个东西,足够表达普通的字母和键盘上的一些操作。但汉字,包括一些表情,肯定是远远多于255
个的。所以英文的编码方式,是无法兼容中文的,解析时自然会变成乱码。 -
COLLATE
-- 指定数据校对规则,数据校对规则决定了数据库怎么去别对两个字符串,比如A
和a
是否是一样的。目前使用默认值就可以。
字符集和校对规则,后期都是可以修改的,但数据库名称不行
最终的语句
--删除数据库语句,[if exists]依然是可选的,与[if not exists]相对应
drop database if exists db_test;
create database if not exists db_test default character set gb2312;
--查看数据库 db_test的字符集
show create database db_test;
创建时的字符集
三 修改数据库
语法
ALTER DATABASE <数据库名> [ [DEFAULT] CHARACTER SET <字符集名>] [ [DEFAULT] COLLATE <校对规则名>];
修改数据库,将创建时的gb2312
字符集,改到utf8
alter database db_test default character set utf8;
--查看数据库 db_test的字符集
show create database db_test;
修改数据库字符集
四 创建数据表
首先看图:
数据表 示意图
依然是之前我们所使用的,超市、商品和销售的例子。我们可以把超市,单独建立一个数据库,数据库名字比如叫db_supermarket
,我们可以看到:
- 数据表是数据的实际载体,也就是说,数据都是放到数据表里的;
- 数据表是在数据库中的,数据库算是对数据表的一个归集;
- 另外我们需要注意看数据表里面的数据,之前我们提到过
字段
这个概念,我们可以发现,不同字段
,他的数据类型是不一样的,比如,字段名称
是文字
、字段数量
是数值
、字段销售日期
是时间日期
。这其中的文字
,我们一般称之为字符串
类型,为什么叫字符串呢?
当我们提到
字符
时,它可能是一个字母,如a
;可能是一个符号,如?
;可能是一个汉字,如字
等等...,我们所谓的文字,其实就是n
个任意字符连城了一串,是不是就可以叫做字符串
?
4.1 语法
下面是一个创建销售表的示例,我们在上图的基础上,添加了销售编号
作为主键
。
use db_test;
drop table if exists info_sales;
CREATE TABLE info_sales (
product_code varchar(255) NOT NULL,
sale_date date NOT NULL,
sale_quantity int NOT NULL,
sale_id varchar(255) PRIMARY key NOT NULL
);
上述语句分为三句:
- 把操作对象确定为
db_test
库 - 如果数据库里有
info_sales
表,那么就删除 - 创建表
info_sales
执行上述语句后,可以看到数据库中创建了新的数据表。数据表下方列出的,是字段,带着金钥匙图标的,是主键。
销售信息表
通过上述示例,可以总结出 create
语句的基本语法:
CREATE TABLE [IF NOT EXISTS] table_name (
字段1 字段1数据类型 [约束条件1 约束条件2],
字段2 字段2数据类型 [约束条件1 约束条件2],
);
约束条件
,就像上面的NOT NULL
,PRIMARY key
,都叫字段的约束条件
,是对字段做限制用的。
上面的NOT NULL
,代表了字段不能没有数据。空也是一种数据,和NULL不一样
4.2 数据类型
上面我们已经说过,目前我们要讲的数据类型大致分为三种:数值、字符串及时间日期。
- 数值
包括:整数、浮点类型和定点类型。
常用的整数类型为:int
常用的浮点类型为:float
常用的定点类型为: decimal,numeric
其中:
1.1.float
被称为;而int
、decimal
和numeric
为高精度数据类型。这是因为,float
直接使用二进制表示一个有小数点的数,decimal
则使用两组二进制,分别表示小数点前的十进制数和小数点后的十进制数。差别在于,十进制的0.1在二进制里是无限循环的0.00011001100110011
,使用float
存储时,只能使用近似值存储。
1.2.float
不建议使用float(m,d)
,在高版本的MySQL
中已经列入遗弃,应该使用标准的float
类型。
1.3.decimal
和numeric
可以使用decimal(m,d)
的方式进行声明,代表数据的总长度是m
位十进制
(m
范围是 1 到 65);其中,小数d
位(范围是 0 到 30,并且不能大于 M)。use db_test; drop table if exists tb_test; create table tb_test( c_1 int, c_2 float, c_3 decimal(16,4), c_4 numeric(12,6) )
- 字符串
字符串常用的有:char
、varchar
、text
。其中:
2.1.char
是固定长度的字符串,最大是255
个字符;如果声明时,长度是6
,那么就算只存入一个字,也会占用6
个字符。
2.2.varchar
是可变长度的字符串,即,如果声明时长度是6
但是存入一个字符,那么实际占用空间就是1
个字符。
2.3.text
用于存储长文本,比如评论等;不需要声明长度,并且不受大小控制。use db_test; drop table if exists tb_test_str; create table tb_test_str( c_1 char(10), c_2 varchar(50), c_3 text )
- 时间日期
时间日期常用的有:date
、time
、datetime
。其中:
2.1.date
它的显示格式是YYYY-MM-DD
,占用3
个字节;
2.2.time
它显示的格式是HH:mm:ss
,占用3
个字节;
2.3.datetime
它显示的格式是YYYY-MM-DD HH:mm:ss
,占用8
个字节。前 5 个字节存储年月日时分,后 3 个字节存储秒和毫秒,每个部分占用一个半字节。use db_test; drop table if exists tb_test_tm; create table tb_test_tm( c_1 date, c_2 time unique primary key not null, c_3 datetime )
五 修改数据表
数据表创建以后是可以修改的,包括:
- 添加新列(字段);
use db_test; ALTER TABLE tb_test_tm ADD c_4 varchar(10);
- 修改字段定义(字段类型);
use db_test; ALTER TABLE tb_test_tm modify c_3 varchar(10);
- 修改字段名称;
use db_test; ALTER TABLE tb_test_tm change c_2 newc_2 varchar(15)
- 删除字段;
use db_test; ALTER TABLE tb_test_tm DROP c_1;
- 重命名表。
use db_test; ALTER TABLE tb_test_tm RENAME TO tb_test_tm_new; rename TABLE tb_test_tm_new TO tb_test_tm;
网友评论