开发基础----牛客SQL速成

SQL练习题解

  • 一.单表查询(非技术快速入门)
    • 1.基础查询
    • SQL1 查询所有列
    • SQL2 查询多列
    • SQL3 查询结果去重
    • SQL4 查询结果限制返回行数
    • SQL5 将查询后的列重新命名
    • SQL6 查找学校是北大的学生信息
    • SQL7 查找年龄大于24岁的用户信息
    • SQL8 查找某个年龄段的用户信息
    • SQL9 查找除复旦大学的用户信息
    • SQL10 用where过滤空值练习
    • SQL11找到男性且GPA在3.5以上(不包括3.5)的用户
    • SQL12 找到学校为北大或GPA在3.7以上(不包括3.7)的用户
    • SQL13 找到学校为北大、复旦和山大的同学
    • SQL14 找到gpa在3.5以上(不包括3.5)的山东大学用户 或 gpa在3.8以上(不包括3.8)的复旦大学同学
    • SQL15 查看学校名称中含北京的用户
    • SQL16 复旦大学学生gpa最高值
    • SQL17 男性用户有多少人以及他们的平均gpa是多少
    • SQL18 分组计算练习题
    • SQL19 分组过滤练习题
    • SQL20 分组排序练习题
  • 二.多表查询
    • (说在前面)复杂SQL的三段式结构
    • 多表查询方法一: 左连接 内连接 右连接 左外连接 右外连接
    • 多表查询方法二:子查询
    • 非聚合字段和聚合函数同时出现,要用group by
    • (2表))SQL21 浙江大学用户题目回答情况(含on 和 where的区别)
    • (2表)SQL22 统计每个学校的答过题的用户的平均答题数
    • (3表)SQL23 统计每个学校各难度的用户平均刷题数
  • 题目整理
    • 1.字符匹配

一.单表查询(非技术快速入门)

1.基础查询

SQL1 查询所有列

SELECT id, device_id, gender, age, university, province FROM user_profile;

