一、选择题(30 题)
-
在 MySQL 中,存储引擎
InnoDB
和MyISAM
的主要区别在于( )
A.InnoDB
支持事务和外键,MyISAM
不支持
B.MyISAM
支持事务,InnoDB
不支持
C.InnoDB
占用空间更小
D.MyISAM
查询速度更慢
答案:A -
执行
CREATE TABLE
语句时,以下哪个关键字用于定义主键约束?( )
A.UNIQUE
B.PRIMARY KEY
C.FOREIGN KEY
D.CHECK
答案:B -
若要查询
students
表中年龄大于 20 岁的学生,SQL 语句应为( )
A.SELECT * FROM students WHERE age > 20;
B.SELECT * FROM students HAVING age > 20;
C.SELECT * FROM students GROUP BY age > 20;
D.SELECT * FROM students ORDER BY age > 20;
答案:A -
以下哪个函数用于统计表中的记录数?( )
A.SUM()
B.AVG()
C.COUNT()
D.MAX()
答案:C -
执行
DELETE FROM table_name;
和TRUNCATE TABLE table_name;
的主要区别是( )
A.DELETE
保留自增主键计数,TRUNCATE
重置计数
B.TRUNCATE
支持事务回滚,DELETE
不支持
C.DELETE
删除速度更快
D. 两者功能完全相同
答案:A -
多表连接时,
LEFT JOIN
的作用是( )
A. 返回两表中完全匹配的行
B. 返回左表所有行及右表匹配行
C. 返回右表所有行及左表匹配行
D. 返回两表中不匹配的行
答案:B -
若要修改数据库用户
user1
的密码,正确语句是( )
A.ALTER USER 'user1' IDENTIFIED BY 'new_password';
B.SET PASSWORD FOR 'user1' = PASSWORD('new_password');
C.UPDATE user SET password = 'new_password' WHERE user = 'user1';
D.CHANGE PASSWORD FOR 'user1' = 'new_password';
答案:A -
以下哪个数据类型适合存储短文本(长度固定)?( )
A.VARCHAR
B.TEXT
C.CHAR
D.BLOB
答案:C -
执行
SELECT DISTINCT column1 FROM table1;
的作用是( )
A. 查询column1
列的所有重复值
B. 查询column1
列的唯一值
C. 按column1
列升序排序
D. 按column1
列降序排序
答案:B -
事务的四个特性(ACID)不包括以下哪一项?( )
A. 原子性(Atomicity)
B. 一致性(Consistency)
C. 并发性(Concurrency)
D. 持久性(Durability)
答案:C -
若要给
students
表的age
字段添加CHECK
约束(年龄范围 18-60),语句为( )
A.ALTER TABLE students ADD CONSTRAINT chk_age CHECK (age BETWEEN 18 AND 60);
B.ALTER TABLE students ADD CONSTRAINT chk_age UNIQUE (age BETWEEN 18 AND 60);
C.ALTER TABLE students ADD CONSTRAINT chk_age PRIMARY KEY (age BETWEEN 18 AND 60);
D.ALTER TABLE students ADD CONSTRAINT chk_age FOREIGN KEY (age BETWEEN 18 AND 60);
答案:A -
执行
INSERT INTO table1 (col1, col2) VALUES (1, 'abc');
时,若col1
为自增列且已存在值 1,会( )
A. 插入成功,col1
值为 1
B. 插入失败,主键冲突
C.col1
自动生成值 2
D. 插入空值
答案:B -
以下关于索引的说法,正确的是( )
A. 索引越多查询效率越高
B. 索引会降低数据插入和更新的速度
C. 全文索引只能用于CHAR
类型字段
D. 索引不占用磁盘空间
答案:B -
若要查询
orders
表中订单日期(order_date
)在 2024 年的记录,语句为( )
A.SELECT * FROM orders WHERE YEAR(order_date) = 2024;
B.SELECT * FROM orders WHERE order_date = 2024;
C.SELECT * FROM orders WHERE MONTH(order_date) = 2024;
D.SELECT * FROM orders WHERE DAY(order_date) = 2024;
答案:A -
执行
CREATE VIEW view_name AS SELECT column1, column2 FROM table1;
后,view_name
是( )
A. 实际存储数据的物理表
B. 基于table1
的虚拟表
C. 无法被修改的只读表
D. 独立于table1
的新表
答案:B -
以下哪个操作符用于查询包含指定值列表的记录?( )
A.LIKE
B.BETWEEN
C.IN
D.NOT
答案:C -
若要删除
students
表中的email
列,语句为( )
A.ALTER TABLE students DELETE COLUMN email;
B.ALTER TABLE students DROP COLUMN email;
C.ALTER TABLE students REMOVE COLUMN email;
D.ALTER TABLE students ERASE COLUMN email;
答案:B -
执行
SELECT AVG(salary) FROM employees WHERE department = 'IT';
的作用是( )
A. 查询IT
部门员工的总工资
B. 查询IT
部门员工的平均工资
C. 查询所有员工的平均工资
D. 查询IT
部门员工的最高工资
答案:B -
以下关于视图的描述,错误的是( )
A. 视图可以简化复杂查询
B. 修改视图可能影响基表数据
C. 视图不能嵌套使用
D. 视图不存储实际数据
答案:C -
若要查询
products
表中价格(price
)前 10 名的产品,语句为( )
A.SELECT * FROM products LIMIT 10;
B.SELECT * FROM products ORDER BY price DESC LIMIT 10;
C.SELECT * FROM products GROUP BY price LIMIT 10;
D.SELECT * FROM products HAVING price LIMIT 10;
答案:B -
执行
GRANT SELECT, INSERT ON database1.* TO 'user1'@'localhost';
的作用是( )
A. 赋予user1
对database1
所有表的查询和插入权限
B. 赋予user1
对database1
所有表的查询、插入和删除权限
C. 赋予user1
对database1
所有表的所有权限
D. 赋予user1
对database1
指定表的查询和插入权限
答案:A -
以下哪个数据类型适合存储日期和时间(精确到秒)?( )
A.DATE
B.TIME
C.DATETIME
D.YEAR
答案:C -
执行
SAVEPOINT point1;
和ROLLBACK TO point1;
的作用是( )
A. 保存事务点并回滚到该点
B. 提交事务到指定点
C. 删除事务点
D. 创建新事务
答案:A -
若要查询
customers
表中姓氏(last_name
)以 'Smith' 开头的客户,语句为( )
A.SELECT * FROM customers WHERE last_name = 'Smith%';
B.SELECT * FROM customers WHERE last_name LIKE 'Smith%';
C.SELECT * FROM customers WHERE last_name IN 'Smith%';
D.SELECT * FROM customers WHERE last_name BETWEEN 'Smith%';
答案:B -
执行
CREATE INDEX idx_name ON students (name);
的作用是( )
A. 创建名为idx_name
的唯一索引
B. 创建名为idx_name
的普通索引
C. 创建名为idx_name
的全文索引
D. 删除名为idx_name
的索引
答案:B -
以下关于
UNION
操作的描述,正确的是( )
A.UNION
会保留重复记录
B.UNION ALL
会去除重复记录
C.UNION
要求两个查询的列数和数据类型一致
D.UNION
只能用于两个表之间的合并
答案:C -
若要查询
orders
表中每个客户(customer_id
)的订单数量,语句为( )
A.SELECT customer_id, COUNT(*) FROM orders GROUP BY customer_id;
B.SELECT customer_id, SUM(*) FROM orders GROUP BY customer_id;
C.SELECT customer_id, AVG(*) FROM orders GROUP BY customer_id;
D.SELECT customer_id, MAX(*) FROM orders GROUP BY customer_id;
答案:A -
执行
ALTER TABLE table1 CHANGE column1 new_column1 VARCHAR(50);
的作用是( )
A. 删除column1
列并创建new_column1
列
B. 修改column1
列的名称和数据类型
C. 仅修改column1
列的名称
D. 仅修改column1
列的数据类型
答案:B -
以下哪个函数用于将字符串转换为大写?( )
A.LOWER()
B.UPPER()
C.CONCAT()
D.SUBSTRING()
答案:B -
若要查询
products
表中价格(price
)在 50 到 100 之间的产品,语句为( )
A.SELECT * FROM products WHERE price BETWEEN 50 AND 100;
B.SELECT * FROM products WHERE price > 50 OR price < 100;
C.SELECT * FROM products WHERE price IN (50, 100);
D.SELECT * FROM products WHERE price LIKE '50-100';
答案:A
二、填空题(20 题)
- MySQL 默认的端口号是 3306。
- 创建表时,使用
CREATE TABLE
语句。 VARCHAR
数据类型用于存储 可变长度字符串。- 数据库中用于连接两个表的字段称为 外键。
- 执行
COMMIT
命令会 提交 事务中的所有操作。 - 若要查询表结构,可使用
DESCRIBE
或DESC
命令。 - 聚合函数
SUM()
用于计算 数值列的总和。 - 存储引擎
MyISAM
不支持 事务和外键。 LIKE
关键字配合%
(通配符)查询包含指定字符的字符串。GROUP BY
子句通常与 聚合函数 一起使用。- 执行
ALTER TABLE
语句时,DROP COLUMN
用于 删除列。 - 数据库的完整性约束包括 主键约束、外键约束、唯一约束 等。
- 时间函数
NOW()
返回 当前日期和时间。 TRUNCATE TABLE
会 删除表中所有数据并重置自增主键。- 若要创建数据库用户,可使用
CREATE USER
语句。 - 多表连接的类型包括
INNER JOIN
、LEFT JOIN
、RIGHT JOIN
等。 - 执行
SAVEPOINT
命令可在事务中创建 保存点。 - 全文索引使用
MATCH AGAINST
语法进行搜索。 HAVING
子句用于对 分组结果 进行筛选。- 数据库备份工具
mysqldump
可用于导出数据库数据和结构。
三、编程题(10 题)
1. 创建数据库和表
创建数据库company
,并在其中创建两张表:
departments
(部门 IDdept_id
(主键),部门名称dept_name
)employees
(员工 IDemp_id
(主键),员工姓名emp_name
,部门 IDdept_id
(外键),工资salary
)
sql
CREATE DATABASE company;
USE company;
CREATE TABLE departments (
dept_id INT PRIMARY KEY,
dept_name VARCHAR(50)
);
CREATE TABLE employees (
emp_id INT PRIMARY KEY,
emp_name VARCHAR(50),
dept_id INT,
salary DECIMAL(10, 2),
FOREIGN KEY (dept_id) REFERENCES departments(dept_id)
);
2. 插入数据
向departments
表插入两条记录:
- 部门 ID:1,部门名称:' 销售部'
- 部门 ID:2,部门名称:' 技术部'
sql
INSERT INTO departments (dept_id, dept_name) VALUES (1, '销售部'), (2, '技术部');
3. 查询操作
查询employees
表中工资大于 8000 的员工姓名和部门名称。
sql
SELECT e.emp_name, d.dept_name
FROM employees e
JOIN departments d ON e.dept_id = d.dept_id
WHERE e.salary > 8000;
4. 聚合查询
统计每个部门的平均工资,并按平均工资降序排列。
sql
SELECT d.dept_name, AVG(e.salary) AS avg_salary
FROM employees e
JOIN departments d ON e.dept_id = d.dept_id
GROUP BY d.dept_name
ORDER BY avg_salary DESC;
5. 更新数据
将employees
表中部门 ID 为 1 的所有员工工资提高 10%。
sql
UPDATE employees
SET salary = salary * 1.1
WHERE dept_id = 1;
6. 删除数据
删除employees
表中工资低于 5000 的员工记录。
sql
DELETE FROM employees WHERE salary < 5000;
7. 创建视图
创建一个视图employee_salary_view
,显示员工姓名、部门名称和工资。
sql
CREATE VIEW employee_salary_view AS
SELECT e.emp_name, d.dept_name, e.salary
FROM employees e
JOIN departments d ON e.dept_id = d.dept_id;
8. 事务操作
使用事务向departments
表插入新部门,同时向employees
表插入该部门的员工,若任一操作失败则全部回滚。
sql
START TRANSACTION;
INSERT INTO departments (dept_id, dept_name) VALUES (3, '市场部');
INSERT INTO employees (emp_id, emp_name, dept_id, salary) VALUES (101, 'Tom', 3, 7000);
COMMIT; -- 若成功提交,若失败则需手动ROLLBACK
9. 存储过程
创建一个存储过程,接收部门 ID 作为参数,返回该部门的员工总数。
sql
DELIMITER //
CREATE PROCEDURE get_employee_count(IN p_dept_id INT, OUT count INT)
BEGIN
SELECT COUNT(*) INTO count FROM employees WHERE dept_id = p_dept_id;
END //
DELIMITER ;
-- 调用存储过程
SET @total_count = 0;
CALL get_employee_count(1, @total_count);
SELECT @total_count;