首页 > 数据库 >SQL非技术快速入门39题

SQL非技术快速入门39题

时间:2024-08-20 18:54:13浏览次数:9  
标签:COUNT 非技术 university question 39 SQL device id SELECT

※食用指南:文章内容为牛客网《非技术快速入门》39道题重点笔记,用于重复思考错题,加深印象。

练习传送门:SQL非技术快速入门39题

目录:

SQL13 Where in 和Not in

SQL19 分组过滤练习题

SQL20 分组排序练习题

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

SQL24 统计每个用户的平均刷题数

SQL25 查找山东大学或者性别为男生的信息

SQL27 查看不同年龄段的用户明细

SQL29 计算用户的平均次日留存率

SQL30 统计每种性别的人数

SQL32 截取出年龄

SQL33 找出每个学校GPA最低的同学

SQL34 统计复旦用户8月练题情况


SQL13 Where in 和Not in

❓找到学校为北大、复旦和山大的同学进行调研

非用运算符也可以,但太麻烦

SELECT device_id,gender,age,university,gpa
FROM user_profile
WHERE university IN ('北京大学','复旦大学','山东大学')

WHERE university='北京大学' OR university='复旦大学' OR university='山东大学

SQL19 分组过滤练习题

平均发贴数低于5的学校或平均回帖数小于20的学校数值函数:ROUND取整
 

数值函数:ROUND取整:

 

聚合函数:使用HAVING子句,可以在分组行之后筛选数据

※WHERE在GROUP BY前筛选数据,HAVING在GROUP BY后筛选数据

SELECT  university,
        COUNT(question_id) / 
        COUNT(DISTINCT q.device_id) AS avg_answer_cnt
FROM  question_practice_detail q
JOIN  user_profile u ON q.device_id = u.device_id
GROUP BY university

SQL20 分组排序练习题

关键词“每”、“各”,可以判断结果集是需要进行分组

※谨记子句的顺序,GROUP BY永远在SELECTF、FROM后面,ORDER BY前面

SELECT university,
       AVG(question_cnt) AS avg_question_cnt
 FROM user_profile
GROUP BY university
ORDER BY avg_question_cnt

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

❓每个学校答过题的用户平均答题数量情况

平均答题数量:总答题数量/总人数

DISTINCT:去除重复答题的用户

SELECT  university,
        COUNT(question_id) / 
        COUNT(DISTINCT q.device_id) AS avg_answer_cnt
FROM  question_practice_detail q
JOIN  user_profile u ON q.device_id = u.device_id
GROUP BY university

SQL24 统计每个用户的平均刷题数

❓参加了答题的山东大学的用户在不同难度下的平均答题题目数

INNER JOIN——多表检索数据

SELECT  university,
        difficult_level,
        ROUND(COUNT(qpd.question_id)/
        COUNT(DISTINCT qpd.device_id),4) AS avg_answer_cnt
FROM user_profile u
INNER JOIN question_practice_detail qpd ON u.device_id = qpd.device_id
INNER JOIN question_detail qd ON qd.question_id = qpd.question_id
WHERE u.university='山东大学'
GROUP BY qd.difficult_level

SQL25 查找山东大学或者性别为男生的信息

❓分别查看学校为山东大学或者性别为男性的用户的device_id、gender、age和gpa数据,结果不去重

结果不去重 UNION ALL,去重UNION

SELECT  device_id,
        gender,
        age,
        gpa
FROM user_profile
WHERE university='山东大学' 
UNION ALL
SELECT  device_id,
        gender,
        age,
        gpa
FROM user_profile
WHERE gender='male'

SQL27 查看不同年龄段的用户明细

❓将用户划分为20岁以下,20-24岁,25岁及以上三个年龄段,分别查看不同年龄段用户的明细情况

IF函数:只允许单一的测试表达式

CASE函数:可以针对每个测试表达式返回不同值

可以选择性加上ELSE子句,如果以上的条件没有一个真,则返回后面输入的条件Future

最后需要用END关键字关闭CASE语句块

SELECT  device_id,
        gender,
        CASE WHEN age<20 THEN '20岁以下'
             WHEN age BETWEEN 20 AND 24 THEN '20-24岁'
             WHEN age >= 25 THEN '25岁及以上'
             WHEN age IS NULL THEN '其他'
             #ELSE '其他'
             END AS age_cut
