SQL 测试题

SQL 测试题

use TESTDB01
go

--//table 01
if (OBJECT_ID(N'ypTBS') is not null) 
drop table ypTBS
go

create table ypTBS(
recid int identity(1,1) primary key, --student id
sc varchar(10) not null default '', --code
sn varchar(50) null default '', -- name
sd varchar(250) null default '', -- company
se varchar(200) null default ''  -- email
)
go
insert ypTBS(sc,sn,sd,se) values('S001','张三','公司001','email01@163.com')
insert ypTBS(sc,sn,sd,se) values('S002','李四','公司002','email02@163.com')
insert ypTBS(sc,sn,sd,se) values('S003','王五','公司003','email03@163.com')
insert ypTBS(sc,sn,sd,se) values('S004','赵六','公司004','email04@163.com')
insert ypTBS(sc,sn,sd,se) values('S005','小明','公司005','email05@163.com')
select * from ypTBS
go

--//table 02
if(OBJECT_ID(N'ypTBC') is not null)
drop table ypTBC
go

create table ypTBC(
recid int identity(1,1) not null,
cc varchar(10) not null default '',
cn varchar(250) null default '',
primary key([recid])
)

insert into ypTBC(cc,cn) values('C01','音乐欣赏')
insert into ypTBC(cc,cn) values('C02','文学鉴赏')
insert into ypTBC(cc,cn) values('C03','地理信息')
insert into ypTBC(cc,cn) values('C04','历史学')
select * from ypTBC
go

--//table 03
if(OBJECT_ID(N'ypTBSC') is not null)
drop table ypTBSC
go

create table ypTBSC(
recid int identity(1,1) not null,
sc varchar(10) null,
cc varchar(10) null, 
fen int null,
)

insert into ypTBSC(sc,cc,fen) values('S001','C01',56)
insert into ypTBSC(sc,cc,fen) values('S001','C02',80)
insert into ypTBSC(sc,cc,fen) values('S001','C03',86)
insert into ypTBSC(sc,cc,fen) values('S001','C04',90)
insert into ypTBSC(sc,cc,fen) values('S002','C01',65)
insert into ypTBSC(sc,cc,fen) values('S003','C01',78)
insert into ypTBSC(sc,cc,fen) values('S002','C02',81)
insert into ypTBSC(sc,cc,fen) values('S002','C03',53)
insert into ypTBSC(sc,cc,fen) values('S003','C03',43)
insert into ypTBSC(sc,cc,fen) values('S004','C03',76)
insert into ypTBSC(sc,cc,fen) values('S004','C04',70)
insert into ypTBSC(sc,cc,fen) values('S005','C02',66)
insert into ypTBSC(sc,cc,fen) values('S005','C03',45)
insert into ypTBSC(sc,cc,fen) values('S005','C04',50)

select * from ypTBSC
go

--//1,求出选择历史学的学生姓名和所属单位
select sn,sd from ypTBS where sc in(
select sc from ypTBSC where cc = (select cc from ypTBC where cn = '历史学')
) 

/*
--数据验证分解
select cc from ypTBC where cn = '历史学'
select sc from ypTBSC where cc = 'C04'
select sn,sd from ypTBS where sc in ('S001','S002','S003')
*/

--//2,求出选修课程代号为 C01 的学生姓名和所属单位
select sn,sd from ypTBS where sc in(
	select sc from YPTBSC where cc = 'C01' 
)

/*
--数据验证分解
select sc from ypTBSC where cc = 'C01'
select sn,sd from ypTBS where sc in ('S001','S002','S003')
*/

--//3,求出选修课程数超过2门的学生学号和姓名
select sc,sn from yptbs where sc in (
	select sc from (
		select sc, COUNT(cc) as xcc from yptbsc group by sc having COUNT(cc) > 2
	) tb
)

/*
--数据验证分解
select sc,count(cc) as xcc from yptbsc group by sc 
select sc,count(cc) as xcc from yptbsc group by sc having count(cc) >2
select sc from( 
	select sc,count(cc) as xcc  from yptbsc group by sc having count(cc) >2
) tb
*/

--//4,求出选修全部课程的学生学号和姓名
select sc,sn from yptbs where sc in(
	select sc from(
		select sc,count(cc) as xcc from yptbsc group by sc having count(cc) = (
			select COUNT(*) as cnum from yptbc 
		)
	) tb1
)

/*
--数据验证分解
select COUNT(*) as cnum from yptbc --求课程总数
select sc,count(cc) as cc from yptbsc group by sc --依学号汇总,课程数作为汇总条件
select sc,count(cc) as xcc from yptbsc group by sc having count(cc) = 4 --求修所有课程的学生
select sc,count(cc) as xcc from yptbsc group by sc having count(cc) = ( --动态求出修所有课程的学生
	select COUNT(*) as cnum from yptbc 
) 
select sc from (  --取出修所有课程学生的学号
	select sc,count(cc) as xcc from yptbsc group by sc having count(cc) = (
		select COUNT(*) as cnum from yptbc 
	)
) subsc
*/

--//5,求出两门(含两门)以上课程不及格课程的学生学号和姓名
select sc, sn from yptbs where sc in(
	select sc from (
		select sc, COUNT(cc) as xcc from yptbsc where fen < 60 group by sc having count(cc) >= 2
	)tb5
)	

/*
--数据验证分解
--小于60分的(百分制)学号和课程		
select sc,cc as xcc from yptbsc where fen < 60 

--以课程数位大于1为条件对学号进行汇总
select sc,count(cc) as xcc from yptbsc where fen < 60  group by sc having count(cc) >= 2 

--求出两门(含)以上不及格的学号
select sc from (
	select sc,count(cc) as xcc from yptbsc where fen < 60  group by sc having count(cc) >= 2 
) tb5
*/

