SQL面试题及详细答案150道(01-20) --- 基础概念与语法篇
《前后端面试题
》专栏集合了前后端各个知识模块的面试题,包括html,javascript,css,vue,react,java,Openlayers,leaflet,cesium,mapboxGL,threejs,nodejs,mangoDB,MySQL,Linux… 。
文章目录
- 一、本文面试题目录
- 1. 什么是SQL?它的主要功能是什么?
- 2. SQL分为哪几类?请分别举例说明。
- 3. 关系型数据库的核心特点是什么?列举3个常见的关系型数据库。
- 4. 解释“表、字段、记录、主键、外键”的概念。
- 5. 主键和唯一键的区别是什么?
- 6. 什么是索引?索引的作用是什么?
- 7. 写出SQL中单行注释和多行注释的方式。
- 8. 什么是视图?视图的优缺点是什么?
- 9. 什么是存储过程?存储过程和函数的区别是什么?
- 10. 什么是触发器?触发器的触发时机有哪些?
- 11. 数据库中“事务”的定义是什么?
- 12. 什么是ACID特性?请分别解释。
- 13. 常见的数据库字段类型有哪些?(至少列举5种)
- 14. VARCHAR和CHAR的区别是什么?如何选择?
- 15. DATE、DATETIME、TIMESTAMP的区别是什么?
- 16. 什么是NULL值?为什么不能用“=NULL”判断空值?
- 17. 什么是约束?常见的约束类型有哪些?
- 18. 什么是数据库范式?第一范式(1NF)的要求是什么?
- 19. 什么是外键约束?外键的作用是什么?
- 20. 简述SQL的执行顺序(例如:FROM、WHERE、SELECT的执行先后)。
- 二、150道面试题目录列表
一、本文面试题目录
1. 什么是SQL?它的主要功能是什么?
- 原理说明:SQL(Structured Query Language,结构化查询语言)是一种用于管理关系型数据库的标准化语言。它通过统一的语法实现对数据库的操作,不依赖于特定数据库系统,但不同数据库可能会有少量扩展。
- 主要功能:
- 数据查询(从数据库中检索所需数据);
- 数据操纵(插入、更新、删除数据库中的数据);
- 数据定义(创建、修改、删除数据库对象,如表、视图等);
- 数据控制(设置用户对数据库对象的访问权限)。
2. SQL分为哪几类?请分别举例说明。
- 原理说明:SQL根据功能可分为四大类,每类对应不同的数据库操作场景。
- 分类及示例:
- 数据查询语言(DQL):用于查询数据,核心语句为
SELECT
。
示例:SELECT name, age FROM users WHERE age > 18;
- 数据操纵语言(DML):用于修改数据,包括
INSERT
、UPDATE
、DELETE
。
示例:INSERT INTO users (name, age) VALUES ('Alice', 20);
- 数据定义语言(DDL):用于创建或修改数据库对象,包括
CREATE
、ALTER
、DROP
。
示例:CREATE TABLE users (id INT PRIMARY KEY, name VARCHAR(50));
- 数据控制语言(DCL):用于权限管理,包括
GRANT
、REVOKE
。
示例:GRANT SELECT ON users TO 'user1'@'localhost';
- 数据查询语言(DQL):用于查询数据,核心语句为
3. 关系型数据库的核心特点是什么?列举3个常见的关系型数据库。
- 核心特点:
- 数据以表(二维表格)的形式存储,表由行(记录)和列(字段)组成;
- 表与表之间通过主键和外键建立关联,形成关系;
- 遵循ACID事务特性(原子性、一致性、隔离性、持久性);
- 支持SQL语言进行操作。
- 常见关系型数据库:MySQL、Oracle、SQL Server、PostgreSQL等。
4. 解释“表、字段、记录、主键、外键”的概念。
- 表(Table):数据库中存储数据的基本单位,由行和列组成,用于分类存储特定类型的数据(如“用户表”“订单表”)。
- 字段(Field):表中的列,代表数据的某个属性(如“用户表”中的“姓名”“年龄”),每个字段有对应的数据类型。
- 记录(Record):表中的行,代表一条完整的数据(如“用户表”中某一行对应一个用户的所有信息)。
- 主键(Primary Key):表中用于唯一标识每条记录的字段(或字段组合),特性:非空(NOT NULL)、唯一(UNIQUE),一个表只能有一个主键。
示例:CREATE TABLE users (id INT PRIMARY KEY, name VARCHAR(50));
(id
为主键) - 外键(Foreign Key):表中用于关联另一个表主键的字段,用于维护表之间的关系,确保数据一致性。
示例:CREATE TABLE orders (order_id INT PRIMARY KEY, user_id INT, FOREIGN KEY (user_id) REFERENCES users(id));
(user_id
为外键,关联users
表的id
)
5. 主键和唯一键的区别是什么?
区别 | 主键(Primary Key) | 唯一键(Unique Key) |
---|---|---|
非空性 | 不允许为NULL | 允许为NULL(但只能有一个NULL值) |
数量限制 | 一个表只能有一个主键 | 一个表可以有多个唯一键 |
索引类型 | 自动创建主键索引 | 自动创建唯一索引 |
作用 | 唯一标识记录,常作为外键关联依据 | 确保字段值唯一,无标识记录的作用 |
示例:
-- 主键(非空、唯一)
CREATE TABLE students (id INT PRIMARY KEY, name VARCHAR(50));-- 唯一键(允许NULL,可多个)
CREATE TABLE students (id INT PRIMARY KEY,email VARCHAR(50) UNIQUE, -- 唯一键,不允许重复phone VARCHAR(20) UNIQUE -- 另一个唯一键
);
6. 什么是索引?索引的作用是什么?
- 原理说明:索引是数据库中用于提高查询效率的数据结构(如B树、哈希表),它基于表中的一个或多个字段创建,类似于书籍的目录。
- 作用:
- 加快查询速度:通过索引可直接定位数据位置,避免全表扫描;
- 加速排序和分组操作:索引本身有序,可减少排序开销。
- 注意:索引会增加写入(INSERT/UPDATE/DELETE)的开销(需维护索引结构),并非越多越好。
示例:CREATE INDEX idx_users_age ON users(age);
(为users
表的age
字段创建索引)
7. 写出SQL中单行注释和多行注释的方式。
- 单行注释:使用
--
(后面需加空格)或#
(MySQL特有)。
示例:SELECT * FROM users; -- 查询所有用户(单行注释) # 这也是单行注释(仅MySQL支持)
- 多行注释:使用
/* */
包裹。
示例:/* 这是多行注释用于解释复杂的SQL语句 */ SELECT name, age FROM users WHERE age > 18;
8. 什么是视图?视图的优缺点是什么?
- 原理说明:视图(View)是基于查询结果的虚拟表,本身不存储数据,数据来源于底层的基表。
- 优点:
- 简化查询:将复杂查询封装为视图,用户可直接查询视图;
- 安全性:只暴露视图中的字段,隐藏基表的敏感信息;
- 逻辑独立性:基表结构变化时,可通过修改视图保持查询语句不变。
- 缺点:
- 性能较差:查询视图本质是执行底层SQL,复杂视图可能效率低;
- 可写性有限:多数视图不支持插入、更新、删除操作(或有严格限制)。
示例:
-- 创建视图(查询成年用户) CREATE VIEW adult_users AS SELECT id, name FROM users WHERE age >= 18;-- 查询视图 SELECT * FROM adult_users;
9. 什么是存储过程?存储过程和函数的区别是什么?
-
存储过程:是预编译并存储在数据库中的一组SQL语句集合,可通过调用名称执行,用于完成特定功能(如复杂的数据处理)。
示例(MySQL):CREATE PROCEDURE get_user(IN user_id INT) BEGINSELECT * FROM users WHERE id = user_id; END;-- 调用存储过程 CALL get_user(1);
-
存储过程与函数的区别:
区别 存储过程(Procedure) 函数(Function) 返回值 可以有多个返回值,或无返回值 必须有且仅有一个返回值 调用方式 使用 CALL
语句调用可在SQL语句中直接使用(如 SELECT func()
)用途 完成复杂操作(如增删改查组合) 主要用于计算并返回结果 事务支持 可以包含事务控制语句 一般不包含事务控制语句
10. 什么是触发器?触发器的触发时机有哪些?
- 原理说明:触发器(Trigger)是一种特殊的存储过程,当表发生特定事件(如INSERT、UPDATE、DELETE)时自动执行,用于强制业务规则或数据一致性。
- 触发时机:
BEFORE
:事件发生前执行(如BEFORE INSERT
);AFTER
:事件发生后执行(如AFTER UPDATE
)。
- 示例(MySQL):
-- 当插入新用户时,自动记录创建时间 CREATE TRIGGER set_create_time BEFORE INSERT ON users FOR EACH ROW SET NEW.create_time = NOW();
No. | 大剑师精品GIS教程推荐 |
---|---|
0 | 地图渲染基础- 【WebGL 教程】 - 【Canvas 教程】 - 【SVG 教程】 |
1 | Openlayers 【入门教程】 - 【源代码+示例 300+】 |
2 | Leaflet 【入门教程】 - 【源代码+图文示例 150+】 |
3 | MapboxGL 【入门教程】 - 【源代码+图文示例150+】 |
4 | Cesium 【入门教程】 - 【源代码+综合教程 200+】 |
5 | threejs 【中文API】 - 【源代码+图文示例200+】 |
6 | Shader 编程 【图文示例 100+】 |
11. 数据库中“事务”的定义是什么?
- 原理说明:事务(Transaction)是一组不可分割的SQL操作序列,这些操作要么全部成功执行,要么全部失败回滚,以保证数据的一致性。
- 示例:转账操作中,“扣除A的余额”和“增加B的余额”必须作为一个事务,避免出现一方成功、一方失败的情况。
BEGIN TRANSACTION; -- 开始事务 UPDATE accounts SET balance = balance - 100 WHERE id = 1; -- A扣钱 UPDATE accounts SET balance = balance + 100 WHERE id = 2; -- B加钱 COMMIT; -- 提交事务(全部成功) -- 若中间出错,执行 ROLLBACK; 回滚到事务开始前的状态
12. 什么是ACID特性?请分别解释。
- ACID是事务的四大特性,确保数据操作的可靠性:
- 原子性(Atomicity):事务中的操作要么全部完成,要么全部不完成,不存在部分执行的情况。例如:转账失败时,双方余额均不变化。
- 一致性(Consistency):事务执行前后,数据库从一个一致状态变为另一个一致状态(符合业务规则)。例如:转账前后,总余额保持不变。
- 隔离性(Isolation):多个事务并发执行时,彼此不干扰,每个事务都感觉不到其他事务的存在。
- 持久性(Durability):事务提交后,对数据的修改永久保存,即使系统崩溃也不会丢失。
13. 常见的数据库字段类型有哪些?(至少列举5种)
- 常见字段类型及用途:
- INT:整数类型(如
INT
、BIGINT
,用于存储年龄、数量等); - VARCHAR(n):可变长度字符串(如
VARCHAR(50)
,用于存储姓名、地址等,长度按需分配); - CHAR(n):固定长度字符串(如
CHAR(10)
,用于存储身份证号等长度固定的数据); - DATE:日期类型(格式
YYYY-MM-DD
,存储生日、订单日期等); - DATETIME:日期时间类型(格式
YYYY-MM-DD HH:MM:SS
,存储精确到秒的时间); - DECIMAL(m,n):精确小数类型(如
DECIMAL(10,2)
,用于存储金额,避免浮点数误差); - BOOLEAN:布尔类型(存储
TRUE
或FALSE
,如“是否激活”)。
- INT:整数类型(如
14. VARCHAR和CHAR的区别是什么?如何选择?
- 区别:
- 存储方式:
VARCHAR
是可变长度,只占用实际数据长度 + 1-2字节(用于记录长度);CHAR
是固定长度,无论实际数据长度如何,均占用指定长度的空间。 - 适用场景:
VARCHAR
适合长度不固定的数据(如姓名、备注);CHAR
适合长度固定的数据(如手机号、性别(‘男’/‘女’))。
- 存储方式:
- 示例:
VARCHAR(10)
存储“abc”时,实际占用4字节(3字节数据 + 1字节长度标识);CHAR(10)
存储“abc”时,占用10字节(自动用空格填充剩余7字节)。
15. DATE、DATETIME、TIMESTAMP的区别是什么?
类型 | 格式 | 范围 | 时区敏感性 | 存储大小 |
---|---|---|---|---|
DATE | YYYY-MM-DD | 1000-01-01 至 9999-12-31 | 不敏感 | 3字节 |
DATETIME | YYYY-MM-DD HH:MM:SS | 1000-01-01 00:00:00 至 9999-12-31 23:59:59 | 不敏感 | 8字节 |
TIMESTAMP | YYYY-MM-DD HH:MM:SS | 1970-01-01 00:00:01 至 2038-01-19 03:14:07 | 敏感(自动转换时区) | 4字节 |
- 选择建议:
- 仅需日期:
DATE
(如生日); - 需日期时间且跨时区:
TIMESTAMP
(如日志时间); - 需更大时间范围且不考虑时区:
DATETIME
(如历史记录)。
- 仅需日期:
16. 什么是NULL值?为什么不能用“=NULL”判断空值?
- NULL值:表示字段值未知或不存在,不同于空字符串(‘’)或0,NULL代表“无意义”。
- 不能用“=NULL”的原因:SQL中,NULL不等于任何值(包括自身),判断NULL需用
IS NULL
或IS NOT NULL
。
示例:-- 正确:查询name为NULL的记录 SELECT * FROM users WHERE name IS NULL;-- 错误:以下语句永远返回空结果 SELECT * FROM users WHERE name = NULL;
17. 什么是约束?常见的约束类型有哪些?
- 约束:是数据库中用于限制字段值的规则,确保数据的完整性和一致性。
- 常见约束类型:
- PRIMARY KEY:主键约束(唯一标识记录,非空且唯一);
- UNIQUE:唯一约束(字段值唯一,允许NULL);
- NOT NULL:非空约束(字段值不能为NULL);
- FOREIGN KEY:外键约束(关联其他表的主键,确保引用完整性);
- CHECK:检查约束(限制字段值的范围,如
age > 0
); - DEFAULT:默认值约束(字段未赋值时使用默认值)。
示例:
CREATE TABLE students (id INT PRIMARY KEY,name VARCHAR(50) NOT NULL,age INT CHECK (age > 0),gender CHAR(1) DEFAULT '男',class_id INT,FOREIGN KEY (class_id) REFERENCES classes(id) );
18. 什么是数据库范式?第一范式(1NF)的要求是什么?
- 数据库范式:是设计关系型数据库时遵循的规范,目的是减少数据冗余和异常(插入、更新、删除异常),常用的有1NF、2NF、3NF。
- 第一范式(1NF):要求表中每个字段都是不可分割的原子值,即字段不能再拆分为更小的子字段。
- 反例:“地址”字段存储“北京市海淀区XX街”,可拆分为“省份”“城市”等,不符合1NF;
- 正例:将“地址”拆分为“province”“city”“street”等字段,符合1NF。
19. 什么是外键约束?外键的作用是什么?
- 外键约束:是表中用于关联另一个表主键的字段约束,定义了两个表之间的父子关系(子表的外键引用父表的主键)。
- 作用:
- 确保数据引用完整性:子表的外键值必须是父表中存在的主键值(或NULL),避免无效引用;
- 级联操作支持:可配置删除或更新父表记录时,子表自动执行相应操作(如级联删除)。
示例:
-- 父表(班级) CREATE TABLE classes (class_id INT PRIMARY KEY, class_name VARCHAR(50));-- 子表(学生),外键关联班级 CREATE TABLE students (id INT PRIMARY KEY,name VARCHAR(50),class_id INT,FOREIGN KEY (class_id) REFERENCES classes(class_id) ON DELETE CASCADE -- 父表记录删除时,子表关联记录也删除 );
20. 简述SQL的执行顺序(例如:FROM、WHERE、SELECT的执行先后)。
-
SQL语句的执行顺序与书写顺序不同,核心步骤如下(以
SELECT
查询为例):FROM
:指定查询的表;JOIN
:关联其他表(若有);WHERE
:过滤行数据(基于条件);GROUP BY
:按指定字段分组;HAVING
:过滤分组后的结果(需与GROUP BY
配合);SELECT
:选择需要返回的字段;DISTINCT
:去重(若有);ORDER BY
:按指定字段排序;LIMIT/OFFSET
:限制返回的行数(若有)。
-
示例:
书写顺序:SELECT name, AVG(age) FROM users WHERE gender = '男' GROUP BY name HAVING AVG(age) > 20 ORDER BY AVG(age);
执行顺序:FROM → WHERE → GROUP BY → HAVING → SELECT → ORDER BY。
二、150道面试题目录列表
文章序号 | SQL面试题150道 |
---|---|
1 | SQL面试题及详细答案150道(01-20) |
2 | SQL面试题及详细答案150道(20-40) |
3 | SQL面试题及详细答案150道(41-60) |
4 | SQL面试题及详细答案150道(61-80) |
5 | SQL面试题及详细答案150道(81-100) |
6 | SQL面试题及详细答案150道(101-115) |
7 | SQL面试题及详细答案150道(116-135) |
8 | SQL面试题及详细答案150道(136-150) |