使用SELECT +(所有列名) from 表名 然后结尾 ; 这样读取效率最高 SELECT* from 表名 ; 只适合自己看一眼,实际开发中效率低(因为需要将* 转化为每一个列名

SQL2 查询多列

SELECT device_id, gender, age, university from user_profile

SQL3 查询结果去重

select distinct university from user_profile;

SQL4 查询结果限制返回行数

在 SQL 中,LIMIT 是用于限制查询结果返回的行数的关键字。
LIMIT 0,2 表示从结果集的第 0 行开始,返回 2 行数据。这样的语法可以用于分页查询,例如获取第一页的数据。
LIMIT 2 表示返回结果集的前 2 行数据,不指定起始位置,默认从第 0 行开始。这种语法可以用于获取前几行数据,而不需要指定具体的起始位置。
简而言之,它们的区别在于:
LIMIT 0,2 指定了起始位置和返回的行数,可以用于分页查询。
LIMIT 2 只指定了返回的行数,从第 0 行开始,默认从第 0 行开始。
注意,在一些数据库系统中,也可以使用 OFFSET 关键字来指定起始位置,例如 LIMIT 2 OFFSET 0 和 LIMIT 2 是等价的。
不用打;也行

select device_id from user_profile limit 2

SQL5 将查询后的列重新命名

select device_id as user_infos_example from user_profile limit 2 offset 0

SQL6 查找学校是北大的学生信息

select device_id, university from user_profile where university = '北京大学'

SQL7 查找年龄大于24岁的用户信息

select device_id, gender, age, university from user_profile where age > 24

SQL8 查找某个年龄段的用户信息

select device_id, gender, age from user_profile where age between 20 and 23
select device_id, gender, age from user_profile where age >= 20 and age <= 23

SQL9 查找除复旦大学的用户信息

select device_id,gender,age,university from user_profile where university !='复旦大学';
SELECT device_id,gender,age,university from user_profile where university <> '复旦大学';
SELECT device_id,gender,age,university from user_profile where university not in ('复旦大学');
## 模糊查询
SELECT device_id,gender,age,university from user_profile where university not like '%复旦%';

SQL10 用where过滤空值练习

select device_id, gender, age, university from user_profile where age is not null
select device_id, gender, age, university from user_profile where age != ''

SQL11找到男性且GPA在3.5以上(不包括3.5)的用户

select device_id, gender, age, university, gpa from user_profile where gpa > 3.5 AND gender = 'male'

SQL12 找到学校为北大或GPA在3.7以上(不包括3.7)的用户

select device_id, gender, age, university, gpa from user_profile where university = '北京大学' or gpa > 3.7

SQL13 找到学校为北大、复旦和山大的同学

select device_id, gender, age, university, gpa from user_profile where university in ('北京大学','复旦大学','山东大学');

SQL14 找到gpa在3.5以上(不包括3.5)的山东大学用户 或 gpa在3.8以上(不包括3.8)的复旦大学同学

--时间长
select device_id,gender,age,university,gpa from user_profile where university='山东大学' and gpa>3.5 or university='复旦大学' and gpa>3.8
-- 子查询,麻烦, 但时间短
select device_id,gender, age,university,gpa from user_profile 
where device_id in (select device_id from user_profile where university = '山东大学' and gpa > 3.5) 
or device_id in (select device_id from user_profile where university = '复旦大学' and gpa > 3.8)

SQL15 查看学校名称中含北京的用户

select device_id,age,university from user_profile where university like '%北京%'

SQL16 复旦大学学生gpa最高值

select gpa from user_profile where university = '复旦大学' order by gpa desc limit 1
select max(gpa) as gpa from user_profile where university = '复旦大学' 

SQL17 男性用户有多少人以及他们的平均gpa是多少

  1. 表头重命名,用as语法
  2. 浮点数的平均值可能小数点位数很多,按照示例保存一位小数,用round函数
select 
count(gender) as male_num,
round(avg(gpa), 1) as avg_gpa
from user_profile where gender="male";

SQL18 分组计算练习题

题目:现在运营想要对每个学校不同性别的用户活跃情况和发帖数量进行分析,请分别计算出每个学校每种性别的用户数、30天内平均活跃天数和平均发帖数量

select gender, university, count(device_id) as user_num,round(avg(active_days_within_30), 1) as avg_active_day, round(avg(question_cnt), 1) as avg_question_cnt 
from user_profile 
group by gender, university

SQL19 分组过滤练习题

现在运营想查看每个学校用户的平均发贴和回帖情况,寻找低活跃度学校进行重点运营,请取出平均发贴数低于5的学校或平均回帖数小于20的学校

select不同字段记得加,
分组查询过滤条件用having 不用 where

select university, round(avg(question_cnt),3) as avg_question_cnt,round(avg(answer_cnt),3) as avg_answer_cnt
from user_profile
group by university
having avg_question_cnt < 5 or avg_answer_cnt < 20

SQL20 分组排序练习题

不同大学的用户平均发帖情况,并期望结果按照平均发帖情况进行升序排列

select university,round(avg(question_cnt), 4) as avg_question_cnt 
from user_profile
group by university
order by avg_question_cnt asc

二.多表查询

(说在前面)复杂SQL的三段式结构

本节进入多表查询阶段, 多表查询的SQL通常为大SQL, 又臭又长,因此我们需要一定的套路将其简化, 三段式结构就是一种很方便的简化思路

以SQL23 统计每个学校各难度的用户平均刷题数为例

# 第一段:select选择字段,含原生字段及构造字段,
#其中构造的过程中常用sum count round +-*/ 等函数及运算表达式
selectuniversity,difficult_level,round(count(qpd.question_id) / count(distinct qpd.device_id),4) as avg_answer_cnt# 第二段:from选择表格,含合并表格操作
from question_practice_detail as qpdjoin user_profile as upon up.device_id=qpd.device_idjoin question_detail as qdon qd.question_id=qpd.question_id# 第三段:数据操作段,含 分组/排序/筛选/取指定行数等操作
group by university,difficult_level;

多表查询方法一: 左连接 内连接 右连接 左外连接 右外连接

注意:

  • 单独一个join是inner join 内连接
  • left join:左连接 但是好像左连接就是 左外连接, 即left join 也可以写作left outer join, 右连接同理
  • 技术上:
    在这里插入图片描述
  • 业务上:
    业务上多表查询的时候选择哪种取决于你想要保留什么:
    • 想要左表中的所有数据----左连接
    • 想要右表中的所有数据----右连接
    • 想要左右两张表都存在的特殊数据----内连接
    • 只想要左边的且其所有字段都不为null----左外连接
    • 只想要右边的且其所有字段都不为null----右外连接

多表查询方法二:子查询

类似下面这种方式就是嵌套子查询

select device_id,gender, age,university,gpa from user_profile 
where device_id in (select device_id from user_profile where university = '山东大学' and gpa > 3.5) 
or device_id in (select device_id from user_profile where university = '复旦大学' and gpa > 3.8)
  • 什么时候多表查询不能用子查询
    例如SQL22题中universityround(count(question_id) / count(distinct qpd.device_id), 4)这两个字段不在同一张表里, 必须靠链接两张表生成中间表,在中间表中查询;
    因此不能用子查询了,如果两个字段在同一张表的话就可以用子查询类似device_id in (select device_id from xx where ....)

非聚合字段和聚合函数同时出现,要用group by

什么是非聚合字段

  • 在MySQL中,非聚合字段指的是不参与聚合函数计算的字段。我们有一个学生表,其中包含学生的姓名、年龄、性别、班级等信息,我们需要统计每个班级的学生数量,那么班级字段就是聚合字段,而姓名、年龄、性别等字段就是非聚合字段。

  • 非聚合字段的作用非聚合字段在实际应用中非常重要,它们可以用于数据的筛选、排序和分组等操作。我们需要查询年龄大于18岁且性别为女性的学生信息,那么年龄和性别字段就是非聚合字段,在查询语句中需要使用WHERE子句进行筛选。

  • 如何使用非聚合字段在MySQL中,使用非聚合字段的方法非常简单,只需要在SELECT语句中将需要查询的字段列出即可。我们需要查询学生表中的姓名、年龄和性别字段,那么查询语句如下:SELECT 姓名,年龄,性别 FROM 学生表;如果需要对查询结果进行排序,可以使用ORDER BY子句,例如按照年龄从小到大排序:SELECT 姓名,年龄,性别 FROM 学生表 ORDER BY 年龄 ASC;如果需要对查询结果进行分组,可以使用GROUP BY子句,例如按照班级分组统计学生数量:SELECT 班级,COUNT(*) FROM 学生表 GROUP BY 班级;

  • 总结:非聚合字段在MySQL中的作用非常重要,它们可以用于数据的筛选、排序和分组等操作。在使用非聚合字段时,只需要在SELECT语句中将需要查询的字段列出即可,同时可以使用ORDER BY和GROUP BY子句对查询结果进行排序和分组。

我的理解: 聚合函数要聚合某一个字段的时候应当依据其他非聚合函数字段, 比如我要统计(一个班)多少人, 那么到底怎么统计呢,按性别统计还是按身高体重?....如果你写了group by class 那么我就知道你要按照同一个班级去统计去聚合了

非聚合字段和聚合函数同时出现要使用group by

select s.s_id,avg(s.s_score) as avgscore from score s group by s_id

只有聚合函数时,不用group by

select avg(s.s_score) as avgscore from score s

(2表))SQL21 浙江大学用户题目回答情况(含on 和 where的区别)

