SQL(Structured Query Language)是数据库管理中不可或缺的一部分,因此在技术面试中经常会被问到与 SQL 相关的问题。以下是一些常见的 SQL 面试题及其答案。
基础概念
-
什么是 SQL?
-
SQL 的主要命令类型有哪些?
-
什么是主键和外键?
- 主键(Primary Key):唯一标识表中每一行的字段,不允许为空且必须唯一。
- 外键(Foreign Key):用于建立和加强两个表数据之间的链接,通常引用另一个表的主键。
常见查询
-
如何查询表中的所有记录?
sql">SELECT * FROM table_name;
-
如何查询表中的特定列?
sql">SELECT column1, column2 FROM table_name;
-
如何对查询结果进行排序?
sql">SELECT * FROM table_name ORDER BY column1 ASC; -- 升序 SELECT * FROM table_name ORDER BY column1 DESC; -- 降序
-
如何使用条件查询?
sql">SELECT * FROM table_name WHERE condition;
-
如何使用
LIKE
进行模糊查询?sql">SELECT * FROM table_name WHERE column LIKE '%pattern%';
聚合函数
-
常见的聚合函数有哪些?
COUNT()
: 计算行数。SUM()
: 计算总和。AVG()
: 计算平均值。MAX()
: 返回最大值。MIN()
: 返回最小值。
-
如何使用
GROUP BY
和HAVING
?sql">SELECT department, COUNT(*) AS num_employees FROM employees GROUP BY department HAVING COUNT(*) > 5;
子查询
-
什么是子查询?
- 子查询是在另一个查询语句内部的查询语句。子查询可以嵌套在
SELECT
,INSERT
,UPDATE
,DELETE
语句中。
- 子查询是在另一个查询语句内部的查询语句。子查询可以嵌套在
-
如何使用子查询?
sql">SELECT * FROM employees WHERE salary > (SELECT AVG(salary) FROM employees);
连接(JOIN)
-
常见的连接类型有哪些?
- 内连接(INNER JOIN):返回两个表中匹配的记录。
- 左连接(LEFT JOIN):返回左表中的所有记录,以及右表中匹配的记录。如果右表中没有匹配的记录,则返回 NULL。
- 右连接(RIGHT JOIN):返回右表中的所有记录,以及左表中匹配的记录。如果左表中没有匹配的记录,则返回 NULL。
- 全连接(FULL JOIN):返回两个表中的所有记录,如果没有匹配的记录,则返回 NULL。
-
如何使用 INNER JOIN?
sql">SELECT * FROM employees INNER JOIN departments ON employees.department_id = departments.department_id;
-
如何使用 LEFT JOIN?
sql">SELECT * FROM employees LEFT JOIN departments ON employees.department_id = departments.department_id;
索引
-
什么是索引?
- 索引是一种数据库结构,用于加快数据检索的速度。索引可以基于一个或多个列创建。
-
如何创建索引?
sql">CREATE INDEX index_name ON table_name (column1, column2);
事务
-
什么是事务?
- 事务是一组 SQL 语句,作为一个整体一起执行。事务具有 ACID 特性:原子性(Atomicity)、一致性(Consistency)、隔离性(Isolation)、持久性(Durability)。
-
如何使用事务?
sql">BEGIN TRANSACTION; UPDATE accounts SET balance = balance - 100 WHERE account_id = 1; UPDATE accounts SET balance = balance + 100 WHERE account_id = 2; COMMIT;
视图
-
什么是视图?
- 视图是一个虚拟表,其内容由查询定义。视图可以简化复杂的查询,提高数据的安全性。
-
如何创建视图?
sql">CREATE VIEW view_name AS SELECT column1, column2 FROM table_name WHERE condition;
高级查询
-
如何使用
UNION
合并查询结果?sql">SELECT column1 FROM table1 UNION SELECT column1 FROM table2;
-
如何使用
CASE
语句进行条件判断?sql">SELECT column1, CASE WHEN column2 > 10 THEN 'High' WHEN column2 <= 10 THEN 'Low' ELSE 'Unknown' END AS status FROM table_name;
示例问题
-
如何查询每个部门的员工数量?
sql">SELECT department, COUNT(*) AS num_employees FROM employees GROUP BY department;
-
如何查询工资最高的前 5 名员工?
sql">SELECT * FROM employees ORDER BY salary DESC LIMIT 5;
-
如何查询每个部门的平均工资?
sql">SELECT department, AVG(salary) AS avg_salary FROM employees GROUP BY department;