zoukankan      html  css  js  c++  java
  • 数据库子查询经典面试题

    数据库】SQL经典面试题 - 数据库查询 - 子查询应用二
     发布于 1 年前  作者 tommy  575 次浏览  最后一次编辑是 10 个月前  来自 数据库

    上节课我们通过子查询,完成了查询的最高分学生的需求,今天我们来学习子查询的分类,以及通过子查询来完成工作中经常遇到一些个性化需求。

    子查询概念:

    一个SELECT语句嵌套在另一个SELECT语句中,子查询也叫做内部查询,而包含子查询的语句又称为外部查询或主查询,子查询自身可以包含一个或多个子查询,一个查询语句中可以嵌套任意数量的子查询

    子查询可分类:

    非相关子查询:独立于外部查询,子查询只执行一次,执行完将结果传递给外部查询
    相关子查询:依赖于外部查询的数据,外部查询每执行一次,子查询就执行一次

    面试题:

    还是这道数据库面试题
    柠檬班第30期学生要毕业了,他们的成绩存放在下表中,写出以下的SQL语句

    图片1.png

    1.创建表 create table table lemon_grade (id int(10) primary key auto_increment , name varchar(20), linux float(10), mysql float(10), java float(10), grade varchar(10));

    2. 插入数据insert into lemon_grade (name,linux,mysql,java,grade) 

    values ("刘一",80,60,70,"18期"),("陈二”,70,90,80,"18期").....;

    3.修改数据 update lemon_grade set mysgl = 70 where name ="刘一";

    4.删除数据delete from lemon_grade where name ='郑十’;

    题目一:查询最新的一条记录

    select * from lemon_grade group by id desc limit1;

    select * from lemon_grade where id= max(id);

    Order by 方式:

    降序排列然后得到我们最新的一条记录,这是我们常写的一种方式

    SELECT * FROM tb_lemon_grade ORDER BY id DESC LIMIT 1;
    子查询方式:

    但查询最新一条记录,也可以这么去思考:查看id值最大(id是自动增长的,最新表示id值最大)的记录,所以可以这么去写查询

    SELECT * FROM tb_lemon_grade WHERE id = ( SELECT max(id) FROM tb_lemon_grade);

    其中子查询SELECT max(id) FROM tb_lemon_grade查询的是记录表中最大的一个id,在整个查询中,只会查询一遍,这种就是非相关子查询,执行完毕后,会将值传递给外部查询。

    题目二:查询Linux成绩高于平均分的所有同学

    select * from lemon_grade where linux>(select avg(linux) from lemon_grade);

    子查询方式:
    SELECT * FROM tb_lemon_grade WHERE Linux > ( SELECT avg(Linux) FROM tb_lemon_grade );

    上面子查询SELECT avg(Linux) FROM tb_lemon_grade也是非相关子查询,语句只会执行一遍

    关联查询方式:

    这个题目我们可以使用两个表的关联查询得到结果

    SELECT t1.* FROM tb_lemon_grade t1,
    (SELECT avg(Linux) avgLinux FROM tb_lemon_grade) t2 
    where t1.Linux>t2.avgLinux;

    题目三:查询每个班级Linux成绩高于本班Linux平均分的所有同学:

    子查询方式
    SELECT * FROM tb_lemon_grade t1 
    WHERE t1.Linux >
    ( 
    	SELECT avg(t2.Linux) FROM tb_lemon_grade t2 
    	WHERE t1.class_name = t2.class_name 
    );

    我们来分析下这个题目,查询每个班级Linux成绩高于本班Linux平均分的所有同学,而每个班的Linux平均分不同,所以我们采用相关子查询,语句中的这个子查询依赖于外部的查询( 子查询中的t1.class_name = t2.class_name就是外部的表),外部查询每执行一次,子查询就执行一次。

    分组的方式写子查询:
    SELECT * FROM tb_lemon_grade t1 
    WHERE t1.Linux > 
    ( 
    	SELECT avg(t2.Linux) FROM tb_lemon_grade t2 
    	GROUP BY t2.class_name 
    	HAVING t1.class_name = t2.class_name
     );
    关联查询方式:

    通过分组查询出每个班的最高分,再与原表进行等值连接查询,得到最后结果。

    SELECT * FROM tb_lemon_grade t1, 
    ( 
    	SELECT avg(Linux) avgLinux, class_name 
    	FROM tb_lemon_grade 
    	GROUP BY class_name 
    ) t2
     WHERE t1.class_name = t2.class_name
     AND t1.Linux>t2.avgLinux;
  • 相关阅读:
    JavaScript链式调用
    Javascript设计模式(2)-单体模式
    Javascript设计模式(1)
    stm32结合产品学习01—产品的框架
    【目标检测-模型对比1】R-CNN、SPPnet、Fast R-CNN、Faster R-CNN的对比
    【目标检测-框架测试】mmdetection的安装与使用
    【机器学习-笔记1】吴恩达网课笔记1——机器学习策略
    【算法】P1004 方格取数
    【算法】UVa 11624, Fire! 解题心得
    vector
  • 原文地址:https://www.cnblogs.com/wz123/p/9722942.html
Copyright © 2011-2022 走看看