zoukankan      html  css  js  c++  java
  • 关于面试总结6-SQL经典面试题

    前言

    用一条SQL 语句查询xuesheng表每门课都大于80 分的学生姓名,这个是面试考sql的一个非常经典的面试题

    having和not in

    查询 xuesheng表每门课都大于80 分的学生姓名

    name kecheng score
    张三 语文 81
    张三 数学 73
    李四 语文 86
    李四 数学 90
    王五 数学 89
    王五 语文 88
    王五 英语 96

    解决办法一: having

    如果不考虑学生的课程少录入情况(比如张三只有2个课程,王五有3个课程)

    SELECT name 
    FROM xuesheng 
    GROUP BY name
    HAVING MIN(score)> 80
    

    如果考虑学生的课程数大于等于3的情况

    SELECT name 
    FROM xuesheng 
    GROUP BY name
    HAVING MIN(score)> 80
    AND COUNT(kecheng)>=3
    

    解决办法二:not in

    可以用反向思维,先查询出表里面有小于80分的name,然后用not in去除掉

    SELECT DISTINCT name 
    FROM xuesheng 
    WHERE name NOT IN
    	(SELECT DISTINCT name 
    	FROM xuesheng 
    	WHERE score <=80);
    

    删除

    学生表xueshengbiao 如下:自动编号 学号 姓名 课程编号 课程名称 分数

    autoid id name kcid kcname score
    1 2005001 张三 0001 数学 69
    2 2005002 李四 0001 数学 89
    3 2005001 张三 0001 数学 69

    删除除了自动编号不同, 其他都相同的学生冗余信息

    DELETE t1 
    FROM xueshengbiao t1, xueshengbiao t2
    WHERE t1.id = t2.id
    and t1.name = t2.name
    and t1.kcid = t2.kcid
    and t1.kcname = t2.kcname
    and t1.score = t2.score
    and t1.autoid < t2.autoid
    

    如果只是查询出自动编号不同, 其他都相同的学生冗余信息,可以用group by

    SELECT * from xueshengbiao t1
    WHERE t1.autoid
    NOT IN
    	(SELECT MIN(autoid) as autoid FROM xueshengbiao
    	GROUP BY id, name, kcid, kcname, score)
    

    模糊查询%

    表名:student ,用sql查询出“张”姓学生中平均成绩大于75分的学生信息;

    name kecheng score
    张青 语文 72
    张华 英语 81
    王华 数学 72
    张青 物理 67
    李立 化学 98
    张青 化学 76
    select * from student
    where name in 
    (select name from student
    where name like '张%' group by name having avg(score) > 75);
    

    SQL 通配符

    在 SQL 中,通配符与 SQL LIKE 操作符一起使用。SQL 通配符用于搜索表中的数据。在 SQL 中,可使用以下通配符:

    通配符 描述
    % 替代 0 个或多个字符
    _ 替代一个字符
    [charlist] 字符列中的任何单一字符
    [^charlist]或[!charlist] 不在字符列中的任何单一字符

    **MySQL 中使用 REGEXP 或 NOT REGEXP 运算符 (或 RLIKE 和 NOT RLIKE) 来操作正则表达式 **

    找出姓张和姓李的同学, 用rlike实现匹配多个

    -- 找出姓张和姓李的
    select * from xuesheng
    where name in 
    (select name from xuesheng
    where name rlike '[张李]' group by name having avg(score) > 75);
    

    也可以用 REGEXP,结合正则匹配

    select * from xuesheng
    where name in 
    (select name from xuesheng
    where name REGEXP '^[张李]' group by name having avg(score) > 75);
    

    交流QQ群:779429633

  • 相关阅读:
    [技术项目4]--接口自动化数据一览项目总结
    [技术项目3]--流量回放项目总结
    [技术项目2]--禅道项目报告统计总结
    [技术项目1]--数据工厂项目总结
    自动化测试常用的框架
    【vue】element-表单中,下拉框选中某个值后,同步更新其他输入框的值
    【vue】vue打包后,将dist文件夹自动压缩成生成dist.zip压缩包--filemanager-webpack-plugin
    译文:ovs+dpdk中的“vHost User NUMA感知”特性
    vue中防抖,节流的使用
    横向结构的树组件(leader-line-vue)
  • 原文地址:https://www.cnblogs.com/yoyoketang/p/10118924.html
Copyright © 2011-2022 走看看