• 章节:19
  • 访问:1032
  • 时长:00:18:45
  • 日期:2019-05-17 12:39

表结构如下

USE [MianShi]
GO

/****** Object:  Table [dbo].[Chengji]    Script Date: 05/16/2019 23:55:30 ******/
SET ANSI_NULLS ON
GO

SET QUOTED_IDENTIFIER ON
GO

CREATE TABLE [dbo].[Chengji](
[id] [int] IDENTITY(1,1) NOT NULL,
[name] [nvarchar](50) NULL,
[kecheng] [nvarchar](50) NULL,
[fenshu] [int] NULL,
 CONSTRAINT [PK_Chengji] PRIMARY KEY CLUSTERED 
(
[id] ASC
)WITH (PAD_INDEX  = OFF, STATISTICS_NORECOMPUTE  = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS  = ON, ALLOW_PAGE_LOCKS  = ON) ON [PRIMARY]
) ON [PRIMARY]

GO

1 张三 语文 81

2 张三 数学 75

3 李四 语文 76

4 李四 数学 90

5 王五 语文 81

6 王五 数学 100

7 王五 英语 90

大家先去看这个课程

http://www.bamn.cn/course/lesson/5

第一种写法

先安装姓名分组,

然后使用聚合函数查出每个人最低分的哪门课程

最后使用having对每一组的最低分的值进行过滤

SELECT [name],MIN(fenshu) as minfenshu
FROM [MianShi].[dbo].[Chengji]
group by name
having MIN(fenshu) >= 80

第二种写法(换个角度来思考,去除有一门或一门以上低于80分的人)

首先查出来有一门或以上课程低于80分的

select distinct name from Chengji
where name not in(
select distinct name from Chengji 
where fenshu < 80
)

上面的写法使用in 可能数据类大的话 会影响性能

所以我们推荐使用这种方式 左关联的方式

select * from Chengji  c
left join (
  select distinct name from Chengji 
  where fenshu < 80
) t
on c.name =t.name
where t.name is null