在多表查询时,on和where都表示筛选条件,on先执行where后执行
区别:
外连接时,on条件是在生成临时表时使用的条件,它不管on中的条件是否为真,都会返回左边表中的记录。而where条件是在临时表生成好后,再对临时表进行过滤的条件。
下面这题是内连接,因此on和where的运行结果相同
链接

查看所有来自浙江大学的用户题目回答明细情况,请你取出相应数据

--内连接法
select qpd.device_id,qpd.question_id,qpd.result
from question_practice_detail as qpd inner join user_profile as up
on up.device_id = qpd.device_id and up.university='浙江大学'
order by qpd.question_id asc
--子查询法
select device_id,question_id,result
from question_practice_detail 
where device_id in(select device_id from user_profilewhere university='浙江大学'
) 

(2表)SQL22 统计每个学校的答过题的用户的平均答题数

链接

查找每个学校用户的平均答题数目(说明:某学校用户平均答题数量计算方式为该学校用户答题总次数除以答过题的不同用户个数)根据示例,你的查询应返回以下结果(结果保留4位小数),注意:结果按照university升序排序!!!

select university, round(count(question_id) / count(distinct qpd.device_id), 4) as avg_answer_cnt
from user_profile as up
inner join question_practice_detail as qpd
on up.device_id = qpd.device_id
group by university

