不使用min()找到MIN

时间:2014-11-06 02:59:25

标签: sql sqlite

我正在尝试找到具有最低分数的学生,这将是以下查询的结果。但是,我被要求在不使用MIN()的情况下编写查询。花了几个小时,但我无法找到替代解决方案:'(。

select s.sname
from student s
where s.score = 
    (select min(s2.score) 
    from score s2)

5 个答案:

答案 0 :(得分:3)

这是一种方式,即使两名学生的得分最低也会有效。

SELECT distinct s1.sname
FROM student s1
  LEFT JOIN student s2
    ON s2.score < s1.score 
WHERE s2.score IS NULL

以下是使用限制的方法,该方法将返回得分最低的学生,但如果其中多个得分相同,则只返回其中一个。

select sname
from student
order by score asc
limit 1

答案 1 :(得分:1)

这是JOIN方法的可能替代方案:

select sname from student where score in 
   (select score from student order by score asc limit 1)

答案 2 :(得分:1)

create table student (name varchar(10), score int);
insert into student (name, score) values('joe', 30);
insert into student (name, score) values('jim', 88);
insert into student (name, score) values('jack', 22);
insert into student (name, score) values('jimbo', 15);
insert into student (name, score) values('jo bob',15);

/* folks with lowest score */
select name, score from student where not exists(select 1 from student s where s.score < student.score);

/* the actual lowest score */
select distinct score from student 
where not exists(select 1 from student s where s.score < student.score);

请注意,不存在可能是非常低效的,但它可以在一小部分上完成工作。

答案 3 :(得分:1)

这样做的一种方法是按升序排序结果并取第一行。 但是如果你正在寻找一个更通用的解决方案,因为学生将有多个与他相关的分数,那么你需要找到每个学生的总分,然后找到总分最少的学生。

这是第一个场景,学生表中只有一行。

CREATE TABLE Student
(
SLNO INT,
MARKS FLOAT,
NAME NVARCHAR(MAX)
)

INSERT INTO Student VALUES(1, 80, 't1')
INSERT INTO Student VALUES(2, 90, 't2')
INSERT INTO Student VALUES(3, 76, 't3')
INSERT INTO Student VALUES(4, 98, 't4')
INSERT INTO Student VALUES(5, 55, 't5')

SELECT * From Student ORDER BY MARKS ASC 

上面指定的第二种情况是,他在表格中有多行,因此我们在现有用户的表格中再插入两行。

然后我们选择用户,将他们的分数总和按名称分组,然后按总分排序

INSERT INTO Student VALUES(6, 55, 't1')
INSERT INTO Student VALUES(6, 90, 't5')


SELECT SUM(MARKS) AS TOTAL, NAME FROM Student 
GROUP BY NAME
ORDER BY TOTAL

希望以上是您正在寻找的。

答案 4 :(得分:-2)

您可以尝试使用存储过程查找得分最低的学生。