Skip to content

Commit

Permalink
Merge pull request #306 from yangj1211/upd-doc
Browse files Browse the repository at this point in the history
update the moc document to synchronize its content with the mo document.
  • Loading branch information
dengn authored Apr 26, 2024
2 parents a3bf973 + 9972d65 commit 93ba8ee
Show file tree
Hide file tree
Showing 10 changed files with 350 additions and 403 deletions.
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
# FOREIGN KEY 外键约束

FOREIGN KEY 约束可用于在跨表交叉引用相关数据时,保持相关数据的一致性
FOREIGN KEY 外键约束允许表内或跨表交叉引用相关数据,有助于保持相关数据的一致性

**遵循规则**

Expand All @@ -22,9 +22,11 @@ FOREIGN KEY 约束可用于在跨表交叉引用相关数据时,保持相关

**外键特性**

- 外键自引用:是指一个表中的列引用同一个表的主键。这种设计通常用于表示层级关系或父子关系,比如组织结构、分类目录等。

- 多列外键:这种外键是在一个表中两个或更多的列联合起来引用另一个表的主键。也就是说,这些列共同定义了对另一个表的引用。它们必须以组的形式存在,且需要同时满足外键约束。

- 多层外键:这种情况通常涉及到三个或更多的表,并且它们之间存在依赖关系。A 表的主键可以是 B 表的外键,而 B 表的主键又可以是 C 表的外键,形成多层外键的情况。
- 多层外键:这种情况通常涉及到三个或更多的表,并且它们之间存在依赖关系。一个表的外键可以是另一个表的主键,而这个表的外键又可以是第三个表的主键,形成多层外键的情况。

## 语法说明

Expand Down Expand Up @@ -96,7 +98,45 @@ ERROR 20101 (HY000): internal error: Cannot add or update a child row: a foreign

**示例解释**:在上述示例中,t2 的 c 列只能引用 t1 中 a 列的值或空值,因此插入 t2 的前 3 行操作都能够成功插入,但是第 4 行中的 103 并不是 t1 中 a 列的某个值,违反了外键约束,因此插入失败。

### 示例 2 - 多列外键
### 示例 2 - 外键自引用

```sql
-- 创建名为 categories 的表,用于存储商品分类信息
CREATE TABLE categories (
id INT AUTO_INCREMENT PRIMARY KEY,--id 是主键,用于唯一标识每个分类
name VARCHAR(255) NOT NULL,--name 是分类的名称
parent_id INT,
FOREIGN KEY (parent_id) REFERENCES categories(id)--parent_id 是一个外键,它引用了 categories 表中的 id 列
);

--parent_id 列允许我们指定一个分类的父分类。如果没有父分类(即顶级分类),parent_id 可以设置为 NULL。接下来,我们可以插入一些数据来展示这种层级关系:

--插入顶级分类
mysql> INSERT INTO categories (name) VALUES ('Electronics'),('Books');
Query OK, 2 rows affected (0.01 sec)

--插入子分类
mysql> INSERT INTO categories (name, parent_id) VALUES ('Laptops', 1),('Smartphones', 1),('Science Fiction', 2),('Mystery', 2);
Query OK, 4 rows affected (0.01 sec)

mysql> select * from categories;
+------+-----------------+-----------+
| id | name | parent_id |
+------+-----------------+-----------+
| 1 | Electronics | NULL |
| 2 | Books | NULL |
| 3 | Laptops | 1 |
| 4 | Smartphones | 1 |
| 5 | Science Fiction | 2 |
| 6 | Mystery | 2 |
+------+-----------------+-----------+
6 rows in set (0.01 sec)

```

**示例解释**:上述代码中,我们了创建名为 `categories` 的表,用于存储商品分类信息,首先插入了两个顶级分类 `Electronics``Books`。然后,我们为每个顶级分类添加了子分类,比如 `Laptops``Smartphones``Electronics` 的子分类,而 `Science Fiction``Mystery``Books` 的子分类。

### 示例 3 - 多列外键

```sql
-- 创建一个名为"Student"的表,用于存储学生信息
Expand Down Expand Up @@ -125,7 +165,7 @@ CREATE TABLE StudentCourse (

**示例解释**:上述示例中,一个是学生表 (Student),一个是课程表 (Course),还有一个选课表 (StudentCourse) 用于记录哪个学生选择了哪门课程。在这种情况下,选课表中的学生 ID 和课程 ID 可以作为外键,共同引用学生表和课程表的主键。

### 示例 3 - 多层外键
### 示例 4 - 多层外键

```sql
-- 创建一个名为"Country"的表,用于存储国家信息
Expand Down
88 changes: 60 additions & 28 deletions docs/MatrixOne-Cloud/Reference/Data-Types/data-types.md
Original file line number Diff line number Diff line change
@@ -1,9 +1,9 @@
# **数据类型**
# 数据类型

