学生成绩三个字段.用一个SQL查询语句得出每门功课成绩最好的前两名
学号 功课编号 学生成绩
1 1 99
2 1 98
3 1 100
4 2 88
5 2 87
6 2 88
7 3 99
8 3 88
9 3 100
解决方法
SELECT DISTINCT 学生表1.*
FROM 学生表 学生表1 INNER JOIN
学生表 学生表2 ON 学生表1.学号 IN
(SELECT TOP 2 学生表.学号
FROM 学生表
WHERE 学生表.功课编号 = 学生表1.功课编号
ORDER BY 学生成绩 DESC)
查询结果
学号 功课编号 学生成绩
1 1 99
2 1 98
4 2 88
6 2 88
7 3 99
9 3 100
同样的问题还有
查找不同课程成绩相同的学生的学号、课程号、学生成绩
例:
1.实现自连接,编写一个SELECT语句查询customers表中,地址相同的客户的'姓名'和'地址'
SELECT DISTINCT customers1.*
FROM customers customers1 where customers1.地址 IN
(SELECT customers.姓名,customers.地址
FROM customers
WHERE customers.地址 = customers1.地址)
2.建立查询,编写一个SELECT语句,查询所有购买了"book"货品的客户姓名,要求结果集中不存在重复的记
录
select distinct 客户姓名 from customers where 货品="book"
3.相关子查询 ,编写一个SELECT语句,查找订货数量大于该货品的平均订货数量的订单信息
select * from 订货表 where 订货表.订货数量>(select avg(订货数量) from 订货表)
4.修改表中数据,编写一条UPDATE语句,将所有库存量大于1000的货品价格降低10%
update 库存表 set 货品价格=货品价格*0.1 where 库存量>1000
5.删除表中记录,编写一条DELETE语句,删除orders表中2号部的订单信息
delete from orders where 订货单位=2号部
4.3 基于列表选择行,编写一条SELECT语句,从goods表中检索出货品名称为"pen","book","desk"的货品的"货品
名称","库存量","供应商"信息.
select 货品名称,库存量,供应商
from goods
where 出货品名称="pen" or 出货品名称="pen" or 出货品名称="desk"
4.4 改变结果集的列标题,用两种方法编写SELECT语句,从goods表检索出所有库存量大于等于1000且小于等于
2000的"货品名称","库存量","供应商"信息.列标题分别为"货品的名称","货品的库存量","货品的单价".
select 货品名称 as '货品的名称',库存量 as '货品的库存量',供应商 as '货品的单 价'
from goods
where 库存量>=1000 and 库存量<=2000
select 货品名称 as '货品的名称',库存量 as '货品的库存量',供应商 as '货品的单 价'
from goods having 库存量>=1000 and 库存量<=2000
4.5 使用算术运算符对结果集中的列进行计算,编写一条SELECT语句,显示goods表中所有货品的货品名称.价格和
折扣10%后的价格,使用别名"9折后的价格"标识被计算的列,查询结果按价格由高到低排序.
select 货品名称,价格,价格*0.9 as '9折后的价格'
from goods order by 价格 desc
4.7 基于字符串匹配条件选择查询结果,编写一条SELECT语句,列出customers表中姓王的客户信息.
select * from customers where 姓名 like '%王%'
4.10 实现外连接,查询出重庆客户的姓名.电话号码并显示他们的订单信息.
4.11 实现内连接,查询出有订单的重庆客户的姓名.电话号码并显示他门的订单信息
4.15 向表中添加行,编写一条INSERT语句,在goods表中添加一行.数据如下
货品名称 库存量 供应商 状态 价格
PENCIL 200 NULL 0 0.3
insert into goods(货品名称,库存量,供应商,状态,价格) values(PENCIL,200,NULL,0,0.3)
4.19 创建一个新表,新表中包含订购了"pen"的订单信息
4.20 嵌套子查询与相关子查询的区别