本题universityround(count(question_id) / count(distinct qpd.device_id), 4)这两个字段不在同一张表里, 必须靠链接两张表生成中间表,在中间表中查询;
因此不能用子查询了,如果两个字段在同一张表的话就可以用子查询类似device_id in (select device_id from xx where ....)

(3表)SQL23 统计每个学校各难度的用户平均刷题数

注意:

  • 其实三表联查,在互联网项目中,是不合适的,因为其性能很差,追求性能,可以通过前期的表设计或者其他代码逻辑维护表的数据
  • 我们通过观察发现,这道题,跟前面一道相比,加入了另一张表的查询
  • question_practice_detail这个表拥有其他两个表相同的数据
    通过关系连接表与表中间关系字段(up与qpd用device_id连接,qd与qpd用question_id连接)。进行两次的内连接,或者左外连接。
    链接
    写一个SQL查询,计算不同学校、不同难度的用户平均答题量,根据示例,你的查询应返回以下结果(结果在小数点位数保留4位,4位之后四舍五入):

重命名字段或表的时候用不用as都行:
例如重命名表的时候:user_profile as upuser_profile up都行
例如重命字段的时候:university as uuniversity u都行

----连接三张表, 这里用left join或join(inner join)或right join都行, 因为两边每个id都有, 不存在有一行其他字段为null的情况;
select university,difficult_level,round(count(qpd.question_id) / count(distinct qpd.device_id), 4) as avg_answer_cnt
from question_practice_detail as qpd
left join user_profile as up
on up.device_id=qpd.device_id
left join question_detail as qd
on qd.question_id=qpd.question_id
group by university, difficult_level
----直接暴力用where
SELECT university,difficult_level,COUNT(q_p.question_id) / COUNT(DISTINCT q_p.device_id) avg_answer_cnt
FROM user_profile u,question_detail q,question_practice_detail q_p
WHEREu.device_id = q_p.device_idand q_p.question_id = q.question_id
GROUP BYuniversity,difficult_level;

题目整理

1.字符匹配

一般形式为:

列名 [NOT ] LIKE
匹配串中可包含如下四种通配符:
_:匹配任意一个字符;
%:匹配0个或多个字符;
[ ]:匹配[ ]中的任意一个字符(若要比较的字符是连续的,则可以用连字符“-”表 达 );
[^ ]:不匹配[ ]中的任意一个字符。

例23.查询学生表中姓‘张’的学生的详细信息。

SELECT * FROM 学生表 WHERE 姓名 LIKE ‘张%

例24.查询姓“张”且名字是3个字的学生姓名。

SELECT * FROM 学生表 WHERE 姓名 LIKE '张__’

如果把姓名列的类型改为nchar(20),在SQL Server 2012中执行没有结果。原因是姓名列的类型是char(20),当姓名少于20个汉字时,系统在存储这些数据时自动在后边补空格,空格作为一个字符,也参加LIKE的比较。可以用rtrim()去掉右空格。

SELECT * FROM 学生表 WHERE rtrim(姓名) LIKE '张__'

例25.查询学生表中姓‘张’、姓‘李’和姓‘刘’的学生的情况。

SELECT * FROM 学生表 WHERE 姓名 LIKE '[张李刘]%

例26.查询学生表表中名字的第2个字为“小”或“大”的学生的姓名和学号。

SELECT 姓名,学号 FROM 学生表 WHERE 姓名 LIKE '_[小大]%'

例27.查询学生表中所有不姓“刘”的学生。

SELECT 姓名 FROM 学生 WHERE 姓名 NOT LIKE '刘%

例28.从学生表表中查询学号的最后一位不是2、3、5的学生信息。