MatrixOne 的数据类型与 MySQL 数据类型的定义一致,可参考:
<https://dev.mysql.com/doc/refman/8.0/en/data-types.html>

## **整数类型**
## 整数类型

| 数据类型 | 存储空间 | 最小值 | 最大值 |
| ---- | ---- | ---- | ---- |
Expand All @@ -16,7 +16,7 @@ MatrixOne 的数据类型与 MySQL 数据类型的定义一致,可参考:
| INT UNSIGNED | 4 byte | 0 | 4294967295 |
| BIGINT UNSIGNED | 8 byte | 0 | 18446744073709551615 |

### **示例**
### 示例

- TINYINT and TINYINT UNSIGNED

Expand Down Expand Up @@ -97,14 +97,14 @@ mysql> select * from inttable;
2 rows in set (0.01 sec)
```

## **浮点类型**
## 浮点类型

| 数据类型 | 存储空间 | 精度 | 最小值 | 最大值 | 语法表示 |
| ---- | ---- | ---- | ---- |---- |---- |
| FLOAT32 | 4 bytes | 23 bits |-3.40282e+038|3.40282e+038| FLOAT(M, D)<br> M 表示的是最大长度,D 表示的显示的小数位数。M 的取值范围为(1=< M <=255)。<br> D 的取值范围为(1=< D <=30),且 M >= D。<br> 带精度的浮点数展示出要求精度的位数,在位数不足时,会进行末尾补 0。|
| FLOAT64 | 8 bytes | 53 bits |-1.79769e+308|1.79769e+308| DOUBLE(M, D) <br> M 表示的是最大长度,D 表示的显示的小数位数。M 的取值范围为(1=< M <=255)。<br> D 的取值范围为(1=< D <=30),且 M >= D。<br> 带精度的浮点数展示出要求精度的位数,在位数不足时,会进行末尾补 0。|

### **示例**
### 示例

```sql
-- Create a table named "floatt1" with precision, a trailing zero is added when the number of bits falls short
Expand Down Expand Up @@ -145,7 +145,7 @@ mysql> select min(big),max(big),max(big)-1 from floattable;
1 row in set (0.05 sec)
```

## **字符串类型**
## 字符串类型

| 数据类型 | 存储空间 | 长度 | 语法表示 | 描述|
| ---- | ---- | --- | ---- |---- |
Expand All @@ -157,7 +157,7 @@ mysql> select min(big),max(big),max(big)-1 from floattable;
| blob | 1 GB | other types mapping |BLOB|二进制的长文本数据,不区分 TINY BLOB、MEDIUM BLOB 和 LONGBLOB|
| enum | 1 byte 或 2 bytes | 0 ~ 65535 | enum | 一个枚举类型。它是一个字符串对象,只能从 `value1``value2` 等值列表中选择一个值,或者是 `NULL` 或特殊的 '' 错误值。枚举值在内部表示为整数。 |

### **示例**
### 示例

- CHAR 和 VARCHAR

Expand Down Expand Up @@ -262,14 +262,14 @@ mysql> SELECT * FROM enumtest WHERE color = 'green';
1 row in set (0.01 sec)
```

## **JSON 数据类型**
## JSON 数据类型

|JSON 数据类型 | 解释 |
|---|---|
|对象 |对象使用 `{}` 括起来,元素之间用 `,` 分隔。JSON 对象中的值/键可以为 String、Nubmber、Bool、时间。|
|数组 | 数组使用 `[]` 括起来,元素之间用逗号 `,` 分隔。JSON 数组中值可以为 String、Nubmber、Bool、时间。|

### **示例**
### 示例

```sql
-- Create a table named "jsontest" with 1 attribute of a "json"
Expand All @@ -286,51 +286,60 @@ mysql> select * from jsontest;
2 rows in set (0.01 sec)
```

## **时间与日期**
## 时间与日期类型