FROM user_profile

SQL29 计算用户的平均次日留存率

❓用户在某天刷题后第二天还会再来刷题的平均概率

DATE_ADD:给日期时间值添加日期成分

在当前日期时间上增加一天

第一个参数传递当前日期时间,第二个参数写一段表达式(INTERVAL 1 DAY)

次日留存率可以这样表示:

次日留存率=去重的数据表中符合次日留存的条目数目/

去重的数据表中所有条目数目

SELECT 
    COUNT(q2.device_id) / COUNT(q1.device_id) AS avg_ret 
FROM 
    (SELECT DISTINCT device_id, date 
     FROM question_practice_detail)as q1
LEFT JOIN
    (SELECT DISTINCT device_id, date 
     FROM question_practice_detail) AS q2
ON q1.device_id = q2.device_id AND 
   q2.date = DATE_ADD(q1.date, INTERVAL 1 DAY)

SQL30 统计每种性别的人数

❓统计每个性别的用户分别有多少参赛者

SELECT  CASE WHEN profile LIKE '%female' THEN 'female'
            ELSE 'male'
            END AS gender,
        COUNT(*) number
FROM user_submit
GROUP BY gender

SQL32 截取出年龄

❓统计每个年龄的用户分别有多少参赛者

数值函数:SUBSTR (SUBSTRING,字符截取函数):一个字符串中任何位置的字符

第二个参数时起始位置,第三个参数是长度

 

第三个参数如果不写,返回起始位置算到字符串最后的所有字符

 

