提交 d2ed176e 编写于 作者: M Mars Liu

add six exercises

上级 3bb28dda
......@@ -2,5 +2,9 @@
"node_id": "pg-806d3976e8764d4f8e26c197c53d45a8",
"keywords": [],
"children": [],
"export": []
"export": [
"table.json",
"create_table.json",
"serial.json"
]
}
\ No newline at end of file
{
"type": "code_options",
"author": "刘鑫",
"source": "create_table.md",
"notebook_enable": false
}
\ No newline at end of file
# 建表语句
现在我们尝试建立一个简化的交易流水表 trade,需要一个自增主键,一个content字段保存订单详情,,
需要有一个时间戳字段记录订单入库时间,那么哪一个语句是对的?
## 答案
```postgresql
create table trade (
id serial primary key,
content text,
created_at timestamp default now()
);
```
## 选项
### 主键没有设置自增,不符合题意
```postgresql
create table trade (
id integer primary key,
content text,
created_at timestamp default now()
);
```
### 时间戳没有设置默认值
```postgresql
create table trade (
id serial primary key,
content text,
created_at timestamp
);
```
### 没有主键,不符合题设
```postgresql
create table trade (
id serial,
content text,
created_at timestamp default now()
);
```
\ No newline at end of file
{
"type": "code_options",
"author": "刘鑫",
"source": "serial.md",
"notebook_enable": false
}
\ No newline at end of file
# 自增序列
PostgreSQL 表中的自增列 serial 的底层实现机制是:
## 答案
绑定 sequence 对象的表达式默认值
### 选项
### PG 采用的是独立的序列器,不依赖表
auto increment 计数器
### B
触发器
### C
系统表
{
"type": "code_options",
"author": "刘鑫",
"source": "table.md",
"notebook_enable": false
}
\ No newline at end of file
# 表的基本结构
关于数据表的介绍,哪一句是对的?
## 答案
表中每一行记录的结构都要遵循表定义。
## 选项
### 虽然不推荐,但是可以没有主键
表一定要有主键
### 表的主键是任意可以建立唯一索引的字段组合
表的主键必须是自增的整数 id
### 索引可以不唯一
索引列的内容是唯一的
### 虽然不推荐,索引、唯一约束都可以不止一个
每个表只能有一个索引
......@@ -2,5 +2,5 @@
"node_id": "pg-f371b91ef63a4ce08f80b92bc8580196",
"keywords": [],
"children": [],
"export": []
"export": ["function.json"]
}
\ No newline at end of file
{
"type": "code_options",
"author": "刘鑫",
"source": "function.md",
"notebook_enable": false
}
\ No newline at end of file
# 函数
关于 PostgreSQL 函数,错误的是:
## 答案
函数必须是无副作用的
## 选项
### A
函数可以用 SQL 写,也可以用 PLPGSQL,还可以用 Python、Perl、LUA等语言。
### B
函数的参数和返回值可以是简单变量,也可以是结果集或自定义类型
### C
函数可以递归引用
### D
函数之间可以互相引用
### E
函数的使用权限可以通过 grant/revoke/deny 管理
{
"type": "code_options",
"author": "刘鑫",
"source": "to_root.md",
"notebook_enable": false
}
\ No newline at end of file
# 树结构溯根
现有一个表 node
```postgresql
create table node
(
id serial primary key,
pid integer,
content text
);
```
其 pid 列引用 id 列,形成一个树结构,根节点的 pid 为 0。
现在我们希望写一个查询,找到某一个给定id的记录,其父节点、父节点的父节点,直至根节点的路径。那么这个查询应该是:
## 答案
```postgresql
with recursive t(id, pid, content) as (select id, pid, content
from node
where id = $1
union all
select node.id, node.pid, node.level
from node
join t on node.id = t.pid)
select node.id, node.pid, content
from node
join t on node.id = t.id;
```
## 选项
### 没有递归定义
```postgresql
with t as (select id, pid, content
from node
where id = $1
union all
select node.id, node.pid, node.level
from node
join t on node.id = t.pid)
select node.id, node.pid, content
from node
join t on node.id = t.id;
```
### 平凡的连接查询无法处理递归问题
```postgresql
select node.id, node.pid, node.content
from node
join node as p on node.pid = p.id
where id=$1;
```
### 子查询无法处理递归问题
```postgresql
select node.id, node.pid, node content
from node as t
where t.pid = (select id from t where id=t.pid)
```
\ No newline at end of file
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册