• 关于面试总结3-SQL查询


    前言

    select top n 形式的语句可以获取查询的前几个记录,但是 mysql没有此语法,mysql用limit来实现相关功能。
    LIMIT子句可以被用于强制 SELECT 语句返回指定的记录数。LIMIT 接受一个或两个数字参数。参数必须是一个整数常量。
    如果给定两个参数,第一个参数指定第一个返回记录行的偏移量,第二个参数指定返回记录行的最大数目。

    • 1.列出数学成绩前3名的学生(要求显示字段:学号,姓名, 科目,成绩)
    • 2.查询数学成绩第2和第3名的学生
    • 3.查询第3名到后面所有的学生数学成绩
    • 4.统计英语课程少于80分的,显示 学号id, 姓名,科目,分数
    • 5.查找每科成绩前2名,显示id, 姓名,科目,分数

    万年不变学生表

    有2张表,学生表(student)基本信息如下

    科目和分数表(grade)

    查询前3名

    1.列出数学成绩前3名的学生(要求显示字段:学号,姓名, 科目,成绩)

    select  * 
    from grade 
    where kemu = '数学'
    order by score 
    desc
    limit 3
    

    先通过limit取出前三条记录,再结合student表查询

    select  a.id, a.name, b.kemu, b.score
    from student a, grade b
    where a.id = b.id
    and kemu = '数学'
    order by score 
    desc
    limit 3
    

    查询第2-3名记录

    2.查询数学成绩第2和第3名的学生

    imit后面如果只写一个整数n,那就是查询的前n条记录;如果后面带2个整数n 和 m,那么第一个数n就是查询出来队列的起点(从0开始),第二个是m是统计的总数目
    第2-3条记录,那么起点就是1, 第2-3名有2条记录,那么第二个参数就是2

    select  a.id, a.name, b.kemu, b.score
    from student a, grade b
    where a.id = b.id
    and kemu = '数学'
    order by score 
    desc
    limit 1, 2
    

    备注:limit是按条数取的,名次一样的,也算一个记录。如果取第5-14的记录,那就是limit 4 10

    查询第3到后面所有的

    3.查询第3名到后面所有的学生数学成绩

    select  a.id, a.name, b.kemu, b.score
    from student a, grade b
    where a.id = b.id
    and kemu = '数学'
    order by score 
    desc
    limit 2, 10000
    

    注意:有些资料上写的limit 2, -1 用-1代码最大值,这个是不对的,会报错,解决办法:随便写个非常大的整数

    英语课程少于80分的人

    4.统计英语课程少于80分的,显示 学号id, 姓名,科目,分数

    SELECT a.id, a.name, b.kemu, b.score
    FROM student a, grade b
    WHERE a.id = b.id
    AND b.kemu = '英语'
    AND b.score < 80
    

    统计每门课程不及格、一般、优秀

    课程 不及格(<60) 一般(60<= x <=80) 优秀(>80)
    SELECT b.kemu, 
    
    (SELECT COUNT(*) FROM grade WHERE score < 60 and kemu = b.kemu) as 不及格,
    (SELECT COUNT(*) FROM grade WHERE score between 60 and 80 and kemu = b.kemu) as 一般,
    (SELECT COUNT(*) FROM grade WHERE score > 80 and kemu = b.kemu) as 优秀
     
    FROM grade b
    GROUP BY kemu
    

    查找每科成绩前2名

    5.查找每科成绩前2名,显示id, 姓名,科目,分数

    先按科目和分数查询

    SELECT t1.id, t1.kemu,t1.score 
    FROM grade t1 
    ORDER BY t1.kemu,t1.score DESC
    

    再查找每个每科前面2名

    SELECT t1.id, a.name, t1.kemu,t1.score
    FROM grade t1, student a
    WHERE
    	(SELECT count(*) FROM grade t2 
    	WHERE t1.kemu=t2.kemu AND t2.score>=t1.score
    	)<=2
    and a.id = t1.id
    ORDER BY t1.kemu,t1.score 
    DESC
    

    如果第二名有重复的,也能一起查找出来

    SELECT t1.id, a.name, t1.kemu,t1.score
    FROM grade t1, student a
    WHERE
    	(SELECT count(*) FROM grade t2 
    	WHERE t1.kemu=t2.kemu AND t2.score>t1.score
    	)<2
    and a.id = t1.id
    ORDER BY t1.kemu,t1.score 
    DESC
    

    交流QQ群:779429633

  • 相关阅读:
    shell:定时任务crontab
    shell:采集进程的cpu和内存利用率_随手记1
    临时记录
    python:numpy库和matplotlib库
    python:urllib:HTTPResponse对象的用法
    美国亚马逊图片打不开
    互联网协议
    range 和 xrange
    国内服务器的端口开放问题
    Mac上设置Chrome跨域
  • 原文地址:https://www.cnblogs.com/yoyoketang/p/10076869.html
Copyright © 2020-2023  润新知