| 数据类型 | 存储空间 | 精度 | 最小值 | 最大值 | 语法表示 |
| ---- | ---- | ---- | ---- | ---- | ---- |
| Time | 8 byte | microsecond | -2562047787:59:59.999999 | 2562047787:59:59.999999 | hh:mm:ss.ssssss |
| Time | 8 byte | microsecond | -2562047787:59:59.999999 | 2562047787:59:59.999999 | hh:mm:ss.ssssss |
| Date | 4 byte | day | 0001-01-01 | 9999-12-31 | YYYY-MM-DD/YYYYMMDD |
| DateTime | 8 byte | microsecond | 0001-01-01 00:00:00.000000 | 9999-12-31 23:59:59.999999 | YYYY-MM-DD hh:mi:ssssss |
| TIMESTAMP|8 byte|microsecond|0001-01-01 00:00:00.000000|9999-12-31 23:59:59.999999|YYYYMMDD hh:mi:ss.ssssss|

### **示例**
时间与日期部分类型支持在插入数据时添加以下 hint 值:

- `Time`:{t 'xx'},{time 'xx'}

- `Date`:{d 'xx'},{date 'xx'}

- `TIMESTAMP`:{ts 'xx'},{timestamp 'xx'}

### 示例

- TIME

```sql
-- Create a table named "timetest" with 1 attributes of a "time"
create table time_02(t1 time);
insert into time_02 values(200);
insert into time_02 values("");
insert into time_02 values(200),(time'23:29:30'),({t'12:11:12'}),('');

mysql> select * from time_02;
+----------+
| t1 |
+----------+
| 00:02:00 |
| 23:29:30 |
| 12:11:12 |
| NULL |
+----------+
2 rows in set (0.00 sec)
4 rows in set (0.01 sec)
```

- DATE

```sql
-- Create a table named "datetest" with 1 attributes of a "date"
create table datetest (a date not null, primary key(a));
insert into datetest values ('2022-01-01'), ('20220102'),('2022-01-03'),('20220104');

mysql> select * from datetest order by a asc;
insert into datetest values ({d'2022-01-01'}), ('20220102'),(date'2022-01-03'),({d now()});
mysql> select * from datetest;
+------------+
| a |
+------------+
| 2022-01-01 |
| 2022-01-02 |
| 2022-01-03 |
| 2022-01-04 |
| 2024-03-19 |
+------------+
4 rows in set (0.00 sec)
```

- DATETIME
Expand All @@ -357,27 +366,28 @@ mysql> select * from datetimetest order by a asc;
```sql
-- Create a table named "timestamptest" with 1 attribute of a "timestamp"
create table timestamptest (a timestamp(0) not null, primary key(a));
insert into timestamptest values ('20200101000000'), ('2022-01-02'), ('2022-01-02 00:00:01'), ('2022-01-02 00:00:01.512345');
insert into timestamptest values ('20200101000000'), (timestamp'2022-01-02 11:30:40'), ({ts'2022-01-02 00:00:01'}), ({ts current_timestamp});

mysql> select * from timestamptest;
+---------------------+
| a |
+---------------------+
| 2020-01-01 00:00:00 |
| 2022-01-02 00:00:00 |
| 2022-01-02 11:30:40 |
| 2022-01-02 00:00:01 |
| 2022-01-02 00:00:02 |
| 2024-03-19 17:22:08 |
+---------------------+
4 rows in set (0.00 sec)
```

## **Bool**
## Bool 类型

| 数据类型 | 存储空间 |
| ---- | ---- |
| True | 1 byte |
|False|1 byte|

### **示例**
### 示例

```sql
-- Create a table named "booltest" with 2 attribute of a "boolean" and b "bool"
Expand All @@ -397,14 +407,14 @@ mysql> select * from booltest;
5 rows in set (0.00 sec)
```

## **定点类型 Decimal**
## 定点类型 Decimal

| 数据类型 | 存储空间 | 精度 | 语法表示 |
| ---- | ---- | ---- | ---- |
| Decimal64 | 8 byte | 18 位 | Decimal(N,S) <br> N 表示数字位数的总数,范围是 (1 ~ 18),小数点和 -(负数)符号不包括在 N 中。<br>如果 N 被省略,默认值应该取最大,即取值 18。<br>S 表示是小数点(标度)后面的位数,范围是 (0 ~ N)<br>如果 S 是 0,则值没有小数点或分数部分。如果 S 被省略,默认是 0,例如 Decimal(10),等同于 Decimal(10, 0) <br>例如 Decimal(10,8),即表示数字总长度为 10,小数位为 8。|
| Decimal128 | 16 byte | 38 位 | Decimal(N,S) <br> N 表示数字位数的总数,范围是 (18 ~ 38),小数点和 -(负数)符号不包括在 N 中。<br>如果 N 被省略,默认值应该取最大,即取值 38。<br>S 表示是小数点(标度)后面的位数,范围是 (0 ~ N)<br>如果 S 是 0,则值没有小数点或分数部分。如果 S 被省略,默认是 0,例如 Decimal(20),等同于 Decimal(20, 0)。<br>例如 Decimal(20,19),即表示数字总长度为 20,小数位为 19。 |

