二、MySQL中的数据类型
下面的四张表就是下一篇练习MySQL的资源,我真是太聪明了...如果有错欢迎指出,我及时update
|----整型----|
+-----------+-----------+----------------------+-----------------+--------------+
| 类型 | 字节数 | 有符号范围 | 无符号范围 | 描述 |
+-----------+-----------+----------------------+-----------------+--------------+
| TINYINT | 1 | -2⁷ ~ 2⁷-1 | 0 ~ 2⁸-1 | 很小整数 |
| SMALLINT | 2 | -2¹⁶ ~ 2¹⁶-1 | 0 ~ 2¹⁶-1 | 小整数 |
| MEDIUMINT | 3 | -2²⁴ ~ 2²⁴-1 | 0 ~ 2²⁴-1 | 中等整数 |
| INT | 4 | -2³² ~ 2³²-1 | 0 ~ 2³²-1 | 标准整数 |
| BIGINT | 8 | -2⁶⁴ ~ 2⁶⁴-1 | 0 ~ 2⁶⁴-1 | 大整数 |
+-----------+-----------+----------------------+-----------------+--------------+
复制代码
|----小数型----|
+---------+-----------+-------------------------------------------------------+----------------------------+
| 类型 | 字节数 | 取值范围 | 描述 |
+---------+-----------+-------------------------------------------------------+----------------------------+
| FLOAT | 4 | ±1.175494351E-38 ~ ±3.402823466E+38 | 单精度浮点 |
| DOUBLE | 8 | ±2.2250738585072014E-308 ~ ±1.7976931348623157E+308 | 双精度浮点 |
| DECIMAL | 不定 | 是M,D而定 | M:总位数,D:小数位数 |
+---------+-----------+-------------------------------------------------------+----------------------------+
复制代码
|----字符型----|
+------------+-------------------+---------------+-----------------------------------+
| 类型 | 最大字节数 | 最大范围 | 描述 |
+------------+-------------------+---------------+-----------------------------------+
| CHAR(M) | M | L或M或M×W | 定长字符串,M 0~255 |
| VARCHAR(M) | M | L+1或 L+2 | 变长字符串,L SELECT * FROM number;
+-----------+------+----------------------+----------------+--------------+
| type | byte | range_singed | range_unsinged | info |
+-----------+------+----------------------+----------------+--------------+
| TINYINT | 1 | -2⁷ ~ 2⁷-1 | 0 ~ 2⁸-1 | 很小整数 |
| SMALLINT | 2 | -2¹⁶ ~ 2¹⁶-1 | 0 ~ 2¹⁶-1 | 小整数 |
| MEDIUMINT | 3 | -2²⁴ ~ 2²⁴-1 | 0 ~ 2²⁴-1 | 中等整数 |
| INT | 4 | -2³² ~ 2³²-1 | 0 ~ 2³²-1 | 标准整数 |
| BIGINT | 8 | -2⁶⁴ ~ 2⁶⁴-1 | 0 ~ 2⁶⁴-1 | 大整数 |
+-----------+------+----------------------+----------------+--------------+
mysql> SELECT * FROM number\g
+-----------+------+----------------------+----------------+--------------+
| type | byte | range_singed | range_unsinged | info |
+-----------+------+----------------------+----------------+--------------+
| TINYINT | 1 | -2⁷ ~ 2⁷-1 | 0 ~ 2⁸-1 | 很小整数 |
| SMALLINT | 2 | -2¹⁶ ~ 2¹⁶-1 | 0 ~ 2¹⁶-1 | 小整数 |
| MEDIUMINT | 3 | -2²⁴ ~ 2²⁴-1 | 0 ~ 2²⁴-1 | 中等整数 |
| INT | 4 | -2³² ~ 2³²-1 | 0 ~ 2³²-1 | 标准整数 |
| BIGINT | 8 | -2⁶⁴ ~ 2⁶⁴-1 | 0 ~ 2⁶⁴-1 | 大整数 |
+-----------+------+----------------------+----------------+--------------+
mysql> SELECT * FROM number\G
*************************** 1. row ***************************
type: TINYINT
byte: 1
range_singed: -2⁷ ~ 2⁷-1
range_unsinged: 0 ~ 2⁸-1
info: 很小整数
*************************** 2. row ***************************
type: SMALLINT
byte: 2
range_singed: -2¹⁶ ~ 2¹⁶-1
range_unsinged: 0 ~ 2¹⁶-1
info: 小整数
*************************** 3. row ***************************
type: MEDIUMINT
byte: 3
range_singed: -2²⁴ ~ 2²⁴-1
range_unsinged: 0 ~ 2²⁴-1
info: 中等整数
*************************** 4. row ***************************
type: INT
byte: 4
range_singed: -2³² ~ 2³²-1
range_unsinged: 0 ~ 2³²-1
info: 标准整数
*************************** 5. row ***************************
type: BIGINT
byte: 8
range_singed: -2⁶⁴ ~ 2⁶⁴-1
range_unsinged: 0 ~ 2⁶⁴-1
info: 大整数
复制代码
2.清除命令
`\c 或 Ctrl+c`
复制代码
3.一条语句可换行
mysql> SELECT
-> *
-> FROM
-> number;
+-----------+------+----------------------+----------------+--------------+
| type | byte | range_singed | range_unsinged | info |
+-----------+------+----------------------+----------------+--------------+
| TINYINT | 1 | -2⁷ ~ 2⁷-1 | 0 ~ 2⁸-1 | 很小整数 |
| SMALLINT | 2 | -2¹⁶ ~ 2¹⁶-1 | 0 ~ 2¹⁶-1 | 小整数 |
| MEDIUMINT | 3 | -2²⁴ ~ 2²⁴-1 | 0 ~ 2²⁴-1 | 中等整数 |
| INT | 4 | -2³² ~ 2³²-1 | 0 ~ 2³²-1 | 标准整数 |
| BIGINT | 8 | -2⁶⁴ ~ 2⁶⁴-1 | 0 ~ 2⁶⁴-1 | 大整数 |
+-----------+------+----------------------+----------------+--------------+
复制代码
4.一行可执行多条语句
mysql> SELECT * FROM number;SELECT * FROM number_float;
+-----------+------+----------------------+----------------+--------------+
| type | byte | range_singed | range_unsinged | info |
+-----------+------+----------------------+----------------+--------------+
| TINYINT | 1 | -2⁷ ~ 2⁷-1 | 0 ~ 2⁸-1 | 很小整数 |
| SMALLINT | 2 | -2¹⁶ ~ 2¹⁶-1 | 0 ~ 2¹⁶-1 | 小整数 |
| MEDIUMINT | 3 | -2²⁴ ~ 2²⁴-1 | 0 ~ 2²⁴-1 | 中等整数 |
| INT | 4 | -2³² ~ 2³²-1 | 0 ~ 2³²-1 | 标准整数 |
| BIGINT | 8 | -2⁶⁴ ~ 2⁶⁴-1 | 0 ~ 2⁶⁴-1 | 大整数 |
+-----------+------+----------------------+----------------+--------------+
5 rows in set (0.00 sec)
+---------+------+-------------------------------------------------------+----------------------------+
| type | byte | num_range | info |
+---------+------+-------------------------------------------------------+----------------------------+
| FLOAT | 4 | ±1.175494351E-38 ~ ±3.402823466E+38 | 单精度浮点 |
| DOUBLE | 8 | ±2.2250738585072014E-308 ~ ±1.7976931348623157E+308 | 双精度浮点 |
| DECIMAL | NULL | 是M,D而定 | M:总位数,D:小数位数 |
+---------+------+-------------------------------------------------------+----------------------------+
复制代码
5.select可以通过逗号拼表
mysql> select 'a','b','c','d';
+---+---+---+---+
| a | b | c | d |
+---+---+---+---+
| a | b | c | d |
+---+---+---+---+
复制代码
四、数据库范式
1.先对接一下,简单描述相关概念
关系: 表/若干元组的集合
元组: 一行/一条记录/一个实体对象
属性: 一列/字段
分量: 元组中的一个属性值/一个实体对象的某一字段
域: 属性实际取值范围
超键:能够唯一标识一条记录的属性或属性集(可含多个属性)
候选键/候选码:能够唯一标识一条记录的属集(不含多余属性)
主键/主码:一个[候选键]作为主键
主属性:[候选键]中的属性
非主属性:[非候选键]中的属性
复制代码
2.ER图
3.第一范式:1NF
在关系模型中,对于添加的一个规范要求,所有的域都应该是原子性的
即数据库表的每一列(属性)都是不可分割的原子数据项。
即实体中的某个属性有多个值时,必须拆分为不同的属性。
在符合第一范式(1NF)表中的每个域值只能是实体的一个属性或一个属性的一部分
复制代码
这里的价格成了二维,不符合第一范式,应该展平
4.第二范式:2NF
在第一范式的基础上:
[非主属性]对[主属性]不存在部分函数依赖关系
复制代码
商品名 |
供应商 |
标准价格 |
价格 |
差价 |
供应商电话 |
分类 |
小刀 |
晨光文具 |
1.00 |
1.00 |
0 |
7654321 |
文具 |
铅笔 |
得力文具 |
1.00 |
1.50 |
0.5 |
1234567 |
文具 |
卷笔刀 |
晨光文具 |
5.00 |
5.00 |
0 |
7654321 |
文具 |
练字本 |
得力文具 |
2.00 |
2.00 |
0 |
1234567 |
文具 |
小刀 |
得力文具 |
1.00 |
1.20 |
0.2 |
1234567 |
文具 |
插入异常:A实体依赖于B实体,B实体的缺失而使A实体表示异常
|--
更新异常:更新A表的某一属性,需要多行进行更新
|-- 如果更新[得力文具]的供应商电话,需要更新三条数据
删除异常:A实体删除一行,导致B实体信息丢失
|-- 当删除第一、三行,晨光文具的供应商信息丢失
数据冗余:相同的数据在多张表中存在,或表的某属性可通过计算得到(如平均值、和等)
|-- 得力文具以及电话号码重复了很多次。标准价格,价格和差价之间有运算关系
复制代码
商品id |
商品名 |
标准价格 |
分类 |
1 |
小刀 |
1.00 |
文具 |
2 |
铅笔 |
1.00 |
文具 |
3 |
卷笔刀 |
5.00 |
文具 |
4 |
练字本 |
2.00 |
文具 |
供应id |
供应商 |
供应商电话 |
1 |
晨光文具 |
7654321 |
2 |
得力文具 |
1234567 |
供应id |
商品id |
差价 |
1 |
1 |
0 |
1 |
3 |
0 |
2 |
2 |
0.5 |
2 |
4 |
0 |
2 |
1 |
0.2 |
5.第三范式:3NF
在第二范式的基础上:
[非主属性]对任意[主属性]不存在传递性函数依赖
|--- 比如下面的(书名)-->(作者)-->(年代)
复制代码
书名 |
作者 |
年代 |
上架建议 |
价格 |
海子 |
海子 |
近现代 |
诗集 |
30.6 |
朝花夕拾 |
老舍 |
近现代 |
名著 |
19.9 |
你是人间的四月天 |
林徽因 |
近现代 |
经典文学 |
25.6 |
资治通鉴 |
司马光 |
北宋 |
古典文学 |
55.6 |
6.BC范式:BCNF
在第三范式的基础上:
[所有属性]对任意[主属性]不存在传递性依赖
复制代码
第四、第五范式暂不提及,注意范式并非严格的标准。 可以根据实际情况反范式化来用空间换时间