

逐题详细解析
第1题:查询预计入住天数大于3天的订单信息
SELECT bno, rno, bdate, rooms, pdate, days, flag
FROM tb_booking
WHERE days > 3;
解析:
- SELECT:选择需要显示的字段
bno:预订单号rno:客房类型编号bdate:预订日期rooms:预订数量pdate:预计入住时间days:预计入住天数flag:预订状态代码- FROM tb_booking:从预订信息表中查询
- WHERE days > 3:筛选条件,预计入住天数大于3天
注意事项:
- 字段名要与表结构一致(题目中预订信息表为
tb_booking) - 条件
days > 3使用比较运算符
第2题:向客户信息表插入记录
INSERT INTO tb_customers (cno, cname, teleNo)
VALUES ('c104', '李康', '139645862');
解析:
- INSERT INTO:插入数据到指定表
- tb_customers:客户信息表
- (cno, cname, teleNo):指定要插入的字段
- VALUES:指定字段对应的值
'c104':客户编号'李康':客户姓名'139645862':电话
注意事项:
- 字符型数据必须用引号括起来
- 字段顺序与 VALUES 中的值顺序一一对应
- 如果表中有其他字段且有默认值,可以省略
简化写法(如果插入所有字段):
INSERT INTO tb_customers VALUES ('c104', '李康', '139645862');
第3题:删除客房类型为“特价房”的记录
DELETE FROM tb_room
WHERE rtype = '特价房';
解析:
- DELETE FROM tb_room:从客房类型表中删除记录
- WHERE rtype = ‘特价房’:删除条件,客房类型为“特价房”
注意事项:
- 必须加
WHERE条件,否则会删除表中所有数据 - 删除前最好先确认是否有相关外键约束
- 如果有外键关联(如
tb_booking引用了tb_room的rno),可能无法删除
安全做法(先查询再删除):
-- 先查看要删除的数据
SELECT * FROM tb_room WHERE rtype = '特价房';
-- 确认无误后执行删除
DELETE FROM tb_room WHERE rtype = '特价房';
第4题:创建视图
CREATE VIEW v_booking AS
SELECT cno
FROM tb_booking
WHERE rooms = 1;
解析:
- CREATE VIEW v_booking:创建名为
v_booking的视图 - AS:指定视图的内容
- SELECT cno:选择客户编号字段
- FROM tb_booking:从预订信息表中查询
- WHERE rooms = 1:筛选条件,预定房间数为1
使用视图:
-- 查询视图
SELECT * FROM v_booking;
-- 查询指定客户
SELECT * FROM v_booking WHERE cno = 'c101';
注意事项:
- 视图名不能与已有表或视图重名
- 视图不存储实际数据,只是保存查询定义
- 视图可以像表一样查询
第5题:创建用户并授权
-- 先创建用户
CREATE USER 'lijuan'@'localhost' IDENTIFIED BY 'password';
-- 授权SELECT权限
GRANT SELECT (flag, fstate)
ON db_booking.tb_flag
TO 'lijuan'@'localhost';
解析:
创建用户部分:
CREATE USER:创建新用户'lijuan'@'localhost':用户名和主机名IDENTIFIED BY 'password':设置密码(需要设置,但题目未指定,可自行设置如 ‘123456’)
授权部分:
GRANT SELECT (flag, fstate):授予对指定字段的SELECT权限(列级权限)ON db_booking.tb_flag:指定数据库和表TO 'lijuan'@'localhost':指定用户
简化写法(如果不指定字段):
-- 授予整个表的SELECT权限
GRANT SELECT ON db_booking.tb_flag TO 'lijuan'@'localhost';
验证授权:
-- 查看用户权限
SHOW GRANTS FOR 'lijuan'@'localhost';
答案汇总
| 题号 | 答案 |
|---|---|
| 1 | SELECT bno, rno, bdate, rooms, pdate, days, flag FROM tb_booking WHERE days > 3; |
| 2 | INSERT INTO tb_customers (cno, cname, teleNo) VALUES ('c104', '李康', '139645862'); |
| 3 | DELETE FROM tb_room WHERE rtype = '特价房'; |
| 4 | CREATE VIEW v_booking AS SELECT cno FROM tb_booking WHERE rooms = 1; |
| 5 | CREATE USER 'lijuan'@'localhost' IDENTIFIED BY 'password';GRANT SELECT (flag, fstate) ON db_booking.tb_flag TO 'lijuan'@'localhost'; |
知识点总结
| 题号 | 考点 | 关键语法 |
|---|---|---|
| 1 | 条件查询 | SELECT ... FROM ... WHERE ... |
| 2 | 插入数据 | INSERT INTO ... VALUES ... |
| 3 | 删除数据 | DELETE FROM ... WHERE ... |
| 4 | 创建视图 | CREATE VIEW ... AS SELECT ... |
| 5 | 用户管理 | CREATE USER + GRANT SELECT(字段) |
DELIMITER $$
CREATE TRIGGER tri_booking _________ INSERT ON tb_booking
FOR EACH ROW
BEGIN
_________ COUNT(*) INTO @times FROM tb_booking WHERE cno=_________ and flag=1;
END;
END$$
DELIMITER ;
触发器 tri_booking 逐空详细解析
第1个空:AFTER
CREATE TRIGGER tri_booking _________ INSERT ON tb_booking
答案:AFTER
解析:
- 这是触发器的触发时机关键字
AFTER表示在 INSERT 操作完成后才执行触发器- 语法结构:
CREATE TRIGGER 触发器名 {BEFORE|AFTER} {INSERT|UPDATE|DELETE} ON 表名
两种触发时机对比:
| 关键字 | 执行时机 | 适用场景 |
|---|---|---|
BEFORE | 操作执行前 | 数据校验、修改新值、阻止操作 |
AFTER | 操作执行后 | 日志记录、统计更新、数据同步 |
本题选择 AFTER 的原因:
- 需要在预订记录插入完成后,统计该客户的已确认订单数量
- 插入操作已经完成,可以查询到包括新插入记录在内的完整数据
第2个空:SELECT
_________ COUNT(*) INTO @times FROM tb_booking WHERE cno=_________ and flag=1;
答案:SELECT
解析:
- 这是执行查询的SQL关键字
SELECT COUNT(*)用于统计符合条件的记录数量INTO @times将统计结果存入用户变量@times- 完整功能:统计指定客户且状态为1的预订记录数
语法分解:
SELECT COUNT(*) INTO @times
FROM tb_booking
WHERE cno = 条件 AND flag = 1
COUNT(*) 说明:
- 统计所有符合条件的行数
- 无论字段是否有值,都会计数
@times 说明:
- 用户自定义变量,以
@开头 - 在当前会话中有效,可跨语句使用
第3个空:NEW.cno
WHERE cno=_________ and flag=1;
答案:NEW.cno
解析:
NEW是触发器中的特殊变量,代表新插入的行NEW.cno表示新插入记录中的客户编号字段值- 触发器为每一行触发一次,
NEW始终指向当前触发的那一行
NEW 和 OLD 变量对比:
| 变量 | 含义 | 适用操作 |
|---|---|---|
NEW | 操作后的新值 | INSERT、UPDATE |
OLD | 操作前的旧值 | UPDATE、DELETE |
在 INSERT 操作中:
NEW包含所有新插入的字段值OLD不存在(因为插入前没有旧值)
示例:
-- 插入新记录
INSERT INTO tb_booking (bno, cno, flag) VALUES ('B001', 'c101', 1);
-- 触发器中:
-- NEW.cno = 'c101'
-- NEW.flag = 1
-- NEW.bno = 'B001'
答案汇总
| 空位 | 答案 | 含义 |
|---|---|---|
| 第1空 | AFTER | 触发时机:操作后触发 |
| 第2空 | SELECT | 查询关键字 |
| 第3空 | NEW.cno | 新插入记录的客户编号 |
DELIMITER $
CREATE PROCEDURE sp_cancelbooking(________ cno INT)
DETERMINISTIC
BEGIN
UPDATE tb_booking
SET tb_booking.flag=(SELECT ________ FROM tb_flag WHERE tb_flag.fstate='取消')
WHERE tb_booking.cno=________;
END $
DELIMITER ;
存储过程 sp_cancelbooking 逐空详细解析
第1个空:IN
CREATE PROCEDURE sp_cancelbooking(________ cno INT)
答案:IN
解析:
- 这是存储过程的参数类型关键字
IN表示输入参数,由调用者传入值,在存储过程内部只读- 语法:
参数类型 参数名 数据类型
三种参数类型对比:
| 类型 | 说明 | 作用 |
|---|---|---|
IN | 输入参数 | 接收外部传入的值,不能返回 |
OUT | 输出参数 | 将结果返回给调用者 |
INOUT | 输入输出参数 | 既可传入也可返回 |
本题中:
cno是客户编号,需要由调用者传入- 用于指定要取消哪个客户的预订
第2个空:flag
SET tb_booking.flag=(SELECT ________ FROM tb_flag WHERE tb_flag.fstate='取消')
答案:flag
解析:
- 子查询需要返回预订状态代码
tb_flag表结构:flag:预订状态代码(如 F01、F02、F03)fstate:状态名称(如’已预订’、’已确认’、’取消’)- 根据状态名称
'取消'查询对应的状态代码
tb_flag 表示例:
| flag | fstate |
|---|---|
| F01 | 已预订 |
| F02 | 已确认 |
| F03 | 取消 |
| F04 | 已完成 |
子查询逻辑:
SELECT flag FROM tb_flag WHERE tb_flag.fstate = '取消'
-- 当 fstate='取消' 时,返回 'F03'
第3个空:cno
WHERE tb_booking.cno=________;
答案:cno
解析:
- 这是存储过程的输入参数名
- 用于指定更新条件:只更新该客户的预订记录
tb_booking.cno是表中的字段,cno是传入的参数
变量区分:
| 写法 | 含义 |
|---|---|
tb_booking.cno | 表中的客户编号字段 |
cno | 存储过程的输入参数(传入的值) |
WHERE 条件作用:
WHERE tb_booking.cno = cno- 将表中客户编号字段与传入的参数值进行匹配
- 只更新匹配的客户记录
答案汇总
| 空位 | 答案 | 含义 |
|---|---|---|
| 第1空 | IN | 输入参数类型 |
| 第2空 | flag | 状态代码字段 |
| 第3空 | cno | 输入参数名 |
## 存储过程 sp_cancelbooking 逐空详细解析
---
### 第1个空:`IN`
```sql
CREATE PROCEDURE sp_cancelbooking(________ cno INT)
```
**答案**:`IN`
**解析**:
- 这是存储过程的**参数类型**关键字
- `IN` 表示输入参数,由调用者传入值,在存储过程内部只读
- 语法:`参数类型 参数名 数据类型`
**三种参数类型对比**:
| 类型 | 说明 | 作用 |
|------|------|------|
| `IN` | 输入参数 | 接收外部传入的值,不能返回 |
| `OUT` | 输出参数 | 将结果返回给调用者 |
| `INOUT` | 输入输出参数 | 既可传入也可返回 |
**本题中**:
- `cno` 是客户编号,需要由调用者传入
- 用于指定要取消哪个客户的预订
---
### 第2个空:`flag`
```sql
SET tb_booking.flag=(SELECT ________ FROM tb_flag WHERE tb_flag.fstate='取消')
```
**答案**:`flag`
**解析**:
- 子查询需要返回**预订状态代码**
- `tb_flag` 表结构:
- `flag`:预订状态代码(如 F01、F02、F03)
- `fstate`:状态名称(如'已预订'、'已确认'、'取消')
- 根据状态名称 `'取消'` 查询对应的状态代码
**tb_flag 表示例**:
| flag | fstate |
|------|--------|
| F01 | 已预订 |
| F02 | 已确认 |
| F03 | 取消 |
| F04 | 已完成 |
**子查询逻辑**:
```sql
SELECT flag FROM tb_flag WHERE tb_flag.fstate = '取消'
-- 当 fstate='取消' 时,返回 'F03'
```
---
### 第3个空:`cno`
```sql
WHERE tb_booking.cno=________;
```
**答案**:`cno`
**解析**:
- 这是存储过程的**输入参数名**
- 用于指定更新条件:只更新该客户的预订记录
- `tb_booking.cno` 是表中的字段,`cno` 是传入的参数
**变量区分**:
| 写法 | 含义 |
|------|------|
| `tb_booking.cno` | 表中的客户编号字段 |
| `cno` | 存储过程的输入参数(传入的值) |
**WHERE 条件作用**:
- `WHERE tb_booking.cno = cno`
- 将表中客户编号字段与传入的参数值进行匹配
- 只更新匹配的客户记录
---
## 答案汇总
| 空位 | 答案 | 含义 |
|------|------|------|
| 第1空 | `IN` | 输入参数类型 |
| 第2空 | `flag` | 状态代码字段 |
| 第3空 | `cno` | 输入参数名 |
PHP程序逐空详细解析
第1个空:mysql_connect
$conn=_________($host,$user,$pwd)
答案:mysql_connect
解析:
- PHP连接MySQL数据库的函数
- 语法:
mysql_connect(服务器地址, 用户名, 密码) - 返回数据库连接资源,存储在
$conn变量中 - 参数
$host、$user、$pwd已在上方定义
第2个空:mysql_select_db
_________($db_name,$conn)
答案:mysql_select_db
解析:
- 选择要操作的数据库的函数
- 语法:
mysql_select_db(数据库名, 连接资源) - 第1个参数:数据库名称
$db_name = "db_booking" - 第2个参数:数据库连接资源
$conn
第3个空:mysql_num_rows
if (_________($select)>0){
答案:mysql_num_rows
解析:
- 获取结果集中记录行数的函数
- 语法:
mysql_num_rows(结果集资源) $select是执行SELECT * FROM tb_booking返回的结果集- 判断是否有记录(>0),有则进入循环输出
第4个空:$row[2]
$cmd2="select rtype from tb_room where rno='_________'";
答案:$row[2]
解析:
tb_booking表的字段结构(按SELECT顺序):$row[0]:bno(预订单号)$row[1]:cno(客户编号)$row[2]:rno(客房类型编号)$row[3]:bdate(预订日期)$row[4]:rooms(预订数量)$row[5]:pdate(预计入住时间)$row[6]:days(预计入住天数)$row[7]:flag(预订状态代码)
查询逻辑:
- 根据客房类型编号
$row[2]查询对应的客房类型名称rtype
第5个空:$row3[0]
"_________</td>"
答案:$row3[0]
解析:
$row3是从tb_flag表查询的结果- 查询语句:
SELECT fstate FROM tb_flag WHERE flag='$row[7]' $row3[0]是状态名称fstate- 输出预订状态的中文名称(如”已预订”、”已确认”、”取消”等)
输出列对应关系:
| 输出列 | 数据来源 |
|---|---|
| 预订单号 | $row[0] |
| 客户姓名 | $row1[0] |
| 客房类型 | $row2[0] |
| 预定日期 | $row[3] |
| 预订房间数量 | $row[4] |
| 预计入住时间 | $row[5] |
| 预计入住天数 | $row[6] |
| 预订状态 | $row3[0] ← 第5个空 |
答案汇总
| 空位 | 答案 | 含义 |
|---|---|---|
| 第1空 | mysql_connect | 连接数据库函数 |
| 第2空 | mysql_select_db | 选择数据库函数 |
| 第3空 | mysql_num_rows | 获取结果集行数函数 |
| 第4空 | $row[2] | 客房类型编号字段 |
| 第5空 | $row3[0] | 预订状态名称 |
发表回复