热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

SQL语句多表查询(学生表/课程表/教师表/成绩表){转载}

2019独角兽企业重金招聘Python工程师标准SQL语句多表查询,转自一位大神几年前的文章,方便自己查看!!-问题及

2019独角兽企业重金招聘Python工程师标准>>> hot3.png

SQL语句多表查询,转自一位大神几年前的文章,方便自己查看!!

-问题及描述:
--1.学生表
--Student(S#,Sname,Sage,Ssex) --S# 学生编号,Sname 学生姓名,Sage 出生年月,Ssex 学生性别
--2.课程表
--Course(C#,Cname,T#) --C# --课程编号,Cname 课程名称,T# 教师编号
--3.教师表
--Teacher(T#,Tname) --T# 教师编号,Tname 教师姓名
--4.成绩表
--SC(S#,C#,score) --S# 学生编号,C# 课程编号,score 分数

--创建测试数据
CREATE TABLE Student
    (
      S# VARCHAR(10) ,
      Sname NVARCHAR(10) ,
      Sage DATETIME ,
      Ssex NVARCHAR(10)
    )
INSERT  INTO Student
VALUES  ( '01', N'赵雷', '1990-01-01', N'男' )
INSERT  INTO Student
VALUES  ( '02', N'钱电', '1990-12-21', N'男' )
INSERT  INTO Student
VALUES  ( '03', N'孙风', '1990-05-20', N'男' )
INSERT  INTO Student
VALUES  ( '04', N'李云', '1990-08-06', N'男' )
INSERT  INTO Student
VALUES  ( '05', N'周梅', '1991-12-01', N'女' )
INSERT  INTO Student
VALUES  ( '06', N'吴兰', '1992-03-01', N'女' )
INSERT  INTO Student
VALUES  ( '07', N'郑竹', '1989-07-01', N'女' )
INSERT  INTO Student
VALUES  ( '08', N'王菊', '1990-01-20', N'女' )
CREATE TABLE Course
    (
      C# VARCHAR(10) ,
      Cname NVARCHAR(10) ,
      T# VARCHAR(10)
    )
INSERT  INTO Course
VALUES  ( '01', N'语文', '02' )
INSERT  INTO Course
VALUES  ( '02', N'数学', '01' )
INSERT  INTO Course
VALUES  ( '03', N'英语', '03' )
CREATE TABLE Teacher
    (
      T# VARCHAR(10) ,
      Tname NVARCHAR(10)
    )
INSERT  INTO Teacher
VALUES  ( '01', N'张三' )
INSERT  INTO Teacher
VALUES  ( '02', N'李四' )
INSERT  INTO Teacher
VALUES  ( '03', N'王五' )
CREATE TABLE SC
    (
      S# VARCHAR(10) ,
      C# VARCHAR(10) ,
      score DECIMAL(18, 1)
    )
INSERT  INTO SC
VALUES  ( '01', '01', 80 )
INSERT  INTO SC
VALUES  ( '01', '02', 90 )
INSERT  INTO SC
VALUES  ( '01', '03', 99 )
INSERT  INTO SC
VALUES  ( '02', '01', 70 )
INSERT  INTO SC
VALUES  ( '02', '02', 60 )
INSERT  INTO SC
VALUES  ( '02', '03', 80 )
INSERT  INTO SC
VALUES  ( '03', '01', 80 )
INSERT  INTO SC
VALUES  ( '03', '02', 80 )
INSERT  INTO SC
VALUES  ( '03', '03', 80 )
INSERT  INTO SC
VALUES  ( '04', '01', 50 )
INSERT  INTO SC
VALUES  ( '04', '02', 30 )
INSERT  INTO SC
VALUES  ( '04', '03', 20 )
INSERT  INTO SC
VALUES  ( '05', '01', 76 )
INSERT  INTO SC
VALUES  ( '05', '02', 87 )
INSERT  INTO SC
VALUES  ( '06', '01', 31 )
INSERT  INTO SC
VALUES  ( '06', '03', 34 )
INSERT  INTO SC
VALUES  ( '07', '02', 89 )
INSERT  INTO SC
VALUES  ( '07', '03', 98 )
go

--1、查询"01"课程比"02"课程成绩高的学生的信息及课程分数
--1.1、查询同时存在"01"课程和"02"课程的情况
SELECT  a.* ,
        b.score [课程'01'的分数] ,
        c.score [课程'02'的分数]
FROM    Student a ,
        SC b ,
        SC c
WHERE   a.S# = b.S#
        AND a.S# = c.S#
        AND b.C# = '01'
        AND c.C# = '02'
        AND b.score > c.score
--1.2、查询同时存在"01"课程和"02"课程的情况和存在"01"课程但可能不存在"02"课程的情况(不存在时显示为null)(以下存在相同内容时不再解释)
SELECT  a.* ,
        b.score [课程"01"的分数] ,
        c.score [课程"02"的分数]
FROM    Student a
        LEFT JOIN SC b ON a.S# = b.S#
                          AND b.C# = '01'
        LEFT JOIN SC c ON a.S# = c.S#
                          AND c.C# = '02'
WHERE   b.score > ISNULL(c.score, 0)

--2、查询"01"课程比"02"课程成绩低的学生的信息及课程分数
--2.1、查询同时存在"01"课程和"02"课程的情况
SELECT  a.* ,
        b.score [课程'01'的分数] ,
        c.score [课程'02'的分数]
FROM    Student a ,
        SC b ,
        SC c
WHERE   a.S# = b.S#
        AND a.S# = c.S#
        AND b.C# = '01'
        AND c.C# = '02'
        AND b.score --2.2、查询同时存在"01"课程和"02"课程的情况和不存在"01"课程但存在"02"课程的情况
SELECT  a.* ,
        b.score [课程"01"的分数] ,
        c.score [课程"02"的分数]
FROM    Student a
        LEFT JOIN SC b ON a.S# = b.S#
                          AND b.C# = '01'
        LEFT JOIN SC c ON a.S# = c.S#
                          AND c.C# = '02'
WHERE   ISNULL(b.score, 0)

--3、查询平均成绩大于等于60分的同学的学生编号和学生姓名和平均成绩
SELECT  a.S# ,
        a.Sname ,
        CAST(AVG(b.score) AS DECIMAL(18, 2)) avg_score
FROM    Student a ,
        sc b
WHERE   a.S# = b.S#
GROUP BY a.S# ,
        a.Sname
HAVING  CAST(AVG(b.score) AS DECIMAL(18, 2)) >= 60
ORDER BY a.S#

--4、查询平均成绩小于60分的同学的学生编号和学生姓名和平均成绩
--4.1、查询在sc表存在成绩的学生信息的SQL语句。
SELECT  a.S# ,
        a.Sname ,
        CAST(AVG(b.score) AS DECIMAL(18, 2)) avg_score
FROM    Student a ,
        sc b
WHERE   a.S# = b.S#
GROUP BY a.S# ,
        a.Sname
HAVING  CAST(AVG(b.score) AS DECIMAL(18, 2)) <60
ORDER BY a.S#
--4.2、查询在sc表中不存在成绩的学生信息的SQL语句。
SELECT  a.S# ,
        a.Sname ,
        ISNULL(CAST(AVG(b.score) AS DECIMAL(18, 2)), 0) avg_score
FROM    Student a
        LEFT JOIN sc b ON a.S# &#61; b.S#
GROUP BY a.S# ,
        a.Sname
HAVING  ISNULL(CAST(AVG(b.score) AS DECIMAL(18, 2)), 0) <60
ORDER BY a.S#

--5、查询所有同学的学生编号、学生姓名、选课总数、所有课程的总成绩
--5.1、查询所有有成绩的SQL。
SELECT  a.S# [学生编号] ,
        a.Sname [学生姓名] ,
        COUNT(b.C#) 选课总数 ,
        SUM(score) [所有课程的总成绩]
FROM    Student a ,
        SC b
WHERE   a.S# &#61; b.S#
GROUP BY a.S# ,
        a.Sname
ORDER BY a.S#
--5.2、查询所有(包括有成绩和无成绩)的SQL。
SELECT  a.S# [学生编号] ,
        a.Sname [学生姓名] ,
        COUNT(b.C#) 选课总数 ,
        SUM(score) [所有课程的总成绩]
FROM    Student a
        LEFT JOIN SC b ON a.S# &#61; b.S#
GROUP BY a.S# ,
        a.Sname
ORDER BY a.S#

--6、查询"李"姓老师的数量
--方法1
SELECT  COUNT(Tname) ["李"姓老师的数量]
FROM    Teacher
WHERE   Tname LIKE N&#39;李%&#39;
--方法2
SELECT  COUNT(Tname) ["李"姓老师的数量]
FROM    Teacher
WHERE   LEFT(Tname, 1) &#61; N&#39;李&#39;


--7、查询学过"张三"老师授课的同学的信息
SELECT DISTINCT
        Student.*
FROM    Student ,
        SC ,
        Course ,
        Teacher
WHERE   Student.S# &#61; SC.S#
        AND SC.C# &#61; Course.C#
        AND Course.T# &#61; Teacher.T#
        AND Teacher.Tname &#61; N&#39;张三&#39;
ORDER BY Student.S#

--8、查询没学过"张三"老师授课的同学的信息
SELECT  m.*
FROM    Student m
WHERE   S# NOT IN ( SELECT DISTINCT
                            SC.S#
                    FROM    SC ,
                            Course ,
                            Teacher
                    WHERE   SC.C# &#61; Course.C#
                            AND Course.T# &#61; Teacher.T#
                            AND Teacher.Tname &#61; N&#39;张三&#39; )
ORDER BY m.S#

--9、查询学过编号为"01"并且也学过编号为"02"的课程的同学的信息
--方法1
SELECT  Student.*
FROM    Student ,
        SC
WHERE   Student.S# &#61; SC.S#
        AND SC.C# &#61; &#39;01&#39;
        AND EXISTS ( SELECT 1
                     FROM   SC SC_2
                     WHERE  SC_2.S# &#61; SC.S#
                            AND SC_2.C# &#61; &#39;02&#39; )
ORDER BY Student.S#
--方法2
SELECT  Student.*
FROM    Student ,
        SC
WHERE   Student.S# &#61; SC.S#
        AND SC.C# &#61; &#39;02&#39;
        AND EXISTS ( SELECT 1
                     FROM   SC SC_2
                     WHERE  SC_2.S# &#61; SC.S#
                            AND SC_2.C# &#61; &#39;01&#39; )
ORDER BY Student.S#
--方法3
SELECT  m.*
FROM    Student m
WHERE   S# IN ( SELECT  S#
                FROM    ( SELECT DISTINCT
                                    S#
                          FROM      SC
                          WHERE     C# &#61; &#39;01&#39;
                          UNION ALL
                          SELECT DISTINCT
                                    S#
                          FROM      SC
                          WHERE     C# &#61; &#39;02&#39;
                        ) t
                GROUP BY S#
                HAVING  COUNT(1) &#61; 2 )
ORDER BY m.S#

--10、查询学过编号为"01"但是没有学过编号为"02"的课程的同学的信息
--方法1
SELECT  Student.*
FROM    Student ,
        SC
WHERE   Student.S# &#61; SC.S#
        AND SC.C# &#61; &#39;01&#39;
        AND NOT EXISTS ( SELECT 1
                         FROM   SC SC_2
                         WHERE  SC_2.S# &#61; SC.S#
                                AND SC_2.C# &#61; &#39;02&#39; )
ORDER BY Student.S#
--方法2
SELECT  Student.*
FROM    Student ,
        SC
WHERE   Student.S# &#61; SC.S#
        AND SC.C# &#61; &#39;01&#39;
        AND Student.S# NOT IN ( SELECT  SC_2.S#
                                FROM    SC SC_2
                                WHERE   SC_2.S# &#61; SC.S#
                                        AND SC_2.C# &#61; &#39;02&#39; )
ORDER BY Student.S#

--11、查询没有学全所有课程的同学的信息
--11.1、
SELECT  Student.*
FROM    Student ,
        SC
WHERE   Student.S# &#61; SC.S#
GROUP BY Student.S# ,
        Student.Sname ,
        Student.Sage ,
        Student.Ssex
HAVING  COUNT(C#) <( SELECT    COUNT(C#)
                      FROM      Course
                    )
--11.2
SELECT  Student.*
FROM    Student
        LEFT JOIN SC ON Student.S# &#61; SC.S#
GROUP BY Student.S# ,
        Student.Sname ,
        Student.Sage ,
        Student.Ssex
HAVING  COUNT(C#) <( SELECT    COUNT(C#)
                      FROM      Course
                    )

--12、查询至少有一门课与学号为"01"的同学所学相同的同学的信息
SELECT DISTINCT
        Student.*
FROM    Student ,
        SC
WHERE   Student.S# &#61; SC.S#
        AND SC.C# IN ( SELECT   C#
                       FROM     SC
                       WHERE    S# &#61; &#39;01&#39; )
        AND Student.S# <> &#39;01&#39;

--13、查询和"01"号的同学学习的课程完全相同的其他同学的信息
SELECT  Student.*
FROM    Student
WHERE   S# IN ( SELECT DISTINCT
                        SC.S#
                FROM    SC
                WHERE   S# <> &#39;01&#39;
                        AND SC.C# IN ( SELECT DISTINCT
                                                C#
                                       FROM     SC
                                       WHERE    S# &#61; &#39;01&#39; )
                GROUP BY SC.S#
                HAVING  COUNT(1) &#61; ( SELECT COUNT(1)
                                     FROM   SC
                                     WHERE  S# &#61; &#39;01&#39;
                                   ) )

--14、查询没学过"张三"老师讲授的任一门课程的学生姓名
SELECT  student.*
FROM    student
WHERE   student.S# NOT IN ( SELECT DISTINCT
                                    sc.S#
                            FROM    sc ,
                                    course ,
                                    teacher
                            WHERE   sc.C# &#61; course.C#
                                    AND course.T# &#61; teacher.T#
                                    AND teacher.tname &#61; N&#39;张三&#39; )
ORDER BY student.S#

--15、查询两门及其以上不及格课程的同学的学号&#xff0c;姓名及其平均成绩
SELECT  student.S# ,
        student.sname ,
        CAST(AVG(score) AS DECIMAL(18, 2)) avg_score
FROM    student ,
        sc
WHERE   student.S# &#61; SC.S#
        AND student.S# IN ( SELECT  S#
                            FROM    SC
                            WHERE   score <60
                            GROUP BY S#
                            HAVING  COUNT(1) >&#61; 2 )
GROUP BY student.S# ,
        student.sname

--16、检索"01"课程分数小于60&#xff0c;按分数降序排列的学生信息
SELECT  student.* ,
        sc.C# ,
        sc.score
FROM    student ,
        sc
WHERE   student.S# &#61; SC.S#
        AND sc.score <60
        AND sc.C# &#61; &#39;01&#39;
ORDER BY sc.score DESC

--17、按平均成绩从高到低显示所有学生的所有课程的成绩以及平均成绩
--17.1 SQL 2000 静态
SELECT  a.S# 学生编号 ,
        a.Sname 学生姓名 ,
        MAX(CASE c.Cname
              WHEN N&#39;语文&#39; THEN b.score
              ELSE NULL
            END) [语文] ,
        MAX(CASE c.Cname
              WHEN N&#39;数学&#39; THEN b.score
              ELSE NULL
            END) [数学] ,
        MAX(CASE c.Cname
              WHEN N&#39;英语&#39; THEN b.score
              ELSE NULL
            END) [英语] ,
        CAST(AVG(b.score) AS DECIMAL(18, 2)) 平均分
FROM    Student a
        LEFT JOIN SC b ON a.S# &#61; b.S#
        LEFT JOIN Course c ON b.C# &#61; c.C#
GROUP BY a.S# ,
        a.Sname
ORDER BY 平均分 DESC
--17.2 SQL 2000 动态
DECLARE &#64;sql NVARCHAR(4000)
SET &#64;sql &#61; &#39;select a.S# &#39; &#43; N&#39;学生编号&#39; &#43; &#39; , a.Sname &#39; &#43; N&#39;学生姓名&#39;
SELECT  &#64;sql &#61; &#64;sql &#43; &#39;,max(case c.Cname when N&#39;&#39;&#39; &#43; Cname
        &#43; &#39;&#39;&#39; then b.score else null end) [&#39; &#43; Cname &#43; &#39;]&#39;
FROM    ( SELECT DISTINCT
                    Cname
          FROM      Course
        ) AS t
SET &#64;sql &#61; &#64;sql &#43; &#39; , cast(avg(b.score) as decimal(18,2)) &#39; &#43; N&#39;平均分&#39;
    &#43; &#39; from Student a left join SC b on a.S# &#61; b.S# left join Course c on b.C# &#61; c.C#
group by a.S# , a.Sname order by &#39; &#43; N&#39;平均分&#39; &#43; &#39; desc&#39;
EXEC(&#64;sql)


--24、查询学生平均成绩及其名次
--24.1 查询学生的平均成绩并进行排名&#xff0c;sql 2000用子查询完成&#xff0c;分平均成绩重复时保留名次空缺和不保留名次空缺两种。
SELECT  t1.* ,
        px &#61; ( SELECT   COUNT(1)
               FROM     ( SELECT    m.S# [学生编号] ,
                                    m.Sname [学生姓名] ,
                                    ISNULL(CAST(AVG(score) AS DECIMAL(18, 2)),
                                           0) [平均成绩]
                          FROM      Student m
                                    LEFT JOIN SC n ON m.S# &#61; n.S#
                          GROUP BY  m.S# ,
                                    m.Sname
                        ) t2
               WHERE    平均成绩 > t1.平均成绩
             ) &#43; 1
FROM    ( SELECT    m.S# [学生编号] ,
                    m.Sname [学生姓名] ,
                    ISNULL(CAST(AVG(score) AS DECIMAL(18, 2)), 0) [平均成绩]
          FROM      Student m
                    LEFT JOIN SC n ON m.S# &#61; n.S#
          GROUP BY  m.S# ,
                    m.Sname
        ) t1
ORDER BY px

SELECT  t1.* ,
        px &#61; ( SELECT   COUNT(DISTINCT 平均成绩)
               FROM     ( SELECT    m.S# [学生编号] ,
                                    m.Sname [学生姓名] ,
                                    ISNULL(CAST(AVG(score) AS DECIMAL(18, 2)),
                                           0) [平均成绩]
                          FROM      Student m
                                    LEFT JOIN SC n ON m.S# &#61; n.S#
                          GROUP BY  m.S# ,
                                    m.Sname
                        ) t2
               WHERE    平均成绩 >&#61; t1.平均成绩
             )
FROM    ( SELECT    m.S# [学生编号] ,
                    m.Sname [学生姓名] ,
                    ISNULL(CAST(AVG(score) AS DECIMAL(18, 2)), 0) [平均成绩]
          FROM      Student m
                    LEFT JOIN SC n ON m.S# &#61; n.S#
          GROUP BY  m.S# ,
                    m.Sname
        ) t1
ORDER BY px
--24.2 查询学生的平均成绩并进行排名&#xff0c;sql 2005用rank,DENSE_RANK完成&#xff0c;分平均成绩重复时保留名次空缺和不保留名次空缺两种。
SELECT  t.* ,
        px &#61; RANK() OVER ( ORDER BY [平均成绩] DESC )
FROM    ( SELECT    m.S# [学生编号] ,
                    m.Sname [学生姓名] ,
                    ISNULL(CAST(AVG(score) AS DECIMAL(18, 2)), 0) [平均成绩]
          FROM      Student m
                    LEFT JOIN SC n ON m.S# &#61; n.S#
          GROUP BY  m.S# ,
                    m.Sname
        ) t
ORDER BY px

SELECT  t.* ,
        px &#61; DENSE_RANK() OVER ( ORDER BY [平均成绩] DESC )
FROM    ( SELECT    m.S# [学生编号] ,
                    m.Sname [学生姓名] ,
                    ISNULL(CAST(AVG(score) AS DECIMAL(18, 2)), 0) [平均成绩]
          FROM      Student m
                    LEFT JOIN SC n ON m.S# &#61; n.S#
          GROUP BY  m.S# ,
                    m.Sname
        ) t
ORDER BY px
 
--25、查询各科成绩前三名的记录
--25.1 分数重复时保留名次空缺
SELECT  m.* ,
        n.C# ,
        n.score
FROM    Student m ,
        SC n
WHERE   m.S# &#61; n.S#
        AND n.score IN ( SELECT TOP 3
                                score
                         FROM   sc
                         WHERE  C# &#61; n.C#
                         ORDER BY score DESC )
ORDER BY n.C# ,
        n.score DESC
--25.2 分数重复时不保留名次空缺&#xff0c;合并名次
--sql 2000用子查询实现
SELECT  *
FROM    ( SELECT    t.* ,
                    px &#61; ( SELECT   COUNT(DISTINCT score)
                           FROM     SC
                           WHERE    C# &#61; t.C#
                                    AND score >&#61; t.score
                         )
          FROM      sc t
        ) m
WHERE   px BETWEEN 1 AND 3
ORDER BY m.c# ,
        m.px
--sql 2005用DENSE_RANK实现
SELECT  *
FROM    ( SELECT    t.* ,
                    px &#61; DENSE_RANK() OVER ( PARTITION BY c# ORDER BY score DESC )
          FROM      sc t
        ) m
WHERE   px BETWEEN 1 AND 3
ORDER BY m.C# ,
        m.px

--26、查询每门课程被选修的学生数
SELECT  c# ,
        COUNT(S#) [学生数]
FROM    sc
GROUP BY C#

--27、查询出只有两门课程的全部学生的学号和姓名
SELECT  Student.S# ,
        Student.Sname
FROM    Student ,
        SC
WHERE   Student.S# &#61; SC.S#
GROUP BY Student.S# ,
        Student.Sname
HAVING  COUNT(SC.C#) &#61; 2
ORDER BY Student.S#

--28、查询男生、女生人数
SELECT  COUNT(Ssex) AS 男生人数
FROM    Student
WHERE   Ssex &#61; N&#39;男&#39;
SELECT  COUNT(Ssex) AS 女生人数
FROM    Student
WHERE   Ssex &#61; N&#39;女&#39;
SELECT  SUM(CASE WHEN Ssex &#61; N&#39;男&#39; THEN 1
                 ELSE 0
            END) [男生人数] ,
        SUM(CASE WHEN Ssex &#61; N&#39;女&#39; THEN 1
                 ELSE 0
            END) [女生人数]
FROM    student
SELECT  CASE WHEN Ssex &#61; N&#39;男&#39; THEN N&#39;男生人数&#39;
             ELSE N&#39;女生人数&#39;
        END [男女情况] ,
        COUNT(1) [人数]
FROM    student
GROUP BY CASE WHEN Ssex &#61; N&#39;男&#39; THEN N&#39;男生人数&#39;
              ELSE N&#39;女生人数&#39;
         END

--29、查询名字中含有"风"字的学生信息
SELECT  *
FROM    student
WHERE   sname LIKE N&#39;%风%&#39;
SELECT  *
FROM    student
WHERE   CHARINDEX(N&#39;风&#39;, sname) > 0

--30、查询同名同性学生名单&#xff0c;并统计同名人数
SELECT  Sname [学生姓名] ,
        COUNT(*) [人数]
FROM    Student
GROUP BY Sname
HAVING  COUNT(*) > 1

--31、查询1990年出生的学生名单(注&#xff1a;Student表中Sage列的类型是datetime)
SELECT  *
FROM    Student
WHERE   YEAR(sage) &#61; 1990
SELECT  *
FROM    Student
WHERE   DATEDIFF(yy, sage, &#39;1990-01-01&#39;) &#61; 0
SELECT  *
FROM    Student
WHERE   DATEPART(yy, sage) &#61; 1990
SELECT  *
FROM    Student
WHERE   CONVERT(VARCHAR(4), sage, 120) &#61; &#39;1990&#39;

--32、查询每门课程的平均成绩&#xff0c;结果按平均成绩降序排列&#xff0c;平均成绩相同时&#xff0c;按课程编号升序排列
SELECT  m.C# ,
        m.Cname ,
        CAST(AVG(n.score) AS DECIMAL(18, 2)) avg_score
FROM    Course m ,
        SC n
WHERE   m.C# &#61; n.C#
GROUP BY m.C# ,
        m.Cname
ORDER BY avg_score DESC ,
        m.C# ASC

--33、查询平均成绩大于等于85的所有学生的学号、姓名和平均成绩
SELECT  a.S# ,
        a.Sname ,
        CAST(AVG(b.score) AS DECIMAL(18, 2)) avg_score
FROM    Student a ,
        sc b
WHERE   a.S# &#61; b.S#
GROUP BY a.S# ,
        a.Sname
HAVING  CAST(AVG(b.score) AS DECIMAL(18, 2)) >&#61; 85
ORDER BY a.S#

--34、查询课程名称为"数学"&#xff0c;且分数低于60的学生姓名和分数
SELECT  sname ,
        score
FROM    Student ,
        SC ,
        Course
WHERE   SC.S# &#61; Student.S#
        AND SC.C# &#61; Course.C#
        AND Course.Cname &#61; N&#39;数学&#39;
        AND score <60

--35、查询所有学生的课程及分数情况&#xff1b;
SELECT  Student.* ,
        Course.Cname ,
        SC.C# ,
        SC.score
FROM    Student ,
        SC ,
        Course
WHERE   Student.S# &#61; SC.S#
        AND SC.C# &#61; Course.C#
ORDER BY Student.S# ,
        SC.C#

--36、查询任何一门课程成绩在70分以上的姓名、课程名称和分数&#xff1b;
SELECT  Student.* ,
        Course.Cname ,
        SC.C# ,
        SC.score
FROM    Student ,
        SC ,
        Course
WHERE   Student.S# &#61; SC.S#
        AND SC.C# &#61; Course.C#
        AND SC.score >&#61; 70
ORDER BY Student.S# ,
        SC.C#

--37、查询不及格的课程
SELECT  Student.* ,
        Course.Cname ,
        SC.C# ,
        SC.score
FROM    Student ,
        SC ,
        Course
WHERE   Student.S# &#61; SC.S#
        AND SC.C# &#61; Course.C#
        AND SC.score <60
ORDER BY Student.S# ,
        SC.C#

--38、查询课程编号为01且课程成绩在80分以上的学生的学号和姓名&#xff1b;
SELECT  Student.* ,
        Course.Cname ,
        SC.C# ,
        SC.score
FROM    Student ,
        SC ,
        Course
WHERE   Student.S# &#61; SC.S#
        AND SC.C# &#61; Course.C#
        AND SC.C# &#61; &#39;01&#39;
        AND SC.score >&#61; 80
ORDER BY Student.S# ,
        SC.C#

--39、求每门课程的学生人数
SELECT  Course.C# ,
        Course.Cname ,
        COUNT(*) [学生人数]
FROM    Course ,
        SC
WHERE   Course.C# &#61; SC.C#
GROUP BY Course.C# ,
        Course.Cname
ORDER BY Course.C# ,
        Course.Cname

--40、查询选修"张三"老师所授课程的学生中&#xff0c;成绩最高的学生信息及其成绩
--40.1 当最高分只有一个时
SELECT TOP 1
        Student.* ,
        Course.Cname ,
        SC.C# ,
        SC.score
FROM    Student ,
        SC ,
        Course ,
        Teacher
WHERE   Student.S# &#61; SC.S#
        AND SC.C# &#61; Course.C#
        AND Course.T# &#61; Teacher.T#
        AND Teacher.Tname &#61; N&#39;张三&#39;
ORDER BY SC.score DESC
--40.2 当最高分出现多个时
SELECT  Student.* ,
        Course.Cname ,
        SC.C# ,
        SC.score
FROM    Student ,
        SC ,
        Course ,
        Teacher
WHERE   Student.S# &#61; SC.S#
        AND SC.C# &#61; Course.C#
        AND Course.T# &#61; Teacher.T#
        AND Teacher.Tname &#61; N&#39;张三&#39;
        AND SC.score &#61; ( SELECT MAX(SC.score)
                         FROM   SC ,
                                Course ,
                                Teacher
                         WHERE  SC.C# &#61; Course.C#
                                AND Course.T# &#61; Teacher.T#
                                AND Teacher.Tname &#61; N&#39;张三&#39;
                       )

--41、查询不同课程成绩相同的学生的学生编号、课程编号、学生成绩
--方法1
SELECT  m.*
FROM    SC m ,
        ( SELECT    C# ,
                    score
          FROM      SC
          GROUP BY  C# ,
                    score
          HAVING    COUNT(1) > 1
        ) n
WHERE   m.C# &#61; n.C#
        AND m.score &#61; n.score
ORDER BY m.C# ,
        m.score ,
        m.S#
--方法2
SELECT  m.*
FROM    SC m
WHERE   EXISTS ( SELECT 1
                 FROM   ( SELECT    C# ,
                                    score
                          FROM      SC
                          GROUP BY  C# ,
                                    score
                          HAVING    COUNT(1) > 1
                        ) n
                 WHERE  m.C# &#61; n.C#
                        AND m.score &#61; n.score )
ORDER BY m.C# ,
        m.score ,
        m.S#

--42、查询每门功成绩最好的前两名
SELECT  t.*
FROM    sc t
WHERE   score IN ( SELECT TOP 2
                            score
                   FROM     sc
                   WHERE    C# &#61; T.C#
                   ORDER BY score DESC )
ORDER BY t.C# ,
        t.score DESC

--43、统计每门课程的学生选修人数&#xff08;超过5人的课程才统计&#xff09;。要求输出课程号和选修人数&#xff0c;查询结果按人数降序排列&#xff0c;若人数相同&#xff0c;按课程号升序排列 
SELECT  Course.C# ,
        Course.Cname ,
        COUNT(*) [学生人数]
FROM    Course ,
        SC
WHERE   Course.C# &#61; SC.C#
GROUP BY Course.C# ,
        Course.Cname
HAVING  COUNT(*) >&#61; 5
ORDER BY [学生人数] DESC ,
        Course.C#

--44、检索至少选修两门课程的学生学号
SELECT  student.S# ,
        student.Sname
FROM    student ,
        SC
WHERE   student.S# &#61; SC.S#
GROUP BY student.S# ,
        student.Sname
HAVING  COUNT(1) >&#61; 2
ORDER BY student.S#

--45、查询选修了全部课程的学生信息
--方法1 根据数量来完成
SELECT  student.*
FROM    student
WHERE   S# IN ( SELECT  S#
                FROM    sc
                GROUP BY S#
                HAVING  COUNT(1) &#61; ( SELECT COUNT(1)
                                     FROM   course
                                   ) )
--方法2 使用双重否定来完成
SELECT  t.*
FROM    student t
WHERE   t.S# NOT IN ( SELECT DISTINCT
                                m.S#
                      FROM      ( SELECT    S# ,
                                            C#
                                  FROM      student ,
                                            course
                                ) m
                      WHERE     NOT EXISTS ( SELECT 1
                                             FROM   sc n
                                             WHERE  n.S# &#61; m.S#
                                                    AND n.C# &#61; m.C# ) )
--方法3 使用双重否定来完成
SELECT  t.*
FROM    student t
WHERE   NOT EXISTS ( SELECT 1
                     FROM   ( SELECT DISTINCT
                                        m.S#
                              FROM      ( SELECT    S# ,
                                                    C#
                                          FROM      student ,
                                                    course
                                        ) m
                              WHERE     NOT EXISTS ( SELECT 1
                                                     FROM   sc n
                                                     WHERE  n.S# &#61; m.S#
                                                            AND n.C# &#61; m.C# )
                            ) k
                     WHERE  k.S# &#61; t.S# )

--46、查询各学生的年龄
--46.1 只按照年份来算
SELECT  * ,
        DATEDIFF(yy, sage, GETDATE()) [年龄]
FROM    student
--46.2 按照出生日期来算&#xff0c;当前月日 <出生年月的月日则&#xff0c;年龄减一
SELECT  * ,
        CASE WHEN RIGHT(CONVERT(VARCHAR(10), GETDATE(), 120), 5)                                                               5)
             THEN DATEDIFF(yy, sage, GETDATE()) - 1
             ELSE DATEDIFF(yy, sage, GETDATE())
        END [年龄]
FROM    student

--47、查询本周过生日的学生
SELECT  *
FROM    student
WHERE   DATEDIFF(week,
                 DATENAME(yy, GETDATE()) &#43; RIGHT(CONVERT(VARCHAR(10), sage, 120),
                                                 6), GETDATE()) &#61; 0

--48、查询下周过生日的学生
SELECT  *
FROM    student
WHERE   DATEDIFF(week,
                 DATENAME(yy, GETDATE()) &#43; RIGHT(CONVERT(VARCHAR(10), sage, 120),
                                                 6), GETDATE()) &#61; -1

--49、查询本月过生日的学生
SELECT  *
FROM    student
WHERE   DATEDIFF(mm,
                 DATENAME(yy, GETDATE()) &#43; RIGHT(CONVERT(VARCHAR(10), sage, 120),
                                                 6), GETDATE()) &#61; 0

--50、查询下月过生日的学生
SELECT  *
FROM    student
WHERE   DATEDIFF(mm,
                 DATENAME(yy, GETDATE()) &#43; RIGHT(CONVERT(VARCHAR(10), sage, 120),
                                                 6), GETDATE()) &#61; -1

DROP TABLE  Student,Course,Teacher,SC


转:https://my.oschina.net/yexiaofeng/blog/1818166



推荐阅读
  • 本文详细介绍了在 Oracle 数据库中使用 MyBatis 实现增删改查操作的方法。针对查询操作,文章解释了如何通过创建字段映射来处理数据库字段风格与 Java 对象之间的差异,确保查询结果能够正确映射到持久层对象。此外,还探讨了插入、更新和删除操作的具体实现及其最佳实践,帮助开发者高效地管理和操作 Oracle 数据库中的数据。 ... [详细]
  • MySQL Decimal 类型的最大值解析及其在数据处理中的应用艺术
    在关系型数据库中,表的设计与SQL语句的编写对性能的影响至关重要,甚至可占到90%以上。本文将重点探讨MySQL中Decimal类型的最大值及其在数据处理中的应用技巧,通过实例分析和优化建议,帮助读者深入理解并掌握这一重要知识点。 ... [详细]
  • 在尝试对 QQmlPropertyMap 类进行测试驱动开发时,发现其派生类中无法正常调用槽函数或 Q_INVOKABLE 方法。这可能是由于 QQmlPropertyMap 的内部实现机制导致的,需要进一步研究以找到解决方案。 ... [详细]
  • PTArchiver工作原理详解与应用分析
    PTArchiver工作原理及其应用分析本文详细解析了PTArchiver的工作机制,探讨了其在数据归档和管理中的应用。PTArchiver通过高效的压缩算法和灵活的存储策略,实现了对大规模数据的高效管理和长期保存。文章还介绍了其在企业级数据备份、历史数据迁移等场景中的实际应用案例,为用户提供了实用的操作建议和技术支持。 ... [详细]
  • 在使用 Cacti 进行监控时,发现已运行的转码机未产生流量,导致 Cacti 监控界面显示该转码机处于宕机状态。进一步检查 Cacti 日志,发现数据库中存在 SQL 查询失败的问题,错误代码为 145。此问题可能是由于数据库表损坏或索引失效所致,建议对相关表进行修复操作以恢复监控功能。 ... [详细]
  • 如何将TS文件转换为M3U8直播流:HLS与M3U8格式详解
    在视频传输领域,MP4虽然常见,但在直播场景中直接使用MP4格式存在诸多问题。例如,MP4文件的头部信息(如ftyp、moov)较大,导致初始加载时间较长,影响用户体验。相比之下,HLS(HTTP Live Streaming)协议及其M3U8格式更具优势。HLS通过将视频切分成多个小片段,并生成一个M3U8播放列表文件,实现低延迟和高稳定性。本文详细介绍了如何将TS文件转换为M3U8直播流,包括技术原理和具体操作步骤,帮助读者更好地理解和应用这一技术。 ... [详细]
  • 本文介绍了如何利用Shell脚本高效地部署MHA(MySQL High Availability)高可用集群。通过详细的脚本编写和配置示例,展示了自动化部署过程中的关键步骤和注意事项。该方法不仅简化了集群的部署流程,还提高了系统的稳定性和可用性。 ... [详细]
  • 本文全面解析了 Python 中字符串处理的常用操作与技巧。首先介绍了如何通过 `s.strip()`, `s.lstrip()` 和 `s.rstrip()` 方法去除字符串中的空格和特殊符号。接着,详细讲解了字符串复制的方法,包括使用 `sStr1 = sStr2` 进行简单的赋值复制。此外,还探讨了字符串连接、分割、替换等高级操作,并提供了丰富的示例代码,帮助读者深入理解和掌握这些实用技巧。 ... [详细]
  • 深入剖析Java中SimpleDateFormat在多线程环境下的潜在风险与解决方案
    深入剖析Java中SimpleDateFormat在多线程环境下的潜在风险与解决方案 ... [详细]
  • 本指南从零开始介绍Scala编程语言的基础知识,重点讲解了Scala解释器REPL(读取-求值-打印-循环)的使用方法。REPL是Scala开发中的重要工具,能够帮助初学者快速理解和实践Scala的基本语法和特性。通过详细的示例和练习,读者将能够熟练掌握Scala的基础概念和编程技巧。 ... [详细]
  • 深入理解排序算法:集合 1(编程语言中的高效排序工具) ... [详细]
  • MyISAM和InnoDB是MySQL中最为广泛使用的两种存储引擎,每种引擎都有其独特的优势和适用场景。MyISAM引擎以其简单的结构和高效的读取速度著称,适用于以读操作为主、对事务支持要求不高的应用。而InnoDB引擎则以其强大的事务处理能力和行级锁定机制,在需要高并发写操作和数据完整性的场景下表现出色。选择合适的存储引擎应综合考虑业务需求、性能要求和数据一致性等因素。 ... [详细]
  • Python全局解释器锁(GIL)机制详解
    在Python中,线程是操作系统级别的原生线程。为了确保多线程环境下的内存安全,Python虚拟机引入了全局解释器锁(Global Interpreter Lock,简称GIL)。GIL是一种互斥锁,用于保护对解释器状态的访问,防止多个线程同时执行字节码。尽管GIL有助于简化内存管理,但它也限制了多核处理器上多线程程序的并行性能。本文将深入探讨GIL的工作原理及其对Python多线程编程的影响。 ... [详细]
  • 在深入掌握Spring框架的事务管理之前,了解其背后的数据库事务基础至关重要。Spring的事务管理功能虽然强大且灵活,但其核心依赖于数据库自身的事务处理机制。因此,熟悉数据库事务的基本概念和特性是必不可少的。这包括事务的ACID属性、隔离级别以及常见的事务管理策略等。通过这些基础知识的学习,可以更好地理解和应用Spring中的事务管理配置。 ... [详细]
  • 本文全面解析了JavaScript中的DOM操作,并提供了详细的实践指南。DOM节点(Node)通常代表一个标签、文本或HTML属性,每个节点都具有一个nodeType属性,用于标识其类型。文章深入探讨了DOM节点的创建、查询、修改和删除等操作,结合实际案例,帮助读者更好地理解和掌握DOM编程技术。 ... [详细]
author-avatar
秋梯田那路77
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有