--查询学生id,学生姓名,学生总成绩
SELECT a.id,a.NAME,SUM(b.score)
FROM dbo.Students a
LEFT JOIN dbo.Scores b
ON a.id=b.Student_id
GROUP BY a.id,a.Name
--查询学生id,学生姓名,科目,语文成绩,语文成绩是否大于70
DECLARE @w INT
SET @w=70;
DECLARE @q4 INT
SET @q4=@w/2;
SELECT @q4;
--SELECT @w UNION SELECT 30;
SELECT a.id,a.NAME,b.Course,b.score,
(
CASE WHEN b.Score >= @w THEN '是'
ELSE '否'
end
) '是否大于70'
FROM dbo.Students a
LEFT JOIN dbo.Scores b
ON a.id=b.Student_id AND b.Course='语文'
--语文总分
DECLARE @av int
SET @av=(SELECT SUM(a.score)
FROM dbo.Scores a
WHERE a.Course='语文')
--有几个语文成绩
DECLARE @c int
SET @c=(SELECT COUNT(*) FROM dbo.Scores a
WHERE a.Course='语文')
--语文,数学成绩平均分
DECLARE @p INT
SET @p=@av/@c;
SELECT @p;
--各科成绩平均分,科目成绩个数
SELECT b.course,AVG(b.score) 平均分
FROM dbo.Scores b
GROUP BY b.Course;
--科目,科目成绩个数
SELECT * FROM dbo.Scores;
SELECT COUNT(*),course
FROM dbo.Scores
GROUP BY Course
--科目,科目成绩个数
SELECT COUNT(1) 科目成绩个数,b.Course
FROM dbo.Scores b
GROUP BY b.Course
--科目,科目成绩个数,科目总分,科目平均分
SELECT COUNT(1) 科目成绩个数,b.Course,SUM(b.Score) 科目总分,AVG(b.Score) 科目平均分
FROM dbo.Scores b
GROUP BY b.Course
--没有英语成绩的学生id,姓名
SELECT DISTINCT a.id,a.name FROM dbo.Students a,dbo.Scores b
WHERE a.id=b.Student_id AND a.id NOT IN (SELECT DISTINCT c.Student_id FROM dbo.Scores c WHERE c.Course IN ('英语'));
--有英语成绩的学生id,姓名
SELECT a.id,a.name FROM dbo.Students a
LEFT JOIN dbo.Scores b
ON a.id=b.Student_id
where b.Course IN ('英语');
SELECT a.id,a.name FROM dbo.Students a,dbo.Scores b
where a.id=b.Student_id AND b.Course IN ('英语');
--所以学生语文成绩
SELECT * FROM dbo.Scores WHERE Course='语文';
--查询前5条数据
SELECT TOP 5 * FROM dbo.Scores;
--ORDER BY 先排序,再查询
SELECT * FROM dbo.Scores;
SELECT a.* FROM (SELECT TOP 5 * FROM dbo.Scores) a ORDER BY Course;--先排序 再查询
SELECT * FROM dbo.Scores ORDER BY Course;--先排序 再查询
SELECT TOP 5 * FROM dbo.Scores ORDER BY Course;--先排序 再查询
--疑问 先查询前5条 后排序怎么实现?????????????
--分页查询
DECLARE @pageIndex INT
SET @pageIndex=2;
DECLARE @pageSize INT
SET @pageSize=5;
--SELECT * FROM dbo.Scores;
SELECT * FROM
(SELECT *,ROW_NUMBER() OVER(ORDER BY id) index1 FROM dbo.Scores) b
WHERE b.index1>(@pageIndex-1)*@pageSize AND b.index1<=(@pageIndex*@pageSize);
--语文成绩大于60的,小于60的个数,语文成绩为null的个数
SELECT * FROM dbo.Scores WHERE Course='语文';
SELECT COUNT(1) '个数',b.条件
FROM
(SELECT (
CASE WHEN a.Score>60 THEN '大于60'
WHEN NOT a.Score>60 THEN '小与60'
ELSE NULL
END
) '条件'
FROM dbo.Scores a
WHERE a.Course='语文') b
GROUP BY b.条件
--数学成绩大于70的,小于70的个数,没有数学成绩的个数
SELECT COUNT(*) FROM dbo.Scores WHERE Course='数学' AND Score>70
UNION ALL
SELECT COUNT(*) FROM dbo.Scores WHERE Course='数学' AND Score<70
UNION ALL
SELECT COUNT(*) FROM dbo.Students WHERE id NOT IN (
SELECT Student_id FROM dbo.Scores WHERE Course='数学');
--分页存储过程 不带 参数
IF(OBJECT_ID('pro_page1','p') IS NOT NULL)
DROP PROC pro_page1
GO
CREATE PROC pro_page1
(@pageIndex int,
@pageSize INT)
AS
DECLARE @startRow INT,@endRow INT
SET @startRow=(@pageIndex-1)*@pageSize+1
SET @endRow=@startRow+@pageSize-1
SELECT @startRow;
SELECT @endRow;
PRINT @startRow;PRINT @startRow;PRINT @startRow;PRINT @startRow;PRINT @startRow;--消息打印
SELECT COUNT(1) FROM dbo.Scores;
SELECT * FROM (
SELECT ROW_NUMBER() OVER (ORDER BY id) AS rowId,* FROM dbo.Scores
) temp
WHERE temp.rowId BETWEEN @startRow AND @endRow
go
EXEC pro_page1 3,4;
--带输出参数存储过程
if (object_id('proc_getStudentRecord', 'P') is not null)
drop proc proc_getStudentRecord
go
create proc proc_getStudentRecord(
@id int, --默认输入参数 id
@name varchar(20) out, --输出参数 course
@age varchar(20) output--输入输出参数 student_id
)
as
select @name = Course, @age = Student_id from dbo.Scores where id = @id and Student_id = @age;
go
--
declare @id int,
@name varchar(20),
@temp varchar(20);
set @id = 1;
set @temp = 1;
exec proc_getStudentRecord @id, @name out, @temp output;
select @name, @temp;
print @name + '#' + @temp;
select * FROM Scores;
--scroe=90的加1
SELECT * FROM dbo.Scores;
UPDATE dbo.Scores
SET Score=Score+1
WHERE Score=90;
--查询分数最高的course
SELECT ALL course
FROM dbo.Scores
WHERE Score=MAX(score);--错误 聚合不应出现在 WHERE 子句中,除非该聚合位于 HAVING 子句或选择列表所包含的子查询中,并且要对其进行聚合的列是外部引用。
SELECT MAX(score) FROM dbo.Scores;
DECLARE @maxscore INT
SET @maxscore=(SELECT MAX(score) FROM dbo.Scores);
SELECT course
FROM dbo.Scores
WHERE Score=@maxscore;--正确
SELECT course FROM dbo.Scores a
right JOIN
(SELECT MAX(Score) maxscore FROM dbo.Scores) b
on a.score=b.maxscore;--正确
--语文成绩小于数学成绩的学生
SELECT * FROM dbo.Scores;
SELECT * FROM dbo.Scores WHERE Course='数学';
SELECT * FROM dbo.Scores WHERE Course='语文';
SELECT * FROM
(SELECT * FROM dbo.Scores WHERE Course='数学') a,
(SELECT * FROM dbo.Scores WHERE Course='语文') b
WHERE a.Student_id=b.Student_id AND a.Score>b.Score;
--平均成绩大于60分的学生,平均成绩
SELECT AVG(Score),student_id
FROM dbo.Scores
GROUP BY Student_id
HAVING AVG(score)>60;
--查询有数学成绩,也有语文成绩的学生信息
DELETE FROM dbo.Scores WHERE id=4;
SELECT * FROM dbo.Scores
WHERE Course='数学';
SELECT * FROM dbo.Scores
WHERE Course='语文';
SELECT * FROM
(SELECT * FROM dbo.Scores
WHERE Course='数学') a,
(SELECT * FROM dbo.Scores
WHERE Course='语文') b
WHERE a.student_id=b.student_id;
--各科成绩都大于80分的学生信息
SELECT * FROM dbo.Scores;
SELECT * FROM dbo.Students
WHERE dbo.Students.id NOT IN(SELECT DISTINCT student_id FROM dbo.Scores WHERE Score<=80);
SELECT * FROM dbo.Scores WHERE Score>80;
SELECT * FROM dbo.Scores WHERE Score<=80;
SELECT * FROM dbo.Scores;
--所有课程成绩!=student5的学生信息
SELECT * FROM dbo.Scores WHERE Student_id=5;
SELECT * FROM dbo.Scores;
SELECT * FROM
(
SELECT * FROM dbo.Scores WHERE Student_id NOT IN (
SELECT Student_id FROM
(SELECT * FROM dbo.Scores a WHERE a.Score IN (SELECT Score FROM dbo.Scores WHERE Student_id =5)) b
)) r;
--至少一门课程成绩=student5的学生信息
SELECT * FROM
(SELECT * FROM dbo.Scores a WHERE a.Score IN (SELECT Score FROM dbo.Scores WHERE Student_id =5)) b
--查询各科成绩最高分,最低分
SELECT MAX(score),MIN(score),Course
FROM dbo.Scores
GROUP BY Course;
SELECT * FROM dbo.Scores;
--变量学习 case when then end
DECLARE @av INT
SELECT @av=AVG(b.a) FROM (SELECT AVG(score) a,student_id
FROM dbo.Scores
GROUP BY Student_id) b
SELECT @av;
SELECT *
--,(
-- CASE WHEN ee.a>@av THEN 1
-- WHEN not ee.a>@av THEN 0
-- end
--)
FROM
(
SELECT AVG(score) a,student_id
FROM dbo.Scores
GROUP BY Student_id
) ee;
SELECT * FROM dbo.Students;
--case when then end
SELECT *,(
CASE WHEN id>2 THEN 1
WHEN NOT id>2 THEN 0
END
)FROM dbo.Students;
--排名
SELECT * FROM dbo.Students;
SELECT *,(
SELECT 1+COUNT(*) FROM dbo.Students
WHERE a.id<dbo.Students.id
)
FROM dbo.Students a,dbo.Students
WHERE a.id=dbo.Students.id;
--平均成绩及排名
SELECT AVG(score) a,student_id
FROM dbo.Scores
GROUP BY Student_id;
SELECT *,(
SELECT 1+COUNT(*) FROM
(SELECT AVG(score) a,student_id
FROM dbo.Scores
GROUP BY Student_id) d
WHERE b.a<d.a
) '排名' FROM
(SELECT AVG(score) a,student_id
FROM dbo.Scores
GROUP BY Student_id) b;
--各科成绩第一名成绩
SELECT MAX(Score),Course
FROM dbo.Scores
GROUP BY Course
--各科成绩前三名(不考虑并列)
SELECT * FROM dbo.Scores
WHERE Course='数学';
SELECT * FROM dbo.Scores
WHERE Course='语文';
SELECT * FROM dbo.Scores
WHERE Course='英语';
SELECT * FROM dbo.Scores a
WHERE a.Score IN(
SELECT TOP 3 Score FROM
dbo.Scores WHERE a.Course=dbo.Scores.Course
ORDER BY Score DESC
)
ORDER BY a.Course;
--分页查询 查询第6到第10条数据 6,7,8,9,10
SELECT * FROM
(SELECT *,ROW_NUMBER() OVER(ORDER BY id) a
FROM dbo.Scores) b
WHERE b.a>5 AND b.a<11
ORDER BY b.id;
--颠倒
SELECT * FROM
(
SELECT TOP 5 * FROM (
SELECT TOP 10 * FROM dbo.Scores ORDER BY id asc
) a
ORDER BY a.id DESC) b
ORDER BY b.id;
--not in
SELECT * FROM (
SELECT TOP 5 * FROM
dbo.Scores
WHERE id NOT IN (
SELECT TOP 5 id FROM dbo.Scores
)) c
--大于法
SELECT TOP 5 * FROM
dbo.Scores
WHERE id>(
SELECT MAX(id)
FROM (SELECT TOP 5 id FROM dbo.Scores ORDER BY id) a) ORDER BY id;