码农知识堂 - 1000bd
  •   Python
  •   PHP
  •   JS/TS
  •   JAVA
  •   C/C++
  •   C#
  •   GO
  •   Kotlin
  •   Swift
  • Spark--经典SQL50题


    目录

    连接数据库准备工作

    1、查询"01"课程比"02"课程成绩高的学生的信息及课程分数

    2、查询"01"课程比"02"课程成绩低的学生的信息及课程分数

    3、查询平均成绩大于等于60分的同学的学生编号和学生姓名和平均成绩

    4、查询平均成绩小于60分的同学的学生编号和学生姓名和平均成绩

    5、查询所有同学的学生编号、学生姓名、选课总数、所有课程的总成绩

    6、查询"李"姓老师的数量

    7、查询学过"李四"老师授课的同学的信息

    8、查询没有学过"李四"老师授课的同学的信息

    9、查询学过编号为"01"并且也学过编号为"02"的课程的同学的信息

    10、查询学过编号为"01"并且没有学过编号为"02"的课程的同学的信息

    11、查询没有学全所有课程的同学的信息

    12、查询至少有一门课与学号为"01"的同学所学相同的同学的信息

    13、查询和"01"号的同学学习的课程完全相同的其他同学的信息

    14、查询没学过"张三"老师讲授的任一门课程的学生姓名

    15、查询两门及其以上不及格课程的同学的学号,姓名及其平均成绩

    16、检索"01"课程分数小于60,按分数降序排列的学生信息

    17、按平均成绩从高到低显示所有学生的所有课程的成绩以及平均成绩

    18、查询各科成绩最高分、最低分和平均分:

    以如下形式显示:课程ID,课程name,最高分,最低分,平均分,及格率,中等率,优良率

    及格为>=60,中等为:70-80,优良为:80-90,优秀为:>=90

    19、按各科成绩进行排序,并显示排名

    20、查询学生的总成绩并进行排名

    21、查询不同老师所教不同课程平均分从高到低显示

    22、查询所有课程的成绩第2名到第3名的学生信息及该课程成绩

    23、统计各科成绩各分数段人数:课程编号,课程名称, 100-85 , 85-70 , 70-60 , 0-60 及所占百分比

    24、查询学生平均成绩及其名次

    25、查询各科成绩前三名的记录

    26、查询每门课程被选修的学生数

    27、查询出只有两门课程的全部学生的学号和姓名

    28、查询男生、女生人数

    29、查询名字中含有"风"字的学生信息

    30、查询同名同性学生名单,并统计同名人数

    31、查询1990年出生的学生名单(注:Student表中Sage列的类型是datetime)

    32、查询每门课程的平均成绩,结果按平均成绩降序排列,平均成绩相同时,按课程编号升序排列

    33、查询平均成绩大于等于85的所有学生的学号、姓名和平均成绩

    34、查询课程名称为"数学",且分数低于60的学生姓名和分数

    35、查询所有学生的课程及分数情况

    36、查询任何一门课程成绩在70分以上的姓名、课程名称和分数

    37、查询课程不及格的学生

    38、查询课程编号为01且课程成绩在80分及以上的学生的学号和姓名

    39、求每门课程的学生人数

    40、查询选修"张三"老师所授课程的学生中,成绩最高的学生信息及其成绩

    41、查询不同课程成绩相同的学生的学生编号、课程编号、学生成绩

    42、查询每门功课成绩最好的前两名

    43、统计每门课程的学生选修人数(超过5人的课程才统计)。要求输出课程号和选修人数, 查询结果按人数降序排列,若人数相同,按课程号升序排列

    44、检索至少选修两门课程的学生学号

    45、查询选修了全部课程的学生信息

    46、查询各学生的年龄

    47、查询本周过生日的学生

    48、查询下周过生日的学生

    49、查询本月过生日的学生

    50、查询下月过生日的学生


    连接数据库准备工作

    创建DataFrame

    1. val spark: SparkSession = SparkSession
    2. .builder()
    3. .appName("Spark_SQL50")
    4. .master("local[*]")
    5. .getOrCreate()
    6. import spark.implicits._
    7. import org.apache.spark.sql.functions._
    8. val url = "jdbc:mysql://192.168.142.129:3306/sql50"
    9. val user = "root"
    10. val pwd = "123456"
    11. val driver = "com.mysql.cj.jdbc.Driver"
    12. val properties = new Properties()
    13. properties.setProperty("user", user)
    14. properties.setProperty("password", pwd)
    15. properties.setProperty("driver", driver)
    16. val score = spark.read.jdbc(url, "score", properties)
    17. val course = spark.read.jdbc(url, "course", properties)
    18. val student = spark.read.jdbc(url, "student", properties)
    19. val teacher = spark.read.jdbc(url, "teacher", properties)
    20. val student_copy1 = spark.read.jdbc(url, "student_copy1", properties)

    1、查询"01"课程比"02"课程成绩高的学生的信息及课程分数

    1. score.as("s1").join(score.as("s2"), "s_id")
    2. .where("s1.s_score>s2.s_score and s1.c_id = 01 and s2.c_id = 02")
    3. .join(student, "s_id")
    4. .select("s_name", "s1.c_id", "s1.s_score", "s2.c_id", "s2.s_score")
    5. .show()

    2、查询"01"课程比"02"课程成绩低的学生的信息及课程分数

    1. score.as("s1").join(score.as("s2"), "s_id")
    2. .where("s1.s_score < s2.s_score and s1.c_id = 01 and s2.c_id = 02")
    3. .join(student, "s_id")
    4. .select("s_name", "s1.c_id", "s1.s_score", "s2.c_id", "s2.s_score")
    5. .show()

    3、查询平均成绩大于等于60分的同学的学生编号和学生姓名和平均成绩

    1. score.groupBy("s_id")
    2. .avg("s_score")
    3. .where($"avg(s_score)">=60)
    4. .join(student, "s_id")
    5. .select("s_id", "s_name", "avg(s_score)")
    6. .show

    4、查询平均成绩小于60分的同学的学生编号和学生姓名和平均成绩

    1. student
    2. .join(score.groupBy("s_id").avg("s_score"), Seq("s_id"), "left")
    3. .where($"avg(s_score)" < 60 || $"avg(s_score)".isNull)
    4. .select("s_id", "s_name", "avg(s_score)")
    5. .show

    5、查询所有同学的学生编号、学生姓名、选课总数、所有课程的总成绩

    1. student
    2. .join(score.groupBy("s_id").count(),Seq("s_id"), "left")
    3. .join(score.groupBy("s_id").sum("s_score"), Seq("s_id"), "left")
    4. .select("s_id", "s_name", "count", "sum(s_score)")
    5. .show()

     

    6、查询"李"姓老师的数量

    1. println(teacher
    2. .where($"t_name".like("李%"))
    3. .count())

    7、查询学过"李四"老师授课的同学的信息

    1. student.join(score,"s_id")
    2. .join(course, "c_id")
    3. .join(teacher, "t_id")
    4. .where($"t_name" === "李四")
    5. .select("s_name", "c_name","t_name")
    6. .show

    8、查询没有学过"李四"老师授课的同学的信息

    1. student.join(student.join(score,Seq("s_id"), "left")
    2. .join(course,Seq("c_id"), "left")
    3. .join(teacher,Seq("t_id"), "left")
    4. .where($"t_name" === "李四").select("s_id","s_score"),Seq("s_id"), "left"
    5. ).where($"s_score".isNull)
    6. .select("s_id", "s_name")
    7. .show()

    9、查询学过编号为"01"并且也学过编号为"02"的课程的同学的信息

    1. student
    2. .join(score,Seq("s_id")).where("c_id == 01")
    3. .join(student.join(score,Seq("s_id")).where("c_id == 02"),"s_id")
    4. .show()

    10、查询学过编号为"01"并且没有学过编号为"02"的课程的同学的信息

    1. student.as("s1")
    2. .join(score, "s_id").where("c_id == 01")
    3. .join(student.as("s2").join(score, "s_id")
    4. .where("c_id == 02"), Seq("s_id"), "left")
    5. .where($"s2.s_name".isNull)
    6. .show()

    11、查询没有学全所有课程的同学的信息

    1. student.join(
    2. student.join(score,"s_id").join(course,"c_id").groupBy("s_id").count()
    3. , Seq("s_id"), "left"
    4. ).where($"count" < course.count() || $"count".isNull).show()

    12、查询至少有一门课与学号为"01"的同学所学相同的同学的信息

    1. student.as("stu")
    2. .join(score.as("sc").join(score.where($"s_id"==="01"),
    3. Seq("c_id"), "left"),
    4. Seq("s_id"))
    5. .where($"stu.s_id".notEqual("01"))
    6. .select("stu.s_id","s_name")
    7. .distinct()
    8. .show

    13、查询和"01"号的同学学习的课程完全相同的其他同学的信息

    1. student
    2. .join(score, "s_id")
    3. .groupBy($"s_id").count().where($"count".equalTo(3))
    4. .where($"s_id".notEqual("01"))
    5. .join(student, Seq("s_id"), "left")
    6. .show()

    14、查询没学过"张三"老师讲授的任一门课程的学生姓名

    1. student
    2. .join(score, "s_id")
    3. .join(course,"c_id")
    4. .join(teacher,"t_id")
    5. .where($"t_name"==="张三")
    6. .as("stu1")
    7. .join(student.as("stu2"),Seq("s_id"),"right")
    8. .where($"t_name".isNull)
    9. .select("stu2.s_id","stu2.s_name")
    10. .show

    15、查询两门及其以上不及格课程的同学的学号,姓名及其平均成绩

    1. score
    2. .where($"s_score" < 60).groupBy("s_id").count()
    3. .where($"count" >= 2)
    4. .join(score,"s_id")
    5. .groupBy("s_id")
    6. .agg(round(avg("s_score"),2))
    7. .join(student,"s_id")
    8. .show

    16、检索"01"课程分数小于60,按分数降序排列的学生信息

    1. score
    2. .where($"c_id"==="01" && $"s_score" < 60)
    3. .join(student,"s_id")
    4. .sort(desc("s_score"))
    5. .show

    17、按平均成绩从高到低显示所有学生的所有课程的成绩以及平均成绩

    1. score.groupBy("s_id").agg(round(avg("s_score"),2).as("avgScore"))
    2. .join(score,"s_id")
    3. .join(student,"s_id")
    4. .orderBy($"avgScore".desc)
    5. .show

    18、查询各科成绩最高分、最低分和平均分:

    以如下形式显示:课程ID,课程name,最高分,最低分,平均分,及格率,中等率,优良率

    及格为>=60,中等为:70-80,优良为:80-90,优秀为:>=90

    1. //1 先求出 及格,中等,优良,优秀 各阶段人数
    2. val numDF = score.groupBy("c_id").count()
    3. val passDF = score.where($"s_score" >= 60).groupBy("c_id").count()
    4. val midDF = score.where($"s_score" >= 70 && $"s_score" < 80).groupBy("c_id").count()
    5. val goodDF = score.where($"s_score" >= 80 && $"s_score" < 90).groupBy("c_id").count()
    6. val bestDF = score.where($"s_score" >= 90).groupBy("c_id").count()
    7. //2 求出及格率,中等率,优良率,优秀率
    8. val passPerDF = numDF.as("n")
    9. .join(passDF.as("m"), "c_id").withColumn("passPer", round($"m.count" / $"n.count", 2))
    10. .drop("count")
    11. val midPerDF = numDF.as("n")
    12. .join(midDF.as("m"), "c_id").withColumn("midPer", round($"m.count" / $"n.count", 2))
    13. .drop("count")
    14. val goodPerDF = numDF.as("n")
    15. .join(goodDF.as("m"), "c_id").withColumn("goodPer", round($"m.count" / $"n.count", 2))
    16. .drop("count")
    17. val bestPerDF = numDF.as("n")
    18. .join(bestDF.as("m"), "c_id").withColumn("bestPer", round($"m.count" / $"n.count", 2))
    19. .drop("count")
    20. //3 求出课程最高分,最低分,平均分 join各比率
    21. course
    22. .join(
    23. score.groupBy("c_id")
    24. .agg(max("s_score").as("maxScore"),
    25. min("s_score").as("minScore"),
    26. round(avg("s_score"),2).as("avgScore")),"c_id")
    27. .join(passPerDF,Seq("c_id"),"left")
    28. .join(midPerDF,Seq("c_id"),"left")
    29. .join(goodPerDF,Seq("c_id"),"left")
    30. .join(bestPerDF,Seq("c_id"),"left")
    31. .drop("t_id")
    32. .show

    19、按各科成绩进行排序,并显示排名

    1. score
    2. .withColumn("rank",
    3. dense_rank()
    4. .over(
    5. Window.partitionBy("c_id").orderBy($"s_score".desc)
    6. )
    7. )
    8. .show()

    20、查询学生的总成绩并进行排名

    1. score
    2. .groupBy("s_id")
    3. .sum("s_score")
    4. .withColumn("rank",dense_rank().over(Window.orderBy($"sum(s_score)".desc)))
    5. .show()

    21、查询不同老师所教不同课程平均分从高到低显示

    1. score
    2. .groupBy("c_id")
    3. .agg(round(avg("s_score"), 2).as("avgScore"))
    4. .withColumn("rank", dense_rank().over(Window.orderBy($"avgScore".desc)))
    5. .show()

    22、查询所有课程的成绩第2名到第3名的学生信息及该课程成绩

    1. score
    2. .withColumn("rank", dense_rank().over(Window.partitionBy("c_id").orderBy($"s_score".desc)))
    3. .where($"rank".isin(2,3))
    4. .join(student,"s_id")
    5. .show()

    23、统计各科成绩各分数段人数:课程编号,课程名称, 100-85 , 85-70 , 70-60 , 0-60 及所占百分比

    1. //方法一
    2. //1 先求出 总人数 及 100-85 , 85-70 , 70-60 , 0-60 各阶段人数
    3. val numDF = score.groupBy("c_id").count()
    4. val passDF = score.where($"s_score" >= 0 && $"s_score" < 60).groupBy("c_id").count()
    5. val midDF = score.where($"s_score" >= 60 && $"s_score" < 70).groupBy("c_id").count()
    6. val goodDF = score.where($"s_score" >= 70 && $"s_score" < 85).groupBy("c_id").count()
    7. val bestDF = score.where($"s_score" >= 85 && $"s_score" <= 100).groupBy("c_id").count()
    8. //2 求出 100-85 , 85-70 , 70-60 , 0-60所占百分比
    9. val passPerDF = numDF.as("n")
    10. .join(passDF.as("m"), "c_id").withColumn("lt60", round($"m.count" / $"n.count", 2))
    11. .drop("count")
    12. val midPerDF = numDF.as("n")
    13. .join(midDF.as("m"), "c_id").withColumn("70-60", round($"m.count" / $"n.count", 2))
    14. .drop("count")
    15. val goodPerDF = numDF.as("n")
    16. .join(goodDF.as("m"), "c_id").withColumn("85-70", round($"m.count" / $"n.count", 2))
    17. .drop("count")
    18. val bestPerDF = numDF.as("n")
    19. .join(bestDF.as("m"), "c_id").withColumn("100-85", round($"m.count" / $"n.count", 2))
    20. .drop("count")
    21. //3 course表 join各比率
    22. course
    23. .join(passPerDF,Seq("c_id"),"left")
    24. .join(midPerDF,Seq("c_id"),"left")
    25. .join(goodPerDF,Seq("c_id"),"left")
    26. .join(bestPerDF,Seq("c_id"),"left")
    27. .drop("t_id")
    28. .show
    29. //方法2 count(when(condition), value),
    30. // 由于between操作符是包含左右边界的,临界点分数存在重复计算,此方法仅供参考
    31. score.groupBy("c_id").agg(
    32. count("s_score").as("count"),
    33. count(when($"s_score".between(85, 100), 1)).as("lt60Row"),
    34. count(when($"s_score".between(70, 85), 1)).as("60-70Row"),
    35. count(when($"s_score".between(60, 70), 1)).as("70-85Row"),
    36. count(when($"s_score".between(0, 60), 1)).as("85-100Row")
    37. )
    38. .withColumn("lt60", round($"lt60Row" / $"count", 2))
    39. .withColumn("60-70", round($"60-70Row" / $"count", 2))
    40. .withColumn("70-85", round($"70-85Row" / $"count", 2))
    41. .withColumn("85-100", round($"85-100Row" / $"count", 2))
    42. .join(course, "c_id")
    43. .select("c_id", "c_name", "lt60", "60-70", "70-85", "85-100")
    44. .show()

    24、查询学生平均成绩及其名次

    1. score
    2. .groupBy("s_id")
    3. .agg(round(avg("s_score"), 2).as("avgScore"))
    4. .withColumn("rank",dense_rank().over(Window.orderBy($"avgScore".desc)))
    5. .show()

    25、查询各科成绩前三名的记录

    1. score
    2. .withColumn("rank",
    3. dense_rank().over(Window.partitionBy("c_id").orderBy($"s_score".desc))
    4. )
    5. .where($"rank".between(1,3))
    6. .show()

    26、查询每门课程被选修的学生数

    1. score
    2. .groupBy("c_id")
    3. .count()
    4. .show()

    27、查询出只有两门课程的全部学生的学号和姓名

    1. score
    2. .groupBy("s_id")
    3. .agg(count($"c_id").as("count"))
    4. .where($"count" === 2)
    5. .join(student, "s_id")
    6. .select("s_id", "s_name", "count")
    7. .show()

    28、查询男生、女生人数

    1. student
    2. .groupBy("s_sex")
    3. .count()
    4. .show()

    29、查询名字中含有"风"字的学生信息

    1. student
    2. .where($"s_name".contains("风"))
    3. .show()

    30、查询同名同性学生名单,并统计同名人数

    1. student_copy1
    2. .groupBy("s_name","s_sex")
    3. .count()
    4. .where($"count" > 1)
    5. .show

    31、查询1990年出生的学生名单(注:Student表中Sage列的类型是datetime)

    1. student
    2. .where(year($"s_birth")==="1990")
    3. .show

       

    32、查询每门课程的平均成绩,结果按平均成绩降序排列,平均成绩相同时,按课程编号升序排列

    1. score
    2. .groupBy("c_id")
    3. .avg("s_score")
    4. .orderBy($"avg(s_score)".desc, $"c_id")
    5. .show()

    33、查询平均成绩大于等于85的所有学生的学号、姓名和平均成绩

    1. score
    2. .groupBy("s_id")
    3. .avg("s_score")
    4. .where($"avg(s_score)" >= 85)
    5. .join(student,"s_id")
    6. .select("s_id", "s_name", "avg(s_score)")
    7. .show()

    34、查询课程名称为"数学",且分数低于60的学生姓名和分数

    1. score
    2. .join(course, "c_id")
    3. .where($"c_name" === "数学" && $"s_score" < 60)
    4. .join(student, "s_id")
    5. .select("s_name", "s_score")
    6. .show

    35、查询所有学生的课程及分数情况

    1. student
    2. .join(score, Seq("s_id"), "left")
    3. .show()

    36、查询任何一门课程成绩在70分以上的姓名、课程名称和分数

    1. score
    2. .where($"s_score" > 70)
    3. .join(student, "s_id")
    4. .join(course, "c_id")
    5. .select("s_name", "c_name", "s_score")
    6. .show()

    37、查询课程不及格的学生

    1. score
    2. .where($"s_score" < 60)
    3. .show()

    38、查询课程编号为01且课程成绩在80分及以上的学生的学号和姓名

    1. score
    2. .where($"c_id" === "01" && $"s_score" >= 80)
    3. .join(student, "s_id")
    4. .select("s_id", "s_name", "c_id","s_score")
    5. .show()

    39、求每门课程的学生人数

    1. score
    2. .groupBy("c_id")
    3. .count()
    4. .show()

    40、查询选修"张三"老师所授课程的学生中,成绩最高的学生信息及其成绩

    1. score
    2. .join(course, "c_id")
    3. .join(teacher, "t_id")
    4. .where($"t_name" === "张三")
    5. .orderBy($"s_score".desc)
    6. .limit(1)
    7. .join(student, "s_id")
    8. .show()

    41、查询不同课程成绩相同的学生的学生编号、课程编号、学生成绩

    1. score
    2. .groupBy("s_score")
    3. .count()
    4. .where($"count" > 1)
    5. .join(score, "s_score")
    6. .show()

    42、查询每门功课成绩最好的前两名

    1. score
    2. .withColumn("rank",
    3. rank().over(Window.partitionBy("c_id").orderBy($"s_score".desc))
    4. )
    5. .where($"rank".isin(1, 2))
    6. .show()

    43、统计每门课程的学生选修人数(超过5人的课程才统计)。要求输出课程号和选修人数, 查询结果按人数降序排列,若人数相同,按课程号升序排列

    1. score
    2. .groupBy("c_id")
    3. .count()
    4. .where($"count" > 5)
    5. .orderBy($"count".desc, $"c_id")
    6. .show

    44、检索至少选修两门课程的学生学号

    1. score
    2. .groupBy("s_id").count()
    3. .where($"count" >= 2)
    4. .show()

    45、查询选修了全部课程的学生信息

    1. score
    2. .groupBy("s_id")
    3. .count()
    4. .where($"count" === course.count())
    5. .join(student, "s_id")
    6. .show()

    46、查询各学生的年龄

    1. student
    2. .withColumn("age", year(current_date()) - year($"s_birth"))
    3. .show()

    47、查询本周过生日的学生

    1. student
    2. .withColumn("birthOfWeek", weekofyear($"s_birth"))
    3. .where($"birthOfWeek" === weekofyear(current_date()))
    4. .show

    48、查询下周过生日的学生

    1. student
    2. .withColumn("birthOfWeek", weekofyear($"s_birth"))
    3. .where($"birthOfWeek" === weekofyear(current_date()) + 1)
    4. .show

    49、查询本月过生日的学生

    1. student
    2. .withColumn("birthOfMonth", month($"s_birth"))
    3. .where($"birthOfMonth" === month(current_date()))
    4. .show

    50、查询下月过生日的学生

    1. student
    2. .withColumn("birthOfMonth", month($"s_birth"))
    3. .where($"birthOfMonth" === month(current_date() + 1))
    4. .show

  • 相关阅读:
    mysql 执行计划 type详解
    目标检测算法实战综述
    ⑩⑧【MySQL】InnoDB架构、事务原理、MVCC多版本并发控制
    Spring MVC中如何限制Controller为POST或GET方式接收参数呢?
    列举一些常用的Webpack配置和插件
    防抖(debounce)与节流(throttle)函数的应用
    使用gitee部署静态网页
    分块查找 确定查找位置
    Hadoop介绍及群集搭建
    如何让社交媒体成为跨境电商驱动力?这款独立站工具不能错过!
  • 原文地址:https://blog.csdn.net/weixin_63713552/article/details/133958021
  • 最新文章
  • 攻防演习之三天拿下官网站群
    数据安全治理学习——前期安全规划和安全管理体系建设
    企业安全 | 企业内一次钓鱼演练准备过程
    内网渗透测试 | Kerberos协议及其部分攻击手法
    0day的产生 | 不懂代码的"代码审计"
    安装scrcpy-client模块av模块异常,环境问题解决方案
    leetcode hot100【LeetCode 279. 完全平方数】java实现
    OpenWrt下安装Mosquitto
    AnatoMask论文汇总
    【AI日记】24.11.01 LangChain、openai api和github copilot
  • 热门文章
  • 十款代码表白小特效 一个比一个浪漫 赶紧收藏起来吧!!!
    奉劝各位学弟学妹们,该打造你的技术影响力了!
    五年了,我在 CSDN 的两个一百万。
    Java俄罗斯方块,老程序员花了一个周末,连接中学年代!
    面试官都震惊,你这网络基础可以啊!
    你真的会用百度吗?我不信 — 那些不为人知的搜索引擎语法
    心情不好的时候,用 Python 画棵樱花树送给自己吧
    通宵一晚做出来的一款类似CS的第一人称射击游戏Demo!原来做游戏也不是很难,连憨憨学妹都学会了!
    13 万字 C 语言从入门到精通保姆级教程2021 年版
    10行代码集2000张美女图,Python爬虫120例,再上征途
Copyright © 2022 侵权请联系2656653265@qq.com    京ICP备2022015340号-1
正则表达式工具 cron表达式工具 密码生成工具

京公网安备 11010502049817号