zoukankan      html  css  js  c++  java
  • sql语句学习

    --查询学生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;

  • 相关阅读:
    解决SSH连接Linux超时自动断开
    小程序选项卡
    vue 封装axios 请求 统一管理方法1
    vue 中使用echar
    vue element 做表格分页
    vue echar使用
    旋转
    vue 登录切换页面
    vue 根据输入的身份号码,自动获取年龄
    vue 手机号码验证 。点击获取验证码
  • 原文地址:https://www.cnblogs.com/liuqiyun/p/5395682.html
Copyright © 2011-2022 走看看