### **示例**
### 示例

```sql
-- Create a table named "decimalTest" with 2 attribute of a "decimal" and b "decimal"
Expand All @@ -420,13 +430,13 @@ mysql> select * from decimalTest;
1 row in set (0.01 sec)
```

## **UUID 类型**
## UUID 类型

|UUID 类型 | 解释 |
|---|---|
|[UUID](uuid-type.md) | 由 32 个 16 进制数字和 4 个连字符‘-’组成 UUID 值,形式为 8-4-4-4-12,标准的 UUID 示例:`a0eebc99-9c0b-4ef8-bb6d-6bb9bd380a11`|

### **示例**
### 示例

```sql
-- 创建一个名为 't1' 的新表,并设置 'a' 列为 UUID 类型,同时将 'a' 列设置为主键
Expand All @@ -453,3 +463,25 @@ mysql> select * from t1;
+--------------------------------------+
1 row in set (0.00 sec)
```

## 向量数据类型

|类型 | 解释 |
|------------|--------------------- |
|vecf32 | 向量列类型为 float32 |
|vecf64 | 向量列类型为 float64 |

### 示例

```sql
create table t1(n1 vecf32(3), n2 vecf64(2));
insert into t1 values("[1,2,3]",'[4,5]');

mysql> select * from t1;
+-----------+--------+
| n1 | n2 |
+-----------+--------+
| [1, 2, 3] | [4, 5] |
+-----------+--------+
1 row in set (0.00 sec)
```
Original file line number Diff line number Diff line change
Expand Up @@ -2,38 +2,46 @@

## **函数说明 n**

`COUNT()` 是聚合函数的一种,计算了查询结果的记录数`NULL` 值不参与统计)
`COUNT()` 是聚合函数的一种,计算了查询结果的记录数,结果是一个 BIGINT 值。当没有匹配的行或 `COUNT(NULL)` 时返回 0

## **函数语法**

```
> COUNT(expr)
```

***
```
> COUNT(distinct column)
```

## **参数释义**

| 参数 | 说明 |
| ---- | ---- |
| expr | 任何查询结果,既可以是列名,也可以是一个函数或者数学运算的结果。也可以使用`*`,直接统计行数。|

## **返回值**

返回查询结果中 `expr` 列的 `NOT NULL` 的值的个数,返回数据类型为 `BIGINT`
如果没有匹配的行,将返回 0。
<table>
<tr>
<th>参数</th>
<th>说明</th>
</tr>
<tr>
<td >expr</td>
<td>任何查询结果,既可以是列名,也可以是一个函数或者数学运算的结果。当不带 distinct 参数时也可以使用 `*`,直接统计行数</td>
</tr>
<tr>
<td nowrap>distinct column</td>
<td>对列中重复值去重。</td>
</tr>
</table>

## **示例**

```sql
> drop table if exists tbl1,tbl2;
> create table tbl1 (col_1a tinyint, col_1b smallint, col_1c int, col_1d bigint, col_1e char(10) not null);
> insert into tbl1 values (0,1,1,7,"a");
> insert into tbl1 values (0,1,2,8,"b");
> insert into tbl1 values (0,1,3,9,"c");
> insert into tbl1 values (0,1,4,10,"D");
> insert into tbl1 values (0,1,5,11,"a");
> insert into tbl1 values (0,1,6,12,"c");
drop table if exists tbl1,tbl2;
create table tbl1 (col_1a tinyint, col_1b smallint, col_1c int, col_1d bigint, col_1e char(10) not null);
insert into tbl1 values (0,1,1,7,"a");
insert into tbl1 values (0,1,2,8,"b");
insert into tbl1 values (0,1,3,9,"c");
insert into tbl1 values (0,1,4,10,"D");
insert into tbl1 values (0,1,5,11,"a");
insert into tbl1 values (0,1,6,12,"c");

> select count(col_1b) from tbl1;
+---------------+
Expand All @@ -48,4 +56,11 @@
+----------+
| 3 |
+----------+

mysql> select count(distinct col_1b) from tbl1;
+------------------------+
| count(distinct col_1b) |
+------------------------+
| 1 |
+------------------------+
```
Loading

0 comments on commit 93ba8ee

Please sign in to comment.