MySQL期末复习题

一、选择题(30 题)

  1. 在 MySQL 中,存储引擎InnoDBMyISAM的主要区别在于( )
    A. InnoDB支持事务和外键,MyISAM不支持
    B. MyISAM支持事务,InnoDB不支持
    C. InnoDB占用空间更小
    D. MyISAM查询速度更慢
    答案:A

  2. 执行CREATE TABLE语句时,以下哪个关键字用于定义主键约束?( )
    A. UNIQUE
    B. PRIMARY KEY
    C. FOREIGN KEY
    D. CHECK
    答案:B

  3. 若要查询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

  4. 以下哪个函数用于统计表中的记录数?( )
    A. SUM()
    B. AVG()
    C. COUNT()
    D. MAX()
    答案:C

  5. 执行DELETE FROM table_name;TRUNCATE TABLE table_name;的主要区别是( )
    A. DELETE保留自增主键计数,TRUNCATE重置计数
    B. TRUNCATE支持事务回滚,DELETE不支持
    C. DELETE删除速度更快
    D. 两者功能完全相同
    答案:A

  6. 多表连接时,LEFT JOIN的作用是( )
    A. 返回两表中完全匹配的行
    B. 返回左表所有行及右表匹配行
    C. 返回右表所有行及左表匹配行
    D. 返回两表中不匹配的行
    答案:B

  7. 若要修改数据库用户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

  8. 以下哪个数据类型适合存储短文本(长度固定)?( )
    A. VARCHAR
    B. TEXT
    C. CHAR
    D. BLOB
    答案:C

  9. 执行SELECT DISTINCT column1 FROM table1;的作用是( )
    A. 查询column1列的所有重复值
    B. 查询column1列的唯一值
    C. 按column1列升序排序
    D. 按column1列降序排序
    答案:B

  10. 事务的四个特性(ACID)不包括以下哪一项?( )
    A. 原子性(Atomicity)
    B. 一致性(Consistency)
    C. 并发性(Concurrency)
    D. 持久性(Durability)
    答案:C

  11. 若要给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

  12. 执行INSERT INTO table1 (col1, col2) VALUES (1, 'abc');时,若col1为自增列且已存在值 1,会( )
    A. 插入成功,col1值为 1
    B. 插入失败,主键冲突
    C. col1自动生成值 2
    D. 插入空值
    答案:B

  13. 以下关于索引的说法,正确的是( )
    A. 索引越多查询效率越高
    B. 索引会降低数据插入和更新的速度
    C. 全文索引只能用于CHAR类型字段
    D. 索引不占用磁盘空间
    答案:B

  14. 若要查询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

  15. 执行CREATE VIEW view_name AS SELECT column1, column2 FROM table1;后,view_name是( )
    A. 实际存储数据的物理表
    B. 基于table1的虚拟表
    C. 无法被修改的只读表
    D. 独立于table1的新表
    答案:B

  16. 以下哪个操作符用于查询包含指定值列表的记录?( )
    A. LIKE
    B. BETWEEN
    C. IN
    D. NOT
    答案:C

  17. 若要删除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

  18. 执行SELECT AVG(salary) FROM employees WHERE department = 'IT';的作用是( )
    A. 查询IT部门员工的总工资
    B. 查询IT部门员工的平均工资
    C. 查询所有员工的平均工资
    D. 查询IT部门员工的最高工资
    答案:B

  19. 以下关于视图的描述,错误的是( )
    A. 视图可以简化复杂查询
    B. 修改视图可能影响基表数据
    C. 视图不能嵌套使用
    D. 视图不存储实际数据
    答案:C

  20. 若要查询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

  21. 执行GRANT SELECT, INSERT ON database1.* TO 'user1'@'localhost';的作用是( )
    A. 赋予user1database1所有表的查询和插入权限
    B. 赋予user1database1所有表的查询、插入和删除权限
    C. 赋予user1database1所有表的所有权限
    D. 赋予user1database1指定表的查询和插入权限
    答案:A

  22. 以下哪个数据类型适合存储日期和时间(精确到秒)?( )
    A. DATE
    B. TIME
    C. DATETIME
    D. YEAR
    答案:C

  23. 执行SAVEPOINT point1;ROLLBACK TO point1;的作用是( )
    A. 保存事务点并回滚到该点
    B. 提交事务到指定点
    C. 删除事务点
    D. 创建新事务
    答案:A

  24. 若要查询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

  25. 执行CREATE INDEX idx_name ON students (name);的作用是( )
    A. 创建名为idx_name的唯一索引
    B. 创建名为idx_name的普通索引
    C. 创建名为idx_name的全文索引
    D. 删除名为idx_name的索引
    答案:B

  26. 以下关于UNION操作的描述,正确的是( )
    A. UNION会保留重复记录
    B. UNION ALL会去除重复记录
    C. UNION要求两个查询的列数和数据类型一致
    D. UNION只能用于两个表之间的合并
    答案:C

  27. 若要查询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

  28. 执行ALTER TABLE table1 CHANGE column1 new_column1 VARCHAR(50);的作用是( )
    A. 删除column1列并创建new_column1
    B. 修改column1列的名称和数据类型
    C. 仅修改column1列的名称
    D. 仅修改column1列的数据类型
    答案:B

  29. 以下哪个函数用于将字符串转换为大写?( )
    A. LOWER()
    B. UPPER()
    C. CONCAT()
    D. SUBSTRING()
    答案:B

  30. 若要查询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 题)

  1. MySQL 默认的端口号是 3306
  2. 创建表时,使用 CREATE TABLE 语句。
  3. VARCHAR数据类型用于存储 可变长度字符串
  4. 数据库中用于连接两个表的字段称为 外键
  5. 执行COMMIT命令会 提交 事务中的所有操作。
  6. 若要查询表结构,可使用 DESCRIBE 或 DESC 命令。
  7. 聚合函数SUM()用于计算 数值列的总和
  8. 存储引擎MyISAM 不支持 事务和外键。
  9. LIKE关键字配合 %(通配符)查询包含指定字符的字符串。
  10. GROUP BY子句通常与 聚合函数 一起使用。
  11. 执行ALTER TABLE语句时,DROP COLUMN用于 删除列
  12. 数据库的完整性约束包括 主键约束外键约束唯一约束 等。
  13. 时间函数NOW()返回 当前日期和时间
  14. TRUNCATE TABLE会 删除表中所有数据并重置自增主键
  15. 若要创建数据库用户,可使用 CREATE USER 语句。
  16. 多表连接的类型包括 INNER JOINLEFT JOINRIGHT JOIN 等。
  17. 执行SAVEPOINT命令可在事务中创建 保存点
  18. 全文索引使用 MATCH AGAINST 语法进行搜索。
  19. HAVING子句用于对 分组结果 进行筛选。
  20. 数据库备份工具 mysqldump 可用于导出数据库数据和结构。

三、编程题(10 题)

1. 创建数据库和表

创建数据库company,并在其中创建两张表:

  • departments(部门 ID dept_id(主键),部门名称 dept_name
  • employees(员工 ID emp_id(主键),员工姓名 emp_name,部门 ID dept_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;

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值