提供参考......



<think>好的,用户想要找SQL相关的测试题来练习。首先,我需要确认用户的需求是什么。他们可能正在学习SQL,需要一些练习题来巩固知识。根据用户提供的引用内容,他们之前接触过SQL练习48题和一些表连接的练习题,所以可能希望更多类似的题目,特别是涉及不同难度和常见考点的题目。 接下来,我需要整理已有的引用内容。引用[1]提到的是SQL练习48题,包括建表和数据准备,而引用[2]给出了一些具体的表连接练习题,比如查询相同部门的员工信息和使用不同的方法解决。这说明用户可能对表连接、子查询、聚合函数等基础操作感兴趣,同时也可能需要建表和数据插入的练习题。 用户可能没有明确说出他们需要哪些具体类型的题目,但根据提供的例子,可以推测他们需要涵盖基础查询、连接、子查询、聚合函数、分组、条件过滤等方面的题目。此外,可能还需要一些进阶题目,比如窗口函数、复杂连接、数据修改操作等,以全面提升SQL技能。 接下来,我需要生成相关问题,确保覆盖不同的知识点。例如,基础查询部分可以包括选择特定列、条件查询;表连接部分可以设计内连接、外连接的应用;子查询部分可以涉及IN、EXISTS的使用;聚合函数部分可能需要计算总和、平均值,并结合分组和过滤条件。另外,数据定义语言(DDL)和数据操作语言(DML)的题目也是必要的,比如创建表、插入数据、更新和删除记录。 还需要考虑题目的难度梯度,从简单到复杂,逐步提升用户的解题能力。例如,从简单的单表查询开始,逐步过渡到多表连接和复杂子查询。此外,可以加入一些实际应用场景的问题,如销售数据分析、员工部门管理,这样用户可以将SQL知识应用到实际问题中。 最后,确保每个问题都有明确的解答思路,帮助用户理解如何一步步解决问题,而不仅仅是提供答案。同时,需要检查引用内容中的例子是否符合用户的需求,比如引用[2]中的两种方法解决同一问题,这可能提示用户希望看到不同的解决方法,因此在设计题目时也可以考虑这种多解的情况。 总结来说,用户需要一套全面、有层次、涵盖SQL各个知识点的练习题,帮助他们在实践中掌握和巩固SQL技能。需要确保题目类型多样,难度适中,并附有详细的解答思路,以满足不同层次的学习需求。</think>### SQL测试题精选集(含解答思路) 以下提供20道涵盖基础到进阶的SQL练习题,分为四个难度等,并附带典型考点解析: 一、基础查询(单表操作) 1. 查询`employees`表中所有月薪超过10000的员工姓名和部门编号 ```sql SELECT ename, deptno FROM employees WHERE salary > 10000; ``` *考点:基本选择语句、条件过滤* 2. 显示`products`表中价格在50到200元之间的商品名称,按价格降序排列 ```sql SELECT product_name FROM products WHERE price BETWEEN 50 AND 200 ORDER BY price DESC; ``` *考点:范围查询、排序控制* 二、表连接应用 3. 查询每个部门的名称及其经理的姓名(使用内连接) ```sql SELECT d.dname, e.ename FROM departments d JOIN employees e ON d.manager_id = e.empno; ``` *考点:表别名使用、内连接语法* 4. 统计每个城市的客户数量(客户表与城市表通过city_id关联) ```sql SELECT c.city_name, COUNT(*) AS client_count FROM clients cl RIGHT JOIN cities c ON cl.city_id = c.city_id GROUP BY c.city_name; ``` *考点:外连接应用、聚合函数* 三、子查询进阶 5. 查询没有订单记录的客户信息(两种方法) ```sql -- 方法1:NOT IN SELECT * FROM clients WHERE client_id NOT IN (SELECT DISTINCT client_id FROM orders); -- 方法2:LEFT JOIN SELECT c.* FROM clients c LEFT JOIN orders o ON c.client_id = o.client_id WHERE o.order_id IS NULL; ``` *考点:子查询优化、NULL值处理* 6. 找出销售额超过部门平均水平的员工 ```sql SELECT empname, sales_amount FROM ( SELECT empno, AVG(sales_amount) OVER (PARTITION BY deptno) AS dept_avg FROM sales_records ) AS sub JOIN employees e ON sub.empno = e.empno WHERE e.sales_amount > sub.dept_avg; ``` *考点:窗口函数、派生表* 四、综合应用 7. 创建学生成绩管理系统数据库(DDL) ```sql CREATE TABLE students ( stu_id INT PRIMARY KEY, name VARCHAR(50) NOT NULL, enrollment_date DATE DEFAULT GETDATE() ); CREATE TABLE courses ( course_id INT PRIMARY KEY, course_name VARCHAR(100) UNIQUE ); CREATE TABLE scores ( score_id INT IDENTITY(1,1), stu_id INT REFERENCES students(stu_id), course_id INT REFERENCES courses(course_id), score DECIMAL(5,2) CHECK (score BETWEEN 0 AND 100) ); ``` *考点:约束条件、关系建立* 8. 更新最近30天未登录用户的状态为"休眠" ```sql UPDATE users SET status = '休眠' WHERE last_login < DATEADD(day, -30, GETDATE()); ``` *考点:日期函数、批量更新* §§进阶练习§§ 1. 如何实现分页查询?写出兼容SQL Server和MySQL的语句 2. 什么是索引覆盖查询?如何优化大表连接性能? 3. 解释ACID原则在事务处理中的体现 4. 如何使用递归CTE处理树形结构数据? [^1]: 基础题库参考自SQL练习48题 [^2]: 表连接题型改编自经典面试题库
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值