SUBSTRING_INDEX(()函数:用来截取字符串

例子:165cm,45kg,26,female

①SUBSTRING_INDEX(profile,',',3)

正数,从左往右算第三个逗号,获取到165cm,45kg,26

②SUBSTRING_INDEX(SUBSTRING_INDEX(profile,',',3),',',-1)

负数,从右往左算第一个逗号,获取到26

SELECT  SUBSTRING_INDEX(
        SUBSTRING_INDEX(profile,',',3),',',-1) AS age,	
        COUNT(*) AS number
FROM user_submit
GROUP BY age

SQL33 找出每个学校GPA最低的同学

❓找到每个学校gpa最低的同学

⚠gpa最低,看似MIN(gpa),但是是每个学校里的最低,不是全部最低

MIN(gpa)无法对应device_id,也就无法获取到最低gpa对应device_id

窗口函数:

RANK:用来记录排序的函数

PARTITION BY:设定排序的对象范围(根据什么分组)

ORDER BY:指定哪一列、何种顺序排序(默认升序,降序DECS)

例如:根据不同种类(product_type),按照销售单价(sale_price)从低到高排序

PARTITION BY横向对表进行分组;ORDER BY决定纵向排序的规则

RANK() OVER (PARTITION BY university ORDER BY gpa) AS ranking 

找最大最小值对应数据的其他字段信息,联系窗口函数取where up.ranking=1

SELECT  device_id, 
        university,
        gpa 
FROM (SELECT device_id,
             university,
             gpa, 
     RANK() OVER (PARTITION BY university ORDER BY gpa) AS ranking 
     FROM user_profile) up
WHERE up.ranking=1;

SQL34 统计复旦用户8月练题情况

❓复旦大学的每个用户在8月份练习的总题目数和回答正确的题目数情况,对于在8月份没有练习过的用户,答题数结果返回0

COUNT计数非空个数,SUM只求和;

如果这里要用COUNT:COUNT(IF(qpd.result='right', 1, NULL))

USING只能用于列名称完全一致的数据

SELECT  device_id,
        university,
        COUNT(question_id) AS question_cnt,
        SUM(IF(result='right',1,0)) AS right_question_cnt
FROM user_profile u
LEFT JOIN question_practice_detail q USING (device_id)
WHERE   university ='复旦大学' AND
        (MONTH(date)=8 or date IS NULL)
GROUP BY device_id

SQL35 浙大不同难度题目的正确率

❓浙江大学的用户在不同难度题目下答题的正确率情况

AVG、SUM、COUNT三种方法都可获得正确率

SELECT  difficult_level,
        AVG(IF(result='right',1,0)) AS correct_rate
        
        #SUM(IF(q.result='right', 1, 0)) /
        COUNT(q.question_id) AS correct_rate
        
        #COUNT(IF(qpd.result='right', 1, NULL)) /
        COUNT(q.question_id) AS correct_rate
FROM user_profile u
INNER JOIN question_practice_detail q USING(device_id)
INNER JOIN question_detail qd USING(question_id)
WHERE u.university='浙江大学'
GROUP BY difficult_level
ORDER BY correct_rate


————END

标签:COUNT,非技术,university,question,39,SQL,device,id,SELECT
From: https://blog.csdn.net/2401_86505958/article/details/141284900

相关文章

  • Python连接MySQL数据库
    连接Mysql数据库#!/usr/bin/envpython#-*-coding:utf-8-*-importMySQLdb#连接数据库db=MySQLdb.connect(host="localhost",user="zabbix",passwd="123123",db="zabbix")#创建cursor对象cursor=db.cursor()#执行SQL查询cu......
  • MySQL操作
    数据库类型常用数据类型详细数据类型需要注意的是:BOOLEAN在数据库保存的是tinyInt类型,false为0,true就是1char是定长,varchar是变长,char存储时,如果字符数没有达到定义的位数,后面会用空格填充到指定长度,而varchar没达到定义位数则不会填充,按实际长度存储。比如一个char(1......
  • oracle & mysql 驱动程序安装配置
    Install-PackageOracle.ManagedDataAccess-Version12.2.20230118  版本可以安装到19.18Install-PackageMySql.Data-Version8.0.32.1config文件新增内容<system.data>  <DbProviderFactories>    <removeinvariant="MySql.Data.MySqlClient"/>    &......
  • Android T don't abort background activity starts
    log:2024-08-2015:45:12.457581-1128ActivityTaskManagersystem_processISTARTu0{act=android.intent.action.MAINcat=[android.intent.category.LAUNCHER]flg=0x10000000pkg=acr.browser.lightningcmp=acr.browser.lightning/.Ma......
  • FLink1.17-Kafka实时同步到MySQL实践
    1.组件版本组件版本Kafka3.7.0Flink1.17.0MySQL8.0.32 2.Kafka生产数据./kafka-console-producer.sh--broker-listhadoop01:9092,hadoop02:9092,hadoop03:9092--topic  kafka_test_table2>{"id":123,"test_age":33}&......
  • MySQL-MGR实战指南:打造企业级高可用数据库集群
    文章目录前言MGR的介绍事务处理流程:实验测试环境:结束语前言在数字化时代,企业的数据安全和业务连续性至关重要。想象一下,当关键业务数据存储在数据库中,而数据库突然出现故障,或者面临硬件故障、网络中断、自然灾害等不可预知的灾难性事件时,企业如何确保数据的完整性和......
  • 题解:UVA12398 NumPuzz I
    题意给你一个操作顺序,每个字母代表一个格子的操作。每次操作都会将一个格子及它相邻的格子的值\(-1\),如果格子的值为\(0\),则会变成\(9\)。已知操作完成后的所有格子值都为\(0\),求最开始每个格子的值为多少。思路模拟过程。倒推出得出答案。如果原操作\(-1\),那么现操作在......
  • Linux(CentOS7)安装MySQL8全过程
    下载官方地址:https://dev.mysql.com/downloads/mysql/选择版本前需先看一下服务器的glibc版本ldd--version  上传将下载好的tar包上传到服务器上,这里演示上传到了/usr/local/文件夹下 解压tar -Jxvfmysql-8.0.36-linux-glibc2.17-x86_64.tar.xz ......
  • mysql错误-The server quit without updating PID file
    说明:尽量不要用root用户安装和启动mysql问题示例原因:一般是root用户执行导致,如果MySQL是root以外用户安装的,则用安装的用户执行不会出差固执:这里就是要用root执行。[root@hadoop01mysql]#servicemysqlstartStartingMySQL.Loggingto'/opt/mysql/data/hadoop01.err'.......
  • 【原创】java+swing+mysql网吧管理系统设计与实现
    个人主页:程序员杨工个人简介:从事软件开发多年,前后端均有涉猎,具有丰富的开发经验博客内容:全栈开发,分享Java、Python、Php、小程序、前后端、数据库经验和实战文末有本人名片,希望和大家一起共同努力,一起进步,顶峰相见。开发背景:随着互联网技术的飞速发展和普及,网络已成为人......