Verified Commit 6175bc16 authored by Kiryuu Sakuya's avatar Kiryuu Sakuya 🎵
Browse files

Hello World

parent 544f6d30
# 给 MariaDB 设置 UTF-8
## 为什么?
因为 MySQL / MariaDB 的 UTF-8 是假 UTF-8。
> The “utf8” encoding only supports three bytes per character. The real UTF-8 encoding — which everybody uses, including you — needs up to four bytes per character.
## 设置
> 以 Linux 系统为例
关闭 MariaDB,打开 `/etc/my.cnf`,输入以下代码:
```
[client]
default-character-set = utf8mb4
[mysql]
default-character-set = utf8mb4
[mysqld]
init-connect='SET NAMES utf8mb4'
character-set-client-handshake = FALSE
character-set-server = utf8mb4
collation-server = utf8mb4_unicode_ci
```
然后启动 MariaDB,输入 `show variables like "%character%";show variables like "%collation%";`
这时看看是否 `character_set_client`, `character_set_connection``character_set_database` 为 utf8mb4。
如果是的话,那么退出 MariaDB,将以前的表进行自动转换:
```
mysqlcheck -u root -p --auto-repair --optimize --all-databases
```
当然,你也可以手动转换:
```
# For each database:
ALTER DATABASE database_name CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci;
# For each table:
ALTER TABLE table_name CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
# For each column:
ALTER TABLE table_name CHANGE column_name column_name VARCHAR(191) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
# (Don’t blindly copy-paste this! The exact statement depends on the column type, maximum length, and other properties. The above line is just an example for a `VARCHAR` column.)
# 给 MariaDB 设置 UTF-8
## 为什么?
因为 MySQL / MariaDB 的 UTF-8 是假 UTF-8。
> The “utf8” encoding only supports three bytes per character. The real UTF-8 encoding — which everybody uses, including you — needs up to four bytes per character.
## 设置
> 以 Linux 系统为例
关闭 MariaDB,打开 `/etc/my.cnf`,输入以下代码:
```
[client]
default-character-set = utf8mb4
[mysql]
default-character-set = utf8mb4
[mysqld]
init-connect='SET NAMES utf8mb4'
character-set-client-handshake = FALSE
character-set-server = utf8mb4
collation-server = utf8mb4_unicode_ci
```
然后启动 MariaDB,输入 `show variables like "%character%";show variables like "%collation%";`
这时看看是否 `character_set_client`, `character_set_connection``character_set_database` 为 utf8mb4。
如果是的话,那么退出 MariaDB,将以前的表进行自动转换:
```
mysqlcheck -u root -p --auto-repair --optimize --all-databases
```
当然,你也可以手动转换:
```
# For each database:
ALTER DATABASE database_name CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci;
# For each table:
ALTER TABLE table_name CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
# For each column:
ALTER TABLE table_name CHANGE column_name column_name VARCHAR(191) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
# (Don’t blindly copy-paste this! The exact statement depends on the column type, maximum length, and other properties. The above line is just an example for a `VARCHAR` column.)
```
\ No newline at end of file
# 实验三
## 名词解释
> Constraint 是约束的意思
约束实际上就是表中数据的限制条件。比如 name 字段中要让其用户名不重复,这就需要添加约束。或者,注册的时候必须要添加邮箱,这也是约束。
### 主键约束
> 即 Primary Key
- 每个表中只能有一个主键。
- 主键值须非空不重复。
- 可设置单字段主键,也可设置多字段联合主键。
- 联合主键中多个字段的数据完全相同时,才违反主键约束。
例如在表级添加主键约束:
```mysql
create table <表名>(
<字段名1> <字段类型1>,
<字段名2> <字段类型2>,
......
<字段名n> <字段类型n>,
[constraint 主键约束名] primary key(字段名1[,字段名2,...字段名n]));
```
已有表添加主键约束:
```mysql
alter table <表名> add [constraint 主键约束名] primary key(字段名);
# 创建无主键约束的表
mysql> create table employee(
-> e_id int,
-> e_name varchar(5),
-> e_sex varchar(5),
-> e_age int,
-> d_id int);
# 添加主键约束
mysql> alter table employee add primary key(e_id);
```
删除主键约束:
```mysql
alter table <表名> drop primary key;
```
### 唯一约束
> 即 Unique
在列表添加唯一约束:
```mysql
create table <表名> (
<字段名1> <字段类型1>,
<字段名2> <字段类型2>,
......
<字段名n> <字段类型n>,
[constraint 唯一约束名] unique (字段名1[,字段名2...字段名n]));
```
### 外键约束
> 即 Foreign Key
#### 外键是什么?
若有两个表 A、B,id 是 A 的主键,而 B 中也有 id 字段,则 id 就是表 B 的外键,外键约束主要用来维护两个表之间数据的一致性。
某个字段添加**外键约束**之后,该字段称为**外键字段**,外键字段中每个数据都是**外键值**
- 外键值可以为 null。
- 外键字段去引用一张表的某个字段的时候,被引用的字段必须具有 unique 约束。
- 有了外键引用之后,表分为父表和子表(在上述假设 A 为班级表,B 为学生表,那么 A 为父表,B 为字表)
- 创建先创建父表,删除先删除子表数据,插入先插入父表数据
外键约束为某一表中某字段的值依赖于另一张表中某字段的值。主键所在的表为主表,外键所在的表为从表;每一个外键值必须与另一个表中的主键值相对应。
```mysql
# 创建一个主表
mysql> create table department(
-> d_id int primary key,
-> d_name varchar(5),
-> d_num int);
# 创建从表的同时添加外键
mysql> create table employee(
-> e_id int primary key,
-> e_name varchar(5),
-> e_sex varchar(5),
-> e_age int,
-> d_id int,
-> foreign key(d_id) references department(d_id));
# 即 [constraint 外键约束名] foreign key(字段名) references <主表>(主键字段)
```
### 检查约束
> 即 Check
用于指定需要检查的限定条件。
```mysql
# 用法是 check(<限定条件>),例如检查年龄大于 0
mysql> create table employee(
-> e_id int primary key,
-> e_name varchar(5),
-> e_sex varchar(5),
-> e_age int,
-> d_id int,
-> check(e_age>=0));
# 在已有添加则为 alter table <表名> add constraint <检查约束名> check(<限定条件>);
```
## 预想的表结构
根据实验二的表情况,我们应进行以下操作:
- `employee`
-`emp_no` 字段设置为主键约束,同时 `sales` 表内的 `sale_id` 字段设置为外键约束
- 添加检查约束,规定 `emp_sex` 字段只能是 `男``女``NaN`
- `customer`
-`cust_id` 字段设置为主键约束,同时 `sales` 表内的 `cust_id` 字段设置为外键约束
- `sales`
- **虽然 `order_no` 是主键约束,但是因为我们在 `sale_item` 这个表内建立了约束,无需再建立**
-`order_date` 字段与 `sale_item` 表内的 `order_date` 字段联系并将后者设置为外键约束
- 这里加是没有意义的行为,而且本身不能用 datetime 来存储时间——应该用 Unix 时间戳来存储
- 添加唯一约束,应用在 `invoice_no` 字段
- `sale_item`
-`order_no` 字段设置为主键约束,同时 `sales` 表内的 `order_no` 字段设置为外键约束
- `product`
-`prod_id` 字段设置为主键约束,同时 `sale_item` 表内的 `prod_id` 字段设置为外键约束
### 示例代码
#### `employee` 表
1. 主键约束已设置
```mysql
# alter table <表名> add [constraint 主键约束名] primary key(字段名);
ALTER TABLE employee ADD PRIMARY KEY (emp_no);
```
2. 外键约束
```mysql
# 没错,是从外键连回主键
ALTER TABLE sales ADD FOREIGN KEY (sale_id) REFERENCES employee(emp_no);
```
3. 检查约束
```mysql
# alter table <表名> add constraint <检查约束名> check(<限定条件>);
ALTER TABLE employee ADD CONSTRAINT Check_Sex CHECK (emp_sex IN ("男", "女", "NaN"));
# 两个的话可以用 AND 或 OR?
```
##### Bonus time!
比如,检查编号是否为五位数
```mysql
ALTER TABLE employee ADD CHECK(emp_no RLIKE "[0-9][0-9][0-9][0-9][0-9]");
```
如果用 REGEX 的话就是
```mysql
ALTER TABLE employee ADD CONSTRAINT CHECK (emp_no REGEXP '\\d{5}');
```
或者,输入的编号必须以 E 开头的 5 位数编号
```mysql
ALTER TABLE employee ADD CHECK(emp_no RLIKE "[E][0-9][0-9][0-9][0-9][0-9]");
```
其它有趣的
```
mail LIKE "[^0-9]%[@][q][q][.][c][o][m]"
检查邮箱,表示第一个字符不允许是数字,第一个字符与@符号之间是任意字符。后面是固定格式
一些正则表达式:
'_' 为一个字符,比如 A Like "C_"
% 表示任意长度的字符串,比如 B Like "CO_%"
[] 表示括号中所指定范围内的一个字符,比如 C Like "9W0[1-2]"
[^] 表示不在括号中所指定范围内的一个字符,比如 D Like "%[A-D][^1-2]"
```
#### `customer` 表
1. 主键约束已设置
```mysql
ALTER TABLE customer ADD PRIMARY KEY (cust_id);
```
2. 外键约束
```mysql
ALTER TABLE sales ADD FOREIGN KEY (cust_id) REFERENCES customer(cust_id);
```
#### `sales` 表
1. 主键约束已设置
```mysql
ALTER TABLE sales ADD PRIMARY KEY (order_no);
```
2. 外键约束
> 理论上,但行不通。
```mysql
ALTER TABLE sale_item ADD FOREIGN KEY (order_date) REFERENCES sales(order_date);
```
3. 唯一约束
```mysql
# alter table <表名> add [constraint 唯一约束名] unique (字段名);
ALTER TABLE sales ADD UNIQUE(invoice_no);
```
#### `sale_item` 表
外键约束
```mysql
ALTER TABLE sales ADD FOREIGN KEY (order_no) REFERENCES sale_item(order_no);
```
如果输入错误
```mysql
ALTER TABLE sale_item DROP FOREIGN KEY (order_no);
```
#### `product` 表
外键约束
```mysql
ALTER TABLE sale_item ADD FOREIGN KEY (prod_id) REFERENCES product(prod_id);
```
## 其它
找两个表中的不同项
```mysql
SELECT order_no from sale_item where order_date NOT IN (SELECT order_date from sales);
# 实验三
## 名词解释
> Constraint 是约束的意思
约束实际上就是表中数据的限制条件。比如 name 字段中要让其用户名不重复,这就需要添加约束。或者,注册的时候必须要添加邮箱,这也是约束。
### 主键约束
> 即 Primary Key
- 每个表中只能有一个主键。
- 主键值须非空不重复。
- 可设置单字段主键,也可设置多字段联合主键。
- 联合主键中多个字段的数据完全相同时,才违反主键约束。
例如在表级添加主键约束:
```mysql
create table <表名>(
<字段名1> <字段类型1>,
<字段名2> <字段类型2>,
......
<字段名n> <字段类型n>,
[constraint 主键约束名] primary key(字段名1[,字段名2,...字段名n]));
```
已有表添加主键约束:
```mysql
alter table <表名> add [constraint 主键约束名] primary key(字段名);
# 创建无主键约束的表
mysql> create table employee(
-> e_id int,
-> e_name varchar(5),
-> e_sex varchar(5),
-> e_age int,
-> d_id int);
# 添加主键约束
mysql> alter table employee add primary key(e_id);
```
删除主键约束:
```mysql
alter table <表名> drop primary key;
```
### 唯一约束
> 即 Unique
在列表添加唯一约束:
```mysql
create table <表名> (
<字段名1> <字段类型1>,
<字段名2> <字段类型2>,
......
<字段名n> <字段类型n>,
[constraint 唯一约束名] unique (字段名1[,字段名2...字段名n]));
```
### 外键约束
> 即 Foreign Key
#### 外键是什么?
若有两个表 A、B,id 是 A 的主键,而 B 中也有 id 字段,则 id 就是表 B 的外键,外键约束主要用来维护两个表之间数据的一致性。
某个字段添加**外键约束**之后,该字段称为**外键字段**,外键字段中每个数据都是**外键值**
- 外键值可以为 null。
- 外键字段去引用一张表的某个字段的时候,被引用的字段必须具有 unique 约束。
- 有了外键引用之后,表分为父表和子表(在上述假设 A 为班级表,B 为学生表,那么 A 为父表,B 为字表)
- 创建先创建父表,删除先删除子表数据,插入先插入父表数据
外键约束为某一表中某字段的值依赖于另一张表中某字段的值。主键所在的表为主表,外键所在的表为从表;每一个外键值必须与另一个表中的主键值相对应。
```mysql
# 创建一个主表
mysql> create table department(
-> d_id int primary key,
-> d_name varchar(5),
-> d_num int);
# 创建从表的同时添加外键
mysql> create table employee(
-> e_id int primary key,
-> e_name varchar(5),
-> e_sex varchar(5),
-> e_age int,
-> d_id int,
-> foreign key(d_id) references department(d_id));
# 即 [constraint 外键约束名] foreign key(字段名) references <主表>(主键字段)
```
### 检查约束
> 即 Check
用于指定需要检查的限定条件。
```mysql
# 用法是 check(<限定条件>),例如检查年龄大于 0
mysql> create table employee(
-> e_id int primary key,
-> e_name varchar(5),
-> e_sex varchar(5),
-> e_age int,
-> d_id int,
-> check(e_age>=0));
# 在已有添加则为 alter table <表名> add constraint <检查约束名> check(<限定条件>);
```
## 预想的表结构
根据实验二的表情况,我们应进行以下操作:
- `employee`
-`emp_no` 字段设置为主键约束,同时 `sales` 表内的 `sale_id` 字段设置为外键约束
- 添加检查约束,规定 `emp_sex` 字段只能是 `男``女``NaN`
- `customer`
-`cust_id` 字段设置为主键约束,同时 `sales` 表内的 `cust_id` 字段设置为外键约束
- `sales`
- **虽然 `order_no` 是主键约束,但是因为我们在 `sale_item` 这个表内建立了约束,无需再建立**
-`order_date` 字段与 `sale_item` 表内的 `order_date` 字段联系并将后者设置为外键约束
- 这里加是没有意义的行为,而且本身不能用 datetime 来存储时间——应该用 Unix 时间戳来存储
- 添加唯一约束,应用在 `invoice_no` 字段
- `sale_item`
-`order_no` 字段设置为主键约束,同时 `sales` 表内的 `order_no` 字段设置为外键约束
- `product`
-`prod_id` 字段设置为主键约束,同时 `sale_item` 表内的 `prod_id` 字段设置为外键约束
### 示例代码
#### `employee` 表
1. 主键约束已设置
```mysql
# alter table <表名> add [constraint 主键约束名] primary key(字段名);
ALTER TABLE employee ADD PRIMARY KEY (emp_no);
```
2. 外键约束
```mysql
# 没错,是从外键连回主键
ALTER TABLE sales ADD FOREIGN KEY (sale_id) REFERENCES employee(emp_no);
```
3. 检查约束
```mysql
# alter table <表名> add constraint <检查约束名> check(<限定条件>);
ALTER TABLE employee ADD CONSTRAINT Check_Sex CHECK (emp_sex IN ("男", "女", "NaN"));
# 两个的话可以用 AND 或 OR?
```
##### Bonus time!
比如,检查编号是否为五位数
```mysql
ALTER TABLE employee ADD CHECK(emp_no RLIKE "[0-9][0-9][0-9][0-9][0-9]");
```
如果用 REGEX 的话就是
```mysql
ALTER TABLE employee ADD CONSTRAINT CHECK (emp_no REGEXP '\\d{5}');
```
或者,输入的编号必须以 E 开头的 5 位数编号
```mysql
ALTER TABLE employee ADD CHECK(emp_no RLIKE "[E][0-9][0-9][0-9][0-9][0-9]");
```
其它有趣的
```
mail LIKE "[^0-9]%[@][q][q][.][c][o][m]"
检查邮箱,表示第一个字符不允许是数字,第一个字符与@符号之间是任意字符。后面是固定格式
一些正则表达式:
'_' 为一个字符,比如 A Like "C_"
% 表示任意长度的字符串,比如 B Like "CO_%"
[] 表示括号中所指定范围内的一个字符,比如 C Like "9W0[1-2]"
[^] 表示不在括号中所指定范围内的一个字符,比如 D Like "%[A-D][^1-2]"
```
#### `customer` 表
1. 主键约束已设置
```mysql
ALTER TABLE customer ADD PRIMARY KEY (cust_id);
```
2. 外键约束
```mysql
ALTER TABLE sales ADD FOREIGN KEY (cust_id) REFERENCES customer(cust_id);
```
#### `sales` 表
1. 主键约束已设置
```mysql
ALTER TABLE sales ADD PRIMARY KEY (order_no);
```
2. 外键约束
> 理论上,但行不通。
```mysql
ALTER TABLE sale_item ADD FOREIGN KEY (order_date) REFERENCES sales(order_date);
```
3. 唯一约束
```mysql
# alter table <表名> add [constraint 唯一约束名] unique (字段名);
ALTER TABLE sales ADD UNIQUE(invoice_no);
```
#### `sale_item` 表
外键约束
```mysql
ALTER TABLE sales ADD FOREIGN KEY (order_no) REFERENCES sale_item(order_no);
```
如果输入错误
```mysql
ALTER TABLE sale_item DROP FOREIGN KEY (order_no);
```
#### `product` 表
外键约束
```mysql
ALTER TABLE sale_item ADD FOREIGN KEY (prod_id) REFERENCES product(prod_id);
```
## 其它
找两个表中的不同项
```mysql
SELECT order_no from sale_item where order_date NOT IN (SELECT order_date from sales);
```
\ No newline at end of file
......@@ -136,10 +136,11 @@ INSERT INTO customer (
| 11035462019090923452228404 | 100008 | 20002 | 35 | 2019-09-09 23:45:22 | 2019-09-10 00:00:00 | 34600366 |
| 11035462019091021342023750 | 100009 | 20002 | 89 | 2019-09-10 21:34:20 | 2019-09-11 09:11:32 | 34600368 |
| 11035462019091109080728562 | 100010 | 20002 | 50 | 2019-09-11 09:08:07 | 2019-09-11 12:06:22 | 34600370 |
| 11035462019111100000029425 | 100008 | 20001 | 50 | 2019-11-11 00:00:01 | 2019-11-11 10:30:22 | 34600372 |
| 11035462019111100000036455 | 100011 | 20002 | 350 | 2019-11-11 00:00:00 | 2019-11-11 08:11:43 | 34600374 |
| 11035462019111100000029425 | 100008 | 20001 | 350 | 2019-11-11 00:00:00 | 2019-11-11 10:30:22 | 34600372 |
| 11035462019111100000036455 | 100011 | 20002 | 29 | 2019-11-11 00:00:00 | 2019-11-11 08:11:43 | 34600374 |
| 11035462019111100000020957 | 100012 | 20002 | 1 | 2019-11-11 00:00:00 | 2019-11-11 08:11:43 | 34600376 |
| 11035462019111100000123945 | 100013 | 20001 | 29 | 2019-11-11 00:00:00 | 2019-11-11 10:30:22 | 34600378 |
| 11035462019111100000123945 | 100013 | 20001 | 50 | 2019-11-11 00:00:01 | 2019-11-11 10:30:22 | 34600378 |
#### 示例代码
......@@ -149,7 +150,7 @@ INSERT INTO sales (
) VALUE (
"11035462019090116054034524", "100000", "20001", "56.5", "2019-09-01 16:05:40", "2019-09-01 18:23:02", "34600350"
), (
"11035462019090211345678134", "100001", "20002", "2510", "2019-09-02 11:34:56", "2019-09-04 13:01:22", "34600352"
"11035462019090211345678134", "100001", "20002", "502", "2019-09-02 11:34:56", "2019-09-04 13:01:22", "34600352"
), (
"11035462019090312553243345", "100002", "20001", "70", "2019-09-03 12:55:32", "2019-09-03 15:05:23", "34600354"
), (
......@@ -169,13 +170,13 @@ INSERT INTO sales (
), (
"11035462019091109080728562", "100010", "20002", "50", "2019-09-11 09:08:07", "2019-09-11 12:06:22", "34600370"
), (
"11035462019111100000029425", "100008", "20001", "50", "2019-11-11 00:00:01", "2019-11-11 10:30:22", "34600372"
"11035462019111100000029425", "100008", "20001", "350", "2019-11-11 00:00:00", "2019-11-11 10:30:22", "34600372"
), (
"11035462019111100000036455", "100011", "20002", "350", "2019-11-11 00:00:00", "2019-11-11 08:11:43", "34600374"
"11035462019111100000036455", "100011", "20002", "1", "2019-11-11 00:00:00", "2019-11-11 08:11:43", "34600374"