个人所有文章整理在此篇, 将陆续更新收录: 知无涯, 行者之路莫言终(我的编程之路)
零, 如何访问服务器上的 MySQL 数据库
1. 远程连接服务端的 MySQL
开发 3306 端口(端口号为你服务器上的 MySQL 访问端口)
2. 本地访问服务端
这里貌似不允许连接
|-- 在服务端进入 MySQL 语句执行: 开放权限 -----------------
Grant all privileges on *.* to 'root'@'%' identified by '你的密码' with grant option;
一, 关于 MySQL 的相关知识
简单来说 MySQL 服务就是向若干个客户端提供并操作数据的软件
MySQL 的结构
MySQL 服务器中有若干数据库, 数据库中又有若干表, 表中又有若干记录, 记录又有若干字段
记录映射实体在应用中使用
在 Java 中有一种数据类型叫 List, 也就是列表, 对数据库的操作会将一张表通过实体类映射成对象列表
其中一条记录对于 List 中的一个对象, 对象的属性和表的字段往往一一对应,
能够远程获取数据产生实体类列表, 就可以填充客户端 UI, 这便让数据库在编程语言中有了价值
这也使得前后端在应用层面实现分离, 明确接口后, 各端可以专注各自的业务
1.MySQL 的文件目录
将解压文件 bin 的路径配置到环境变量 path 下, 以便在任意地方都可执行命令
2. 安装 MySQL 服务及基本指令
- # 安装 MySQL 将会在服务里出现一个叫 MYSQL57 的服务
- mysqld install MYSQL57
- # 启动 MySQL
- net start MySQL
- # 停止 MySQL
- net stop MySQL
- # 设置密码
- update MySQL.user set authentication_string=password('xxxx') where user='root';
- # 数据库备份
- mysqldump -uroot -p mycode> D:\\backupSql\\Android.sql
- # 数据库还原
- MySQL -u root -p mycode <D:\\backupSql\\Android.sql
- # 进入 MySQL 全写 和 简写
- MySQL --host=toly1994.com --user=root --port=3306 --password
- MySQL -htoly1994.com -P3306 -uroot -p
- # 退出
quit 或 exit 或 \q
# MySQL 数据库版本
MySQL -V 或 MySQL --version
3.MySQL 的配置文件
my.INI 文件
- [MySQL]
- default-character-set=utf8 # 设置 MySQL 客户端默认字符集
- [mysqld]
- port = 3306 #设置 3306 端口
- basedir=D:B\MySQL-5.7.22-winx64 # 设置 MySQL 的安装目录
- datadir=D:\B\MySQL-5.7.22-winx64\data # 设置 MySQL 数据库的数据的存放目录
- max_connections=200 # 允许最大连接数
- character-set-server=utf8 # 服务端使用的字符集 默认为 8 比特编码的 latin1 字符集
- default-storage-engine=INNODB # 创建新表时将使用的默认存储引擎
- explicit_defaults_for_timestamp=true # 开启查询缓存
- # skip-grant-tables # 无需密码登录 MySQL
4. 忘了密码怎么办
1. net stop MySQL
2. 打开 my.INI 文件 在 [mysqld] 下 添加 skip-grant-tables
3. net start MySQL
4. MySQL -u root -p 回车 回车
- 5. use MySQL
- 6. update user set authentication_string=password("xxxx") where user="root";
- 6. flush privileges;
- 7. quit
8. 将 my.INI 文件的 skip-grant-tables 注释掉
9. 重启服务
5. 其他用法
|--- 修改前面符号
并没有什么实际用处, 就是将 `mysql>` 换一下, 适于装 B 症患者...
MySQL -uroot -p --prompt toly-》
toly-》use zoom
Database changed
toly-》
|--- MySQL 中有内置函数使用
- MySQL> SELECT VERSION(), CURRENT_DATE,NOW(),USER();
- +-----------+--------------+---------------------+----------------+
- | VERSION() | CURRENT_DATE | NOW() | USER() |
- +-----------+--------------+---------------------+----------------+
- | 5.7.22 | 2019-03-15 | 2019-03-15 18:51:12 | root@localhost |
- +-----------+--------------+---------------------+----------------+
|---MySQL 中支持简单计算
- MySQL> SELECT 1+1, (4+1)*5,4/5,5^8;
- +-----+---------+--------+-----+
- | 1+1 | (4+1)*5 | 4/5 | 5^8 |
- +-----+---------+--------+-----+
- | 2 | 25 | 0.8000 | 13 |
- +-----+---------+--------+-----+
二, 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<=M 且 M[0,65535] |
| TINYTEXT | 2-1 | L+1 个字节 | 微型的字符串 |
| TEXT | 2¹-1 | L+2 个字节 | 小型的字符串 |
| MEDIUMTEXT | 2²-1 | L+3 个字节 | 中型的字符串 |
| LONGTEXT | 2³²-1 | L+4 个字节 | 大型的字符串 |
| ENUM | 1 或 2 字节 | 65535 | 枚举 |
| SET | 1,2,3,4 或 8 | 64 | 集合 |
+------------+-------------------+---------------+-----------------------------------+
|---- 时间型 ----|
+-----------+-----------+---------------------------------------------------------------+------------------------------------+
| 类型 | 字节数 | 取值范围 | 描述 |
+-----------+-----------+---------------------------------------------------------------+------------------------------------+
| YEAR | 1 | 1901~2155 | 年 YYYY |
| DATE | 3 | 1000-01-01 ~ 9999-12-31 | 日期 YYYY-MM-DD |
| TIME | 3 | -838:59:59[.000000] ~ 838:59:59[.000000] | 时间 HH:MM:SS |
| DATETIME | 8 | 1000-01-01 00:00:00[.000000] ~ 9999-12-31 23:59:59[.999999] | 日期加时间 YYYY-MM-DD HH:MM:SS |
| TIMESTAMP | 4 | 1970-01-01 00:00:01[.000000] ~ 2038-01-19 03:14:07[.999999] | 时间戳 |
+-----------+-----------+---------------------------------------------------------------+------------------------------------+
|---- 二进制型 ----|
+--------------+-----------------+---------------+--------------------+
| 类型 | 最大字节数 | 最大范围 | 描述 |
+--------------+-----------------+---------------+--------------------+
| BIT(M) | M | (M+7)/8 | 定长字符串 |
| BINARY(M) | M | M | 定长字符串 |
| VARBINARY(M) | M | L+1 或 L+2 | 变长字符串 |
| TINYBLOB | 2-1 | L+1 | 微型的字符串 |
| BLOB | 2¹-1 | L+2 个字节 | 小型的字符串 |
| MEDIUMBLOB | 2²-1 | L+3 个字节 | 中型的字符串 |
| LONGBLOB | 2³²-1 | L+4 个字节 | 大型的字符串 |
+--------------+-----------------+---------------+--------------------+
这里只是简单的列一下, 更多的详情介绍详见此篇: MySQL 入门系列: MySQL 数据类型
三, 其他点
1. 结束符:; \g \G
; \g 效果一样,\G 竖直分布
- 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 | 大整数 |
- +-----------+------+----------------------+----------------+--------------+
- 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
在第三范式的基础上:
[所有属性]对任意 [主属性] 不存在传递性依赖
第四, 第五范式暂不提及, 注意范式并非严格的标准.
可以根据实际情况反范式化来用空间换时间
这篇就到这里, 以后想到什么再加吧.
来源: https://juejin.im/post/5c8c7d7d5188257c5b4786c1