活动发起人@小虚竹 想对你说:
这是一个以写作博客为目的的创作活动,旨在鼓励大学生博主们挖掘自己的创作潜能,展现自己的写作才华。如果你是一位热爱写作的、想要展现自己创作才华的小伙伴,那么,快来参加吧!我们一起发掘写作的魅力,书写出属于我们的故事。我们诚挚邀请你参加为期14天的创作挑战赛!
提醒:在发布作品前,请将不需要的内容删除。
以下关于 MySQL 的叙述中,错误的是( )。
OA、MySQL 为多种编程语言提供 API
OB、MySQL 是基于网状模型的数据库
OC、任何人都可以使用和修改 MySQL 系统软件
OD、MySQL 默认的端口号是 3306
mysql-connector-python
、PyMySQL
mysqli
扩展my.cnf
)修改。特性/概念 | 说明 |
---|---|
关系型数据库 | 数据以行和列的形式存储在表中,支持 SQL 查询和事务管理(ACID)。 |
开源与商业化 | 社区版免费,企业版提供高级功能(如线程池、备份工具)。 |
存储引擎 | 支持多引擎(如 InnoDB 支持事务,MyISAM 强调性能)。 |
跨平台支持 | 可在 Windows、Linux、macOS 等系统运行。 |
mysql -h 127.0.0.1 -P 3306 -u root -p
port=3306
。import mysql.connector db = mysql.connector.connect( host="localhost", user="root", password="password", database="test" ) cursor = db.cursor() cursor.execute("SELECT * FROM users") results = cursor.fetchall()
OB 是错误叙述:
17) 若在 MySQL 中已经建立了 db_test
数据库,再执行如下语句:
mysql> CREATE DATABASE IF NOT EXISTS db_test;
显示的提示信息是:
Query OK, 1 row affected, 1 warning (0.00 sec)
对于上述语句及执行结果,以下叙述中正确的是( )。
O A、语法有错,应该是:CREATE DATABASE db_test IF NOT EXISTS;
O B、新建 db_test
数据库,覆盖原来的同名数据库
O C、没有创建新的数据库
O D、语法有错,应该是:CREATE DATABASE IF EXISTS db_test;
CREATE DATABASE
的语法规则CREATE DATABASE [IF NOT EXISTS] 数据库名;
IF NOT EXISTS
的作用:仅在数据库不存在时创建,避免重复创建报错。CREATE DATABASE db_test IF NOT EXISTS;
→ 子句顺序错误,IF NOT EXISTS
必须紧跟 DATABASE
。CREATE DATABASE IF EXISTS db_test;
→ 逻辑错误,IF EXISTS
用于删除数据库(如 DROP DATABASE IF EXISTS
),而非创建。现象 | 解释 |
---|---|
1 row affected |
由于 IF NOT EXISTS 的存在,MySQL 返回“操作成功”,但实际未创建数据库(无数据变更)。此处的“1 row affected”可能是版本差异或客户端显示问题,实际无影响。 |
1 warning |
警告信息提示数据库已存在,未执行创建操作。可通过 SHOW WARNINGS; 查看具体警告内容。 |
选项 | 解析 | 正确性 |
---|---|---|
A | 错误:语法错误,IF NOT EXISTS 必须紧跟在 DATABASE 后,而非数据库名之后。 |
❌ 错误 |
B | 错误:CREATE DATABASE 不会覆盖已有数据库,覆盖需用 DROP DATABASE 后重建。 |
❌ 错误 |
C | 正确:因数据库已存在且使用 IF NOT EXISTS ,实际未创建新数据库。 |
✅ 正确 |
D | 错误:IF EXISTS 不用于创建语句,语法错误。 |
❌ 错误 |
SHOW DATABASES;
db_test
已存在。CREATE DATABASE IF NOT EXISTS db_test;
1 row affected, 1 warning
。SHOW WARNINGS;
Note | 1007 | Can't create database 'db_test'; database exists
。IF NOT EXISTS
时重复创建数据库。 CREATE DATABASE db_test;
ERROR 1007 (HY000): Can't create database 'db_test'; database exists
。DROP DATABASE IF EXISTS db_test; CREATE DATABASE db_test;
CREATE DATABASE IF NOT EXISTS 执行逻辑:
┌───────────────┐
│ 检查数据库是否存在 → 存在则跳过创建,返回警告 → 不存在则创建 │
└───────────────┘
核心结论:选项C正确,其他选项均混淆了语法规则或操作结果。
WHERE
子句中的条件表达式是:
num BETWEEN 20 AND 30
已知 num
的数据类型是整型,则 num
的值( )。
A、包含20和30
B、包含20和30
C、包含20,不包含30
D、不包含20,包含30
BETWEEN ... AND ...
的边界规则BETWEEN 20 AND 30
表示范围 20,3020,30,即包含边界值。SELECT 20 BETWEEN 20 AND 30; -- 结果为1(真) SELECT 30 BETWEEN 20 AND 30; -- 结果为1(真)
num
是整数,实际取值范围为 20, 21, 22, ..., 30。num
是浮点数,则包含20.0到30.0之间的所有小数(如20.5)。选项 | 正误 | 关键分析 |
---|---|---|
A | ✔️ 正确 | 符合 BETWEEN 的闭区间定义。 |
B | ✔️ 正确 | 与选项A内容一致(可能是排版重复)。 |
C | ❌ 错误 | BETWEEN 包含30,若需“包含20不包含30”,应写为 num >= 20 AND num < 30 。 |
D | ❌ 错误 | BETWEEN 包含20,若需“不包含20但包含30”,应写为 num > 20 AND num <= 30 。 |
BETWEEN
是左闭右开(如[20, 30))。BETWEEN
始终是闭区间,等效于 num >= 20 AND num <= 30
。DATE
),BETWEEN '2025-03-01' AND '2025-03-15'
包含首尾两天的全天时间。BETWEEN 20 AND 30
包含20和30,适用于整型数据。>
和 <
(如 num > 20 AND num < 30
)。BETWEEN
可能触发范围扫描,需结合索引设计权衡性能。掌握 BETWEEN
的闭区间特性,是编写精准SQL查询的基础。
19. 对于 tb_room
客房信息表:
CREATE TABLE tb_room( rno CHAR(10) NOT NULL, rtype CHAR(20) NOT NULL, rprice INT NULL, rmemo CHAR(50) NULL );
字段含义:客房类型编号(rno
)、客房类型(rtype
)、单价(rprice
)、说明(rmemo
)。
问题:以下完整性约束设计中,不正确的是( )。
A、为 rprice
指定价格区间
B、将 rno
设为主键
C、为 rtype
设置默认值
D、将 rmemo
字段设置为外键
约束类型 | 作用 | 示例 |
---|---|---|
实体完整性 | 确保主键唯一且非空,标识每条记录的唯一性。 | PRIMARY KEY(rno) |
参照完整性 | 外键必须引用其他表中存在的值,保证关联数据有效性。 | FOREIGN KEY(rtype) REFERENCES ... |
用户定义完整性 | 自定义业务规则,如字段取值范围、默认值、非空约束等。 | CHECK(rprice > 0) 、DEFAULT '标准间' |
选项 | 正误 | 关键逻辑 |
---|---|---|
A | 正确 | 通过 CHECK(rprice BETWEEN 0 AND 10000) 限制价格区间,符合用户定义完整性。 |
B | 正确 | rno 是客房类型编号,作为主键可唯一标识客房类型(主键需满足非空且唯一)。 |
C | 正确 | 通过 DEFAULT '标准间' 为 rtype 设置默认值,避免空值(即使未明确赋值,字段仍有效)。 |
D | 错误 | 外键需引用其他表的主键,而 rmemo 是文本说明字段,无关联表逻辑支持,设为外键无意义(除非存在“说明编码表”,但题目未提及)。 |
rmemo
是自由文本说明字段(如“海景房,带阳台”),无法作为主键或唯一键。rtype
外键引用客房类型表的主键)。ALTER TABLE tb_room ALTER COLUMN rtype CHAR(20) NOT NULL;
ALTER TABLE tb_room ADD CONSTRAINT UQ_rtype UNIQUE(rtype);
ALTER TABLE tb_room ADD CHECK(rprice >= 0);
误区 | 澄清 |
---|---|
“所有字段均可设为外键” | 外键需明确关联其他表的主键,且字段语义匹配(如 rtype 可能作为外键,但 rmemo 不符合)。 |
“默认值属于参照完整性” | 默认值属于用户定义完整性,与数据逻辑无关(仅填充缺失值)。 |
“主键必须为单字段” | 主键可由多个字段联合组成(复合主键),但本题中 rno 单独作为主键已足够。 |
rmemo
作为说明字段无关联逻辑,设计为外键错误。题目:设有如下SQL语句:
CREATE TABLE tb_booking( num INT NOT NULL AUTO_INCREMENT PRIMARY KEY, cno CHAR(10) NOT NULL, rno CHAR(10) NOT NULL, scheduleS DATETIME NULL, scheduleE DATETIME NULL, currentdate DATETIME NULL, FOREIGN KEY(cno) REFERENCES tb_customer(cno), FOREIGN KEY (mno) REFERENCES tb_room(mno) );
关于上述语句,以下叙述中错误的是( )。
选项:
A. num
值由系统自动生成,不能手工输入
B. cno
是tb_booking
表的外键
C. cno
所参照的表是tb customer
D. 主键是num
组件 | 说明 | 示例 |
---|---|---|
主键 | 唯一标识表中每行数据的字段,不可重复且非空。 | num INT PRIMARY KEY AUTO_INCREMENT |
外键 | 建立表间关联的字段,需引用另一表的主键。 | FOREIGN KEY(cno) REFERENCES tb_customer(cno) |
字段约束 | 限制字段值的规则(如NOT NULL 、UNIQUE 、DEFAULT )。 |
cno CHAR(10) NOT NULL |
自增属性 | AUTO_INCREMENT (MySQL)或IDENTITY (SQL Server)用于自动生成唯一递增值。 |
num INT AUTO_INCREMENT |
tb_customer
vs. tb customer
(空格导致表名不匹配)。mno
未在tb_booking
中定义,却作为外键引用。INSERT INTO tb_booking (cno, rno) VALUES ('C001', 'R101'); -- num自动生成
INSERT INTO tb_booking (num, cno, rno) VALUES (100, 'C002', 'R102'); -- 允许但需谨慎
,
),而非句点(.
)。num INT NOT NULL AUTO_INCREMENT PRIMARY KEY. -- 错误,应用逗号 cno CHAR(10) NOT NULL,
CREATE TABLE `tb customer` (cno CHAR(10)); -- 含空格的表名需反引号
选项C因表名拼写错误(tb customer
vs. tb_customer
)成为正确答案。掌握SQL语法细节(如命名规则、外键约束)和严谨检查表/字段名,是避免此类错误的关键。
要求在已建立的 tb_booking
表中增加一个名为 handler
的字符类型字段,以下能实现上述功能的语句是( )。
OA、ALTER TABLE tb_booking ADD FIELD handler CHAR(10) NULL;
OB、ALTER TABLE tb_booking ADD CONSTRAINT handler CHAR(10) NULL;
OC、ALTER TABLE tb_booking ADD COLUMN handler CHAR(10) NULL;
OD、ALTER TABLE tb_booking CHANGE COLUMN handler CHAR(10) NULL;
ALTER TABLE 表名 ADD COLUMN 列名 数据类型 [约束];
ALTER TABLE tb_booking ADD COLUMN handler CHAR(10) NULL;
ADD COLUMN
:明确指示添加列。CHAR(10)
:定义字段为字符类型,长度10。NULL
:允许该字段为空(若需禁止为空则用 NOT NULL
)。选项 | 错误原因 |
---|---|
OA | ADD FIELD 语法错误,应为 ADD COLUMN 。 |
OB | ADD CONSTRAINT 用于添加约束(如外键、唯一键),而非添加字段。 |
OD | CHANGE COLUMN 用于修改现有字段的名称或属性,而非新增字段。 |
ALTER TABLE
其他操作操作类型 | 语法示例 | 作用 |
---|---|---|
删除字段 | ALTER TABLE tb_booking DROP COLUMN handler; |
移除指定字段 |
修改字段 | ALTER TABLE tb_booking MODIFY COLUMN handler VARCHAR(20); |
更改字段数据类型 |
重名字段 | ALTER TABLE tb_booking RENAME COLUMN handler TO operator; |
修改字段名称 |
添加主键 | ALTER TABLE tb_booking ADD PRIMARY KEY(id); |
设置主键约束 |
执行正确语句(OC):
-- 添加 handler 字段 ALTER TABLE tb_booking ADD COLUMN handler CHAR(10) NULL; -- 验证表结构 DESC tb_booking;
输出结果:
Field | Type | Null | Key | Default | Extra |
---|---|---|---|---|---|
handler | char(10) | YES | NULL |
错误操作示例(OD):
-- 尝试用 CHANGE COLUMN 新增字段(会报错) ALTER TABLE tb_booking CHANGE COLUMN handler CHAR(10) NULL;
报错信息:Unknown column 'handler' in 'tb_booking'
(字段不存在,无法修改)。
order
、group
),若必须使用需用反引号包裹(`handler`
)。CHAR(n)
:定长字符串,适合长度固定的数据(如国家代码、性别)。VARCHAR(n)
:变长字符串,适合长度不固定的数据(如姓名、地址)。OC 是正确答案:
ADD COLUMN
语法,其他选项因语法或功能错误不适用。ALTER TABLE
的不同子句(ADD COLUMN
、DROP COLUMN
、MODIFY
)是管理表结构的基础。22) 设创建 tb_room
的语句如下:
CREATE TABLE tb_room ( rno CHAR(10) NOT NULL, rtype CHAR(20) NOT NULL, rprice INT NULL, rmemo CHAR(50) NULL );
以下能够正确实现将编号(rno
)为 r100
的房间价格(rprice
)由 150 元改为 180 元的语句是( )。
O A、UPDATE tb_room SET rprice=180 WHERE rprice=150;
O B、UPDATE tb_room SET rprice=180 WHERE rno='r100';
O C、UPDATE tb_room CHANGE rprice=180 WHERE rno='r100';
O D、UPDATE tb_room SET rprice='180' WHERE rprice='150';
UPDATE
语句的基本语法sql
复制
UPDATE 表名 SET 字段名 = 新值 WHERE 条件;
SET
子句指定要修改的字段及新值。WHERE
子句限定修改的目标记录(必须精确,否则可能误改多条数据)。选项 | 解析 | 正确性 |
---|---|---|
A | 错误:WHERE rprice=150 会修改所有价格为150元的房间,而非仅 rno='r100' 。 |
❌ 错误 |
B | 正确:通过 rno='r100' 精确锁定目标记录,且 rprice 是 INT 类型,无需引号。 |
✅ 正确 |
C | 错误:CHANGE 是无效关键字(应为 SET ),语法错误。 |
❌ 错误 |
D | 错误:rprice 是 INT 类型,赋值和条件中使用引号('180' 、'150' )会导致隐式类型转换,可能引发兼容性问题。 |
❌ 错误 |
字段类型 | 赋值规则 | 示例 |
---|---|---|
数值类型(如 INT ) |
直接赋值,无需引号。 | rprice=180 |
字符类型(如 CHAR ) |
必须用单引号包裹。 | rno='r100' |
错误类型 | 示例 | 规避方法 |
---|---|---|
遗漏 WHERE |
UPDATE tb_room SET rprice=180; |
修改前确认 WHERE 条件是否精确。 |
类型不匹配 | SET rprice='180' (INT 字段) |
根据字段类型决定是否使用引号。 |
模糊条件 | WHERE rprice=150 (可能多行) |
优先使用唯一标识字段(如主键 rno )。 |
SELECT * FROM tb_room WHERE rno='r100';
rno='r100', rprice=150
。UPDATE tb_room SET rprice=180 WHERE rno='r100';
1 row affected
(仅修改目标记录)。SELECT rprice FROM tb_room WHERE rno='r100';
rprice=180
。UPDATE 语句执行逻辑:
┌───────────────┐
│ 定位目标记录(WHERE) → 更新指定字段(SET) → 提交修改 │
└───────────────┘
核心结论:选项B正确,其他选项因语法错误、条件不精确或类型不匹配导致错误。
设创建客房表 tb_room
的语句如下:
CREATE TABLE tb_room( rno CHAR(10) NOT NULL, type CHAR(20) NOT NULL, rprice INT NULL, rmemo CHAR(50) NULL );
现要插入一条记录:rno
为 'r500'
,type
为 '标间'
。
以下不能正确插入数据的语句是( )。
A、INSERT INTO tb_room (rno, rtype) VALUES('r500','标间');
B、INSERT INTO tb_room VALUES('r500标间', NULL, NULL);
C、INSERT INTO tb_room SET rno='r500', rtype='标间';
D、INSERT INTO tb_room VALUES('r500','标间');
(rno, type)
),值需一一对应且字段名正确(如本题表字段为 type
,而非 rtype
)。VALUES(...)
),需按表定义顺序填充所有字段值,允许 NULL
的字段可显式写 NULL
。'r500'
)。选项 | 正误 | 关键分析 |
---|---|---|
A | ❌ 错误 | 字段名 rtype 不存在(正确应为 type ),且 VALUES 中 r500 缺少单引号(应为 'r500' )。 |
B | ❌ 错误 | 排版错误导致语法问题:'r500标间' 应为 'r500', '标间' ,修正后可正确插入。 |
C | ❌ 错误 | 字段名 rtype 不存在(正确应为 type ),且字符串未闭合('标间 缺少右引号)。 |
D | ❌ 错误 | 值数量不足:表有4个字段(rno , type , rprice , rmemo ),仅提供2个值,需补全或显式指定 NULL 。 |
INSERT INTO tb_room VALUES('r500', '标间', NULL, NULL);
rprice
和 rmemo
显式写 NULL
。INSERT INTO tb_room (rno, type) VALUES('r500', '标间');
DEFAULT
(若字段有默认值): INSERT INTO tb_room VALUES('r500', '标间', DEFAULT, DEFAULT);
type
非 rtype
)。NULL
的字段需显式填充或省略(若支持隐式 NULL
)。INSERT INTO tb_room (rno, type)
),避免依赖隐式顺序。掌握SQL插入语句的语法细节,是保障数据操作准确性的关键。
24. 设 tb_booking
、tb_customer
表结构如下:
tb_booking ( num, -- 订单编号 cno, -- 客户编号 rno, -- 房间类型编号 scheduleS, -- 预计入住日期(DATETIME) scheduleE, -- 预计离开日期 currentdate -- 订单日期 ) tb_customer ( cno, -- 客户编号 cname, -- 客户姓名 tel -- 联系电话 )
查询语句:
SELECT cname, scheduleS FROM tb_booking b, tb_customer c WHERE scheduleS > '2014-9-1' AND b.cno = c.cno;
问题:以下关于该语句的叙述中,正确的是( )。
A、检索预订2014年9月1日后入住的客户姓名和预计入住日期
B、语句有错,条件 scheduleS > '2014-9-1'
,日期类型的字段不能与字符串比较
C、语句有错,SELECT
子句中没有标明字段所属表的别名
D、WHERE
子句中的 b.cno = c.cno
可以省略
语法要点 | 说明 |
---|---|
隐式连接 | 使用逗号分隔表名(如 FROM tb_booking b, tb_customer c )实现多表连接,需通过 WHERE 指定关联条件。 |
字段别名必要性 | 当不同表存在同名字段时需通过别名区分,但本题中 cname 和 scheduleS 字段唯一,无需别名。 |
日期比较 | 日期字段(如 DATETIME )可与字符串比较,但需确保字符串格式正确(如 '2014-09-01' )。 |
选项 | 正误 | 关键逻辑 |
---|---|---|
A | 正确 | 查询条件 scheduleS > '2014-9-1' 筛选入住日期晚于2014年9月1日的记录,并关联客户姓名。 |
B | 错误 | 日期字段可与字符串比较,但 '2014-9-1' 格式不标准(正确格式应为 '2014-09-01' ),部分数据库宽松处理仍可执行。 |
C | 错误 | cname 和 scheduleS 分属不同表且字段名唯一,无需别名。 |
D | 错误 | 若省略 b.cno = c.cno ,查询将返回笛卡尔积(所有客户与所有订单的组合),而非正确关联结果。 |
误区 | 澄清 |
---|---|
“所有日期比较必须用标准格式” | 部分数据库(如MySQL)支持非标准日期格式(如 '2014-9-1' )的隐式转换,但建议使用 'YYYY-MM-DD' 格式避免歧义。 |
“隐式连接必须显式别名所有字段” | 仅当字段名冲突时需要别名,否则可直接使用字段名。 |
“多表连接必须用 JOIN 语法” |
隐式连接(逗号分隔表名)和显式连接(INNER JOIN )功能等价,但显式语法更易维护。 |
SELECT cname, scheduleS FROM tb_booking b INNER JOIN tb_customer c ON b.cno = c.cno WHERE scheduleS > '2014-09-01';
'2014-09-01'
避免兼容性问题。WHERE
指定关联条件,否则会导致笛卡尔积。题目:设表 tb_booking
结构如下:
tb_booking (num, cno, rno, scheduleS, scheduleE, currentdate)
字段含义依次为:订单编号、客户编号、房间类型编号、预计入住日期、预计离开日期、订单日期。
要求检索出至少预订两次(包含三次)的客户编号,正确的语句是( )。
选项:
A. SELECT cno FROM tb_booking WHERE COUNT(*)>=3 GROUP BY cno;
B. SELECT cno FROM tb_booking GROUP BY cno HAVING COUNT(*)>=3;
C. SELECT * FROM tb_booking GROUP BY COUNT(1)>=3;
D. SELECT COUNT(*) FROM tb_booking GROUP BY cno>=3;
正确答案:B. SELECT cno FROM tb_booking GROUP BY cno HAVING COUNT(*)>=3;
解析:
题目要求检索“至少预订两次(包含三次)”的客户编号,即统计每个客户的订单数量,筛选出订单数 ≥ 2 的客户。
>=3
,实际应理解为“至少三次”。选项 | 错误原因 |
---|---|
A | WHERE 子句不能直接使用聚合函数 COUNT(*) (WHERE 在分组前执行,无法统计分组后的数量)。 |
B | 正确。通过 GROUP BY cno 分组,用 HAVING COUNT(*)>=3 过滤出订单数 ≥3 的客户。 |
C | GROUP BY 后不能接条件表达式(如 COUNT(1)>=3 ),语法错误。 |
D | GROUP BY cno>=3 逻辑错误(cno 是客户编号,非数值字段),且返回的是计数而非客户编号。 |
GROUP BY
与 HAVING
的关系:
GROUP BY
按客户编号分组后,HAVING
对分组结果进行过滤(如统计订单数)。SELECT cno, COUNT(*) AS order_count FROM tb_booking GROUP BY cno HAVING order_count >= 3;
COUNT(*)
、SUM()
、AVG()
等聚合函数仅能在 SELECT
或 HAVING
子句中使用。WHERE
子句仅用于过滤单条记录,无法处理分组后的结果。FROM
:确定查询的表。WHERE
:过滤符合条件的单条记录(不能使用聚合函数)。GROUP BY
:按指定字段分组。HAVING
:过滤分组后的结果(可使用聚合函数)。SELECT
:选择最终输出的字段。ORDER BY
:排序结果。函数/子句 | 作用 | 示例 |
---|---|---|
COUNT(*) |
统计行数(包括NULL值)。 | COUNT(*) 统计订单总数。 |
HAVING |
对分组后的结果进行条件过滤。 | HAVING COUNT(*) >=3 筛选订单数≥3的客户。 |
GROUP BY |
按指定字段分组,通常与聚合函数配合使用。 | GROUP BY cno 按客户编号分组统计。 |
WHERE
中使用聚合函数: -- 错误!WHERE 不能直接使用 COUNT(*) SELECT cno FROM tb_booking WHERE COUNT(*) >=3;
GROUP BY
后接条件表达式: -- 错误!GROUP BY 后需为字段名或表达式,而非条件 SELECT * FROM tb_booking GROUP BY COUNT(1)>=3;
HAVING
和 WHERE
: -- 正确:HAVING 过滤分组结果 SELECT cno FROM tb_booking GROUP BY cno HAVING COUNT(*)>=3; -- 错误:WHERE 过滤单条记录 SELECT cno FROM tb_booking WHERE COUNT(*)>=3 GROUP BY cno;
题目:检索出2024年订单数超过5次的客户编号及其订单数。
答案:
SELECT cno, COUNT(*) AS order_count FROM tb_booking WHERE YEAR(currentdate) = 2024 -- 先过滤2024年的订单 GROUP BY cno HAVING order_count > 5; -- 再筛选订单数>5的客户
GROUP BY
分组统计,结合 HAVING
过滤聚合结果。WHERE
(行级过滤)和 HAVING
(分组后过滤),避免语法错误。