SELECT * FROM 学生表 WHERE 学号 LIKE '%[^235]'

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/609759.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

redis的高可用(主从复制、哨兵、群集)

redis的高可用&#xff08;主从复制、哨兵、群集&#xff09; 主从复制&#xff1a;主从复制是高可用Redis的基础&#xff0c;哨兵和集群都是在主从复制基础上实现高可用的。主从复制主要实现了数据的多机备份&#xff0c;以及对于读操作的负载均衡和简单的故障恢复。缺陷&…

使用 LLVM clang C/C++ 编译器编译 OpenSSL 3.X库

1、下载 OpenSSL 3.X 库的源代码放到待编译目录 2、解压并接入 OpenSSL 3.X 库源码的根目录 3、复制 ./Configure 一个取名为 ./Configure-clang 4、修改 ./Configure-clang 找到配置段&#xff1a; CC CXX CPP LD 把它们改成 CC > "/usr/bin/clang-…

JavaScript 地址信息与页面跳转

在JavaScript中&#xff0c;你可以使用各种方法来处理地址信息并进行页面跳转。以下是一些常见的方法&#xff1a; 1.使用window.location对象&#xff1a; window.location对象包含了当前窗口的URL信息&#xff0c;并且可以用来进行页面跳转。 * 获取URL的某一部分&#xf…

【python】爬取豆瓣电影排行榜Top250存储到Excel文件中【附源码】

英杰社区https://bbs.csdn.net/topics/617804998 一、背景 近年来&#xff0c;Python在数据爬取和处理方面的应用越来越广泛。本文将介绍一个基于Python的爬虫程 序&#xff0c;用于抓取豆瓣电影Top250的相关信息&#xff0c;并将其保存为Excel文件。 程序包含以下几个部…

Qt UI框架和Duilib UI框架差别

Qt UI框架和Duilib UI框架在以下几个方面存在差异: 跨平台性:Qt是一个跨平台的UI工具包,可以在不同的操作系统上运行,如Windows、Linux和Mac OS X。而Duilib主要针对Windows系统,其跨平台能力相对较弱。 功能和性能:Qt作为一个成熟的框架,提供了丰富的功能和性能,包括对…

[游戏开发] 两向量夹角计算(0-360度)

上图是Unity左手坐标系&#xff0c;红轴是右&#xff0c;蓝轴是前&#xff0c;绿轴是上 测试目标是黑(3.54,0,4)、黄(-3.85,0,4.8)、灰(0.46,0,-2.6)三个向量&#xff0c;且三个向量都再XZ平面上&#xff0c;Y的值为0 以黑色为起始轴&#xff0c;和其他两周做角度计算 计算角…

微信小程序如何自定义导航栏,怎么确定导航栏及状态栏的高度?导航栏被刘海、信号图标给覆盖了怎么办?

声明&#xff1a;本文为了演示效果&#xff0c;颜色采用的比较显眼&#xff0c;可根据实际情况修改颜色 问题描述 当我们在JSON中将navigationStyle设置成custom后&#xff0c;当前页面的顶部导航栏就需要我们制作了&#xff0c;但出现了一下几个问题&#xff1a; 导航栏的高…

Day29 回溯算法part05 491. 非递减子序列 46. 全排列 47. 全排列 II

