SQL 笔试题

例子1:

现在有一个表 T_Order   ID(varchar(256)), ID为GUID       UserID(BigInt),      Price decimal(32,12),     OrderDate(Datetime)  OrderDate为可重复的DateTime

CREATE TABLE T_Order(
	[Id] [varchar](256) NOT NULL,
	[UserId] [bigint] NOT NULL,
	[Price] [decimal](32, 12) NOT NULL,
	[OrderDate] [datetime] NOT NULL
) 
INSERT INTO T_Order(Id,UserId,Price,OrderDate)VALUES(newid(),1,15000,'2018-01-20')
INSERT INTO T_Order(Id,UserId,Price,OrderDate)VALUES(newid(),1,15000,'2018-01-20')
INSERT INTO T_Order(Id,UserId,Price,OrderDate)VALUES(newid(),1,16000,'2018-01-20')
INSERT INTO T_Order(Id,UserId,Price,OrderDate)VALUES(newid(),2,17500,'2018-01-20')
INSERT INTO T_Order(Id,UserId,Price,OrderDate)VALUES(newid(),2,14000,'2018-02-19')
INSERT INTO T_Order(Id,UserId,Price,OrderDate)VALUES(newid(),2,19000,'2018-09-13')
INSERT INTO T_Order(Id,UserId,Price,OrderDate)VALUES(newid(),1,12000,'2018-09-16')
INSERT INTO T_Order(Id,UserId,Price,OrderDate)VALUES(newid(),1,18000,'2018-10-10')
INSERT INTO T_Order(Id,UserId,Price,OrderDate)VALUES(newid(),3,13500,'2018-11-17')
INSERT INTO T_Order(Id,UserId,Price,OrderDate)VALUES(newid(),3,25000,'2018-12-19')
INSERT INTO T_Order(Id,UserId,Price,OrderDate)VALUES(newid(),2,36000,'2018-12-19')
INSERT INTO T_Order(Id,UserId,Price,OrderDate)VALUES(newid(),1,48000,'2019-03-26')
INSERT INTO T_Order(Id,UserId,Price,OrderDate)VALUES(newid(),1,10500,'2019-04-30')

1>查询出每个用户最后一个订单的所有信息

思路:先在在每一行上加上一个行id,取名rowid 然后,然后根据UserId分组,取最大行的rowid的那条数据,这样就查询出了每个用户最后一个订单的rowid  这个表我们取名叫o ,然后再根据再在T_Order表中为每一行新增一个rowid,再来与 o表中的UserId和rowid来进行比对 这样就获取到了每个用户的最后一个订单的所有信息了

select t.Id,t.UserId,t.Price,t.OrderDate from (
select Row_Number() over(order by OrderDate asc) as rowid,* from T_Order) as t

join

(select o.UserId,MAX(o.rowid) as rowid from(
select Row_Number() over(order by OrderDate asc) as rowid,* from T_Order) as o
group by o.UserId) as oo

on t.rowid=oo.rowid and t.UserId=oo.UserId

order by UserId

2>查询出2018年份订单总金额前2名的UserId,订单总金额,并按照订单总金额排序

select top 2 t.UserId,t.TotalPrice  from (

select o.UserId, Sum(o.Price)as TotalPrice from ( 
select * from T_Order where OrderDate between '2018-01-01' and  '2018-12-31')as o
group by o.UserId ) as t

order by t.TotalPrice desc

3>删除重复的订单记录,并只保留订单中时间最小的一条,重复订单判断规则是 UserID,Price相同即认为重复

delete from T_Order where Id in(

select Id from T_Order a join (
select UserId,Price, MAX(OrderDate) as mindate from T_Order 
group by UserId,Price having count(1)>1 ) b
on a.OrderDate=b.mindate and a.Price=b.Price and a.UserId=b.UserId)

例子2

请分析下左表T_KC,写SQL实现下右表的效果

select top 3 * from (

select kind,max(code) as code from t_kc
group by kind) as t

order by t.code desc

例子3

有如下EMP表

1:统计各个部门的人数

select e.Department,count(e.Department)as Department  from EMP as e
group by e.Department

2:统计各个部门人数,且部门人数大于3

select e.Department,count(e.Department)as TotalNumber from EMP as e
group by e.Department
having count(e.Department)>3

3:性别转换

select Name,(case Sex when 'A' then '男'  when 'B' then '女' end) AS Sex,Department,Salary from EMP

4:工资Salary排名前三的人

select top 3 * from EMP 
order by Salary desc

5:工资Salary大于平均值的人

select * from EMP where Salary>(select AVG(Salary) from EMP)

或者写个存储过程

