SQL Server 面试题
本文总结了 SQL Server 相关的知识点,涵盖了 SQL 语句的编写、查询优化、表合并、union 和 union all 的区别等内容。
一、查询优化
在 SQL Server 中,查询优化是非常重要的。通过编写高效的 SQL 语句,可以大大提高查询速度。例如,使用索引、优化查询顺序、减少 JOIN 操作等方法可以提高查询效率。
二、查询员工信息
在员工信息表中,需要查询出每门课都大于 80 分的学生姓名。可以使用以下两种方法:
方法一:
```sql
select distinct name from stu where name not in (select distinct name from stu where fenshu <= 80)
```
方法二:
```sql
select name from stu group by name having count(kecheng) >= 3 and min(fenshu) >= 80
```
这两种方法都可以达到相同的目的,即查询出每门课都大于 80 分的学生姓名。
三、合并列
在某些情况下,需要将两列合并为一列。例如,从 FullName 或 FirstName 列中找出不为空的雇员的名字。可以使用 CASE 语句来实现:
```sql
SELECT Name = CASE WHEN EMPLOYEE.FullName IS NOT NULL THEN EMPLOYEE.FullName WHEN EMPLOYEE.FirstName IS NOT NULL THEN EMPLOYEE.FirstName END FROM EMPLOYEE
```
这条语句将从 FullName 和 FirstName 列中找出不为空的雇员名字,并将其合并为一列。
四、表合并
在某些情况下,需要将多个表合并为一个表。可以使用 UNION 或 UNION ALL 语句来实现。例如:
```sql
create table tb1 (
姓名 varchar(10),
语文 int,
数学 int,
物理 int
)
insert into tb1 (姓名, 语文, 数学, 物理) values ('张三', 74, 83, 93)
insert into tb1 (姓名, 语文, 数学, 物理) values ('李四', 74, 84, 94)
select * from (
select 姓名 as Name, Subject = '语文', Result = 语文 from tb1
union all
select 姓名 as Name, Subject = '数学', Result = 数学 from tb1
union all
select 姓名 as Name, Subject = '物理', Result = 物理 from tb1
) t
order by Name, case Subject when '语文' then 1 when '数学' then 2 when '物理' then 3 end
```
这条语句将 tb1 表中的数据合并为一个表,并将每个科目的成绩合并为一列。
五、union 和 union all 的区别
union 和 union all 都是将两个结果集合并为一个,但它们在使用和效率上有所不同。union 在进行表链接后会筛选掉重复的记录,所以在表链接后会对所产生的结果集进行排序运算,删除重复的记录再返回结果。而 union all 只是简单的将两个结果合并后就返回。从效率上说,union all 要比 union 快很多。
因此,如果可以确认合并的两个结果集中不包含重复的数据,那么就使用 union all。
六、使用 union 组合查询的结果集
使用 union 组合查询的结果集有两个最基本的规则:
1. 所有查询中的列数和列的顺序必须相同。
2. 数据类型必须兼容。