回溯算法part05 491. 非递减子序列 46. 全排列 47. 全排列 II 491. 非递减子序列 class Solution { private:vector<vector<int>> result;vector<int> path; public:void backTracing(vector<int>& nums,int startIndex){if(path.size()>1) …

【Scala】——流程控制

1 if-else 分支控制 让程序有选择的的执行&#xff0c;分支控制有三种&#xff1a;单分支、双分支、多分支 1.1单分支 if (条件表达式) {执行代码块 }1.2 双分支 if (条件表达式) {执行代码块 1 } else {执行代码块 2 }1.3 多分支 if (条件表达式1) {执行代码块 1 } else …

初学者的基本 Python 面试问题和答案

文章目录 专栏导读1、什么是Python&#xff1f;列出 Python 在技术领域的一些流行应用。2、在目前场景下使用Python语言作为工具有什么好处&#xff1f;3、Python是编译型语言还是解释型语言&#xff1f;4、Python 中的“#”符号有什么作用&#xff1f;5、可变数据类型和不可变…

GSP算法在数据挖掘中的应用

文章目录 一&#xff1a;基本概念介绍二&#xff1a;从一个样例入手三 论文中定义的一些细节四&#xff1a;GSP算法五.算法六 源代码及数据集等总结七. 参考文章 一&#xff1a;基本概念介绍 序列模式挖掘&#xff1a;指挖掘相对时间或其他模式出现频率高的模式 序列模式挖掘…

CMake入门教程【核心篇】设置和使用缓存变量

😈「CSDN主页」:传送门 😈「Bilibil首页」:传送门 😈「动动你的小手」:点赞👍收藏⭐️评论📝 文章目录 概述设置缓存变量使用缓存变量更改缓存变量完整代码示例实战使用技巧注意事项总结与分析

锂电池制造设备中分布式IO模块优势

在“碳达峰、碳中和”目标推动下&#xff0c;新能源汽车当下发展势头正盛&#xff0c;而纯电动车的核心部件则是&#xff1a;锂电池。动力型锂电池作为新能源汽车核心零部件&#xff0c;其发展与新能源汽车行业息息相关&#xff0c;迎来广阔的市场空间。 为何采用I/O模块&#…

Qt 不允许指针指向不完整的类类型 “QScrollBar“

错误原因1&#xff1a;没有将相应的头文件包含进来 解决方法&#xff1a;包含头文件 #include <QScrollBar>错误原因2&#xff1a;使用了不完整类型的指针 解释&#xff1a; 在C中&#xff0c;如果尝试使用一个不完整类型的指针&#xff0c;编译器会报错。例如&#xff…

Android 13 原生浏览器-默认关闭 JavaScript

介绍 客户觉得此功能比较耗费流量&#xff0c;于是想要默认关闭此功能&#xff0c;此功能的入口是在浏览器-设置-高级-启用 JavaScript。 修改 路径&#xff1a;Browser/res/xml-sw600dp/advanced_preferences.xml <CheckBoxPreferenceandroid:key"enable_javascript…

常见类型的yaml文件如何编写?--kind: Deployment

基本说明 Deployment 资源是 Kubernetes 重要的组成部分之一&#xff0c;通过指定 Deployment 中的 Pod 模板和副本数量&#xff0c;Kubernetes 可以自动地创建并管理一组具有相同配置的 Pod&#xff0c;这样即使某些 Pod 发生故障或需要升级&#xff0c;也可以轻松地进行控制…

Linux中快速搭建RocketMQ测试环境

必要的文件下载 为什么选择RocketMQ | RocketMQ x86_64位JDK下载0jdk/8u391-b13 rocketmq二进制包下载-rocketmq-all-5.1.4-bin-release.zip 编译好的直接可用的dashboard【rocketmq-dashboard-1.0.0.jar】请在文章顶部下载 dashboard配套的配置文件【application.propert…

AI真正的Killer App 仍然缺席

每周跟踪AI热点新闻动向和震撼发展 想要探索生成式人工智能的前沿进展吗&#xff1f;订阅我们的简报&#xff0c;深入解析最新的技术突破、实际应用案例和未来的趋势。与全球数同行一同&#xff0c;从行业内部的深度分析和实用指南中受益。不要错过这个机会&#xff0c;成为AI领…

汇编和C语言转换

C语言和汇编语言之间有什么区别 C语言和汇编语言之间存在显著的区别,主要体现在以下几个方面: 抽象层次: 汇编语言:更接近硬件的低级语言,通常与特定的处理器或指令集紧密相关。它提供了对处理器指令的直接控制,允许程序员直接操作硬件资源,如寄存器、内存等。 C语言:…

Android 车联网——CarUxRestrictionsManagerService介绍(十六)

在前面文章中经常提到 UX Restrictions,这里我们就来分析一下 CarUxRestrictions 相对应的 Manager 和 Service。 一、简介 CarUxRestrictionsManagerService 是安卓汽车平台中的一个核心服务,旨在管理汽车交互体验时的用户体验限制。它允许车载应用程序根据许多方面的限制…