create proc Proc_Screen
as
declare @avgSalary int
select @avgSalary=AVG(Salary) from EMP
select * from EMP where Salary>@avgSalary

exec Proc_Screen

例子4

查询A表中存在ID字段值重复3次以上的记录

select id,name from A where id in(

select id from A group by id 
having count(id)>=3)

例子5

查询A(ID,Name)表中第31至40条记录,ID作为主键可能是不是连续增长的列

create proc proc_paging(@currentpage int,@pagesize int)
as
select top (@pagesize) ,ID,Name from (
select ROW_NUMBER() over(order by ID)as rowid,ID,Name from  A) t
where t.rowid>(@pagesize*(@currentpage-1))

exec proc_paging 4,10

 

### SQL 笔试题目及答案解析 以下是基于提供的参考资料整理的经典 SQL 笔试题及其答案解析: #### 题目 21 **问题**: 查询部门编号为 1 的员工姓名和工资。 ```sql SELECT name, salary FROM employees WHERE department_id = 1; ``` 此查询通过 `WHERE` 子句筛选出部门编号为 1 的记录,并返回对应的员工姓名 (`name`) 和工资 (`salary`) 列[^1]。 --- #### 题目 22 **问题**: 统计每个部门的平均工资并按降序排列。 ```sql SELECT department_id, AVG(salary) AS avg_salary FROM employees GROUP BY department_id ORDER BY avg_salary DESC; ``` 该语句利用聚合函数 `AVG()` 计算各部门的平均工资,同时使用 `GROUP BY` 对数据分组,并通过 `ORDER BY` 实现降序排序。 --- #### 题目 23 **问题**: 查找工资高于所有员工平均工资的员工信息。 ```sql SELECT * FROM employees WHERE salary > (SELECT AVG(salary) FROM employees); ``` 子查询 `(SELECT AVG(salary) FROM employees)` 返回所有员工的平均工资,外层查询则筛选出工资大于该值的员工记录。 --- #### 题目 24 **问题**: 找到入职日期最早的员工姓名和入职时间。 ```sql SELECT name, hire_date FROM employees WHERE hire_date = (SELECT MIN(hire_date) FROM employees); ``` 这里使用了嵌套查询中的 `MIN()` 函数来获取最早入职的时间,并匹配相应的员工信息。 --- #### 题目 25 **问题**: 显示每个职位的总人数以及对应职位名称。 ```sql SELECT job_title, COUNT(*) AS total_employees FROM jobs j JOIN employees e ON j.job_id = e.job_id GROUP BY job_title; ``` 上述代码展示了如何通过连接 (`JOIN`) 表格实现跨表查询,最终统计每种职位的人数。 --- #### 题目 26 **问题**: 获取薪资最高的前五名员工的信息。 ```sql SELECT * FROM employees ORDER BY salary DESC LIMIT 5; ``` 这条命令按照薪水从高到底排序,并限制结果集只显示前五个条目。 --- #### 题目 27 **问题**: 删除没有分配任何项目的员工记录。 ```sql DELETE FROM employees WHERE employee_id NOT IN (SELECT DISTINCT(employee_id) FROM projects); ``` 这里的逻辑是先找出参与过项目的所有员工 ID ,再删除那些不在列表里的员工记录。 --- #### 题目 28 **问题**: 更新某位特定员工的邮箱地址。 假设要更新的是员工ID为'101'的新邮件地址 'new.email@example.com' ```sql UPDATE employees SET email='new.email@example.com' WHERE employee_id=101; ``` 这是标准的数据修改操作语法。 --- #### 题目 29 **问题**: 插入一条新雇员的数据至数据库中。 假设有如下字段需填写:employee_id(唯一), name, salary, department_id. ```sql INSERT INTO employees (employee_id, name, salary, department_id) VALUES ('102', 'John Doe', 5000, 2); ``` 这是一次典型的插入动作示范。 --- #### 题目 30 **问题**: 将两个表格的内容联合起来展示,即使某些键不存在于另一方也应呈现出来(全外联接 Full Outer Join)。 如果存在两张分别存储不同部分客户资料的表A与B,则可以这样写: ```sql SELECT A.*, B.* FROM table_A A FULL OUTER JOIN table_B B ON A.key_column = B.key_column; ``` 注意并非所有的DBMS都支持FULL OUTER JOIN,在不兼容的情况下可能需要用UNION模拟. --- ### 总结 以上仅列举了一部分内容作为示例。更多深入练习可参照其他区间内的习题集合[^2]^[]^。对于准备技术面试或者提升SQL技能的人来说,这些案例非常有价值[^3]^[]^.
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值