SQL实战

学习视频:【课程2.0】SQL从入门到实战|云端数据库搭建|Excel&Tableau连接数据库_哔哩哔哩_bilibili

        由于我学习过SQL,所以直接记录一些函数、特殊用法、刷题等实战的知识,后面教学搭建云端数据库和其他软件连接数据库视频讲解很清晰,也已经全部完成,无需记录,每个题目的类型记录为标题方便查找

通配符

        

select name from world
where name like '%a%' and
name like '%e%' and
name like '%i%' and
name like '%o%' and
name like '%u%' and
name not like '% %'

        这一题没什么难度,只是刚开始想的是name like '%a%e%i%o%u%',这样就限制住了元音字母的顺序,不正确,后面的空格用not like即可

指定数据排序到最后

select winner,subject
from nobel
where yr = 1984
order by subject in ('chemistry','physics'), subject, winner

        前面一句话很好实现,主要在于排序也就是order by该怎么写,这里的order by有三个排序条件,subject in ('chemistry','physics')是一个布尔表达式,如果subject等于chemistry或physics,那么表达式的结果返回1,否则为0,而后面按照subject升序排列,只有subject等于chemistry或physics的时候为1,其余情况均为0,1自然会被排到0的后面,也就实现了指定科目放在最后的目标

limit用法

select name,population
from world
order by population desc
limit 3,4

        limit普通用法不用多说,但是像这种要取第4到第7的,limit后面第一个数字是第四的前一位就是3,而第二个数字是要查询的个数(4、5、6、7),一共四位数字,就是4

计算表格行数

        计算表格行数要用count(*) ,如果选择某一列count,可能里面出现空值就不会计算上

        同样,聚合函数也会略过空值

常见部分函数

四舍五入函数

        

        

字符串函数

        注意区分:substring和limit,前者是从第n个字符开始取,后者是从n+1个字符开始取

数据类型转换函数

日期时间函数

条件判断函数

round和concat嵌套得到百分比数据

select confirmed,deaths,recovered,recovered/confirmed,
concat(round((recovered/confirmed)*100,2),'%') 治愈率
from covid
where recovered/confirmed > 0.3

        这里主要是使用concat连接函数,在算好的数值后面添加一个%

练习题

select capital,name
from world
where capital like concat('%',name,'%')
and capital != name

        这里巧妙地用到了concat函数,我们需要capital匹配'%变化的name%',而使用concat就能使name根据每一行数据变化

高级语句

窗口函数

排序窗口函数区别:

        rank()over():高考排名规则,重复值获得相同序号,如果两行数据排名第1,那么下一行排第3

        dense_rank()over():重复值获得相同序号,如果两行数据排名第1,那么下一行排第2

        row_number()over():不论是否有重复值,每一行获得唯一序号

select yr,party,votes,
rank()over(partition by yr order by votes desc) posn
from ge
where constituency = 'S14000021'
group by yr
order by party,yr

        难点在于如何对每一年中的候选人根据票数高低赋予名次,用到排序窗口函数,partition by yr代表按照日期进行分区,再按照得票数降序排序,由rank给排名

        注意不要太死板,就像这里题目没有要求select yr出来,但是实际当中有日期列看得更加清楚

偏移分析函数

偏移分析函数:

        lag():向前查看多少行,例如lag(column,1),查看上一行column值

        lead():向后查看多少行,例如lag(column,1),查看下一行column值

select name 国家名,date_format(whn,'%Y-%m-%d') 标准日期,
confirmed 当天截至时间累计确诊人数,
lag(confirmed,1)over(partition by name order by whn) 昨天截至时间累计确诊人数,
(confirmed - lag(confirmed,1)over(partition by date order by confirmed)) 每天新增确诊人数,
from covid
where name in ('France','Germany') and month(whn) = 1
order by whn

        显示标准日期:使用date_format对时间whn列改格式

        1月份的情况:使用month对whn列取月份

        昨天截至时间累计确诊人数:首先over函数会按照国家名分区,然后按照时间升序排列,接下来lag函数会取上一行的confirmed的值,也就是昨天的confirmed值

        每天新增确诊人数:直接当天-昨天即可

练习题

select party,votes,
rank()over(order by votes desc)
from ge
where yr = 2017 and constituency = 'S14000024'
order by party

        由于我们在where中限制了只有一个选区,所以partition by可以省略

select name 国家名,
confirmed 确诊人数,
rank()over(order by confirmed desc)确诊人数排名,
deaths死亡人数,
rank()over(order by deaths desc)死亡人数排名
from covid
where whn = '2020-04-20'
order by confirmed desc

select name,date_format(whn,'%Y-%m-%d'),
(confirmed - lag(confirmed,1)over(order by whn)) 每周新增人数
from covid
where name = 'Italy' and weekday(whn) = 0
order by whn

        这里变通的地方是显示每周新增人数,一开始想的是写成lag(confirmed - 7)就是当前减去7前的数据,但是我们其实要的只是周一的数据而已,所以在where条件处加上一个weekday(whn) = 0,这样求出来的日期就全部是周一的了,这样仍然用lag(confirmed,1),就是用当周一数据减去上周一数据了

表连接

        内连接:遍历所有、向下增添,相当于笛卡尔积,左边两个1右边两个1,最后会增加4个1,没连上的地方填上null,然后将存在null的行全部剔除

        左连接:遍历所有、向下增添,相当于笛卡尔积,左边两个1右边两个1,最后会增加4个1,没连上的地方填上null,然后保留左边表的全部值,一个不能少一个不能多,左边不允许null存在

        右连接:遍历所有、向下增添,相当于笛卡尔积,左边两个1右边两个1,最后会增加4个1,没连上的地方填上null,然后保留右边表的全部值,一个不能少一个不能多,右边不允许null存在

练习题

select t.name,d.name
from teacher t
left join dept d on t.dept = d.id

        这里要注意的就是‘所有教师’这个词,我们正常用join会发现结果中少了些老师,如果数据太多我们就不容易检查出来,所以还是用左连接可以完全保证教师都在

        还有就是两张表name列同名了,我们需要用表名区分开

select name
from casting
join actor on casting.actorid = actor.id
where ord = 1
group by name
having count(movieid) >= 30

        where挑选出演过第1主角的人,再having挑选出演过30+次的人

select ga.mdate,

ga.team1,

sum(case when go.temid = ga.team1 then 1 else 0 end) score1,

ga.team2,

sum(case when go.temid = ga.team2 then 1 else 0 end) score2

from game ga

left join goal go on ga.id = go.matchid

group by ga.mdate,ga.team1,ga.team2

order by ga.mdate,go.matchid,ga.team1,ga.team2

        这里用了case when这个小技巧,我们看到goal表中teamid对应着game表中team1和team2列的数据,那么我们用case when判断,score1:如果teamid在team1中那么我们就记为1,然后求和。这里也是用left join,因为要保证每场赛事都被记录

子查询

select name,continent
from world
where continent in (
    select continent
    from world
    where name in (Argentina,Australia)
)

        跟这两个国家在同一大洲是我们的条件,而这个条件没办法直接写出来,我们要先求出跟这两个国家在同一大洲的洲有哪些,所以用到子查询

select constituency,party
from
    (select constituency,party,
    rank()over(partition by constituency over by votes desc) posn,
    votes
    from ge
    where yr = 2017 and 
    constituency between 'S14000021' and 'S14000026') as rk
where rk.posn = 1

        这里比较绕,当我们算出中间那张表也就是找出对每个选区得票进行排序,但是要取出每个每个选区得票数最高的,那么不能直接用limit,那只会返回第一条数据,所以我们在外面再包一张表,查出里面那张表序号为1的,就正确了

        其次就是我们这里虽然只有爱丁堡一个选取,可是这个选区有不同的编号,所以partition by不要省略

        最后这个str也是可以用between and

练习题

select
name
,population
from world
where population > (
                                                 select population
                                                 from world
                                                 where name= 'Canada'
                                      )

and population < (
                                           select population
                                           from world
                                           where name = 'Poland'
                                  )

        不难,就是用两次子查询

select name,population,continent
from world
where continent not in (
    select distinct continent
    from world
    where population > 25000000
)

        这里需要一个反向思维,因为我们需要求国家人口均为<=25000000的大洲,那么正常写continent in(...where population <=25000000...)的话,只要有一个国家符合条件就会把这个大洲算进去,但是我们要求的是每个国家都得符合要求,所以我们可以使用一个not in

select continent,name,area
from world
where (continent,area) in (
    select continent,max(area)
    from world
    group by continent
)

        这里要求一个区域最大,用子查询可以对洲和区域同时查询,这样都不用distinct了

select continent,name,area
from
    (select continent,name,area,
    rank()over(partition by continent order by area desc) as posn
    from world
    group by continent) as rk
where rk.posn = 1

          我觉得第二种做法也可以,就是仿照之前求选举人的做法

select
name
,日期
,每天新增治愈人数
,rank()over(partition by name order by 每天新增治愈人数 desc) 排名
from
(
    select
    name
    ,date_format(whn,'%Y年%m月%d日') 日期
    ,(recovered - lag(recovered,1)over(partition by name order by whn)) 每天新增治愈人数
    from covid
    where name in ('France','Italy')

) re
order by 排名

        这里将之前学些的窗口函数和偏移函数结合在一起,加强练习

云端数据库练习

        创建好云端数据库后,导入学习资料的三张表,然后实战练习

        直接用describe描述shop表,就可以看到表格的总体描述

tips:

  • 如果Mysql导出csv格式数据乱码,是csv文件本身的文本编码问题导致的
    • 1. 鼠标右键点击选中的 csv 文件,在弹出的菜单中选择“编辑”,则系统会用文本方式(记事本)打开该 csv 文件
    • 2. 打开 csv 文件后,进行“另存为”操作,在弹出的界面底部位置有“编码”,修改编码方式即可: 从UTF-8改成 ANSI,然后保存
    • 3. 再用 Excel 打开后,显示汉字正常

        找寻题目中的字段在哪张表中,发现shop表中包含了所有字段,不必连接表,用到之前所学的知识,都能解决

        这里得知GMV和cpc总费用在不同表中,需要连接两张表,这里可以用门店ID和日期两个字段一起作为连接依据,这样有效去除很多重复数据

        接下来我的本意是用left join,这样可以保证所有门店都包含在内,就是会有很多空值

        这里要求和,不是求每天数据那种,每个门店只要最后汇总的数据即可,那么用group by分一下组

        聚合函数不能放在where,所以写在having后面

        我总是喜欢写group by,但是要注意写了group by之后select后的语句就得出现在group by后面

        SQL内容算是复习完了,接下来边学其他内容,边练习牛客网的题目

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

华为AR1220配置GRE隧道

1.GRE隧道的配置 GRE隧道的配置过程,包括设置接口IP地址、配置GRE隧道接口和参数、配置静态路由以及测试隧道连通性。GRE隧道作为一种标准协议,支持多协议传输,但不提供加密,并且可能导致CPU资源消耗大和调试复杂等问题。本文采用华为AR1220路由器来示例说明。 配置…

C语言家教记录(六)

导语 本次授课的内容如下&#xff1a;指针&#xff0c;指针和数组 辅助教材为 《C语言程序设计现代方法&#xff08;第2版&#xff09;》 指针 指针变量 计算机按字节划分地址&#xff0c;每个地址访问一个字节 指针变量指向变量的地址&#xff0c;指的是变量第一个字节的…

ElasticSearch读写性能调优

文章目录 ES写入数据过程ES读取数据的过程写数据底层原理提升集群读取性能数据建模优化分片 提升写入性能的方法服务器端优化写入性能建模时的优化降低Translog写磁盘的频率&#xff0c;但是会降低容灾能力分片设定调整Bulk 线程池和队列 ES写入数据过程 客户端选择一个node发…

记录一次搭建uniapp-vue3的基础项目

1.使用 HBuilder X 创建uniapp vue3的基础项目 2.安装 自动导包插件 unplugin-auto-import npm install unplugin-auto-import或者 pnpm install unplugin-auto-import2.1 根目录下创建 vite.config.js 复制粘贴以下内容 import { defineConfig } from vite import uni fro…

食品零食小吃商城管理系统-计算机毕设Java|springboot实战项目

&#x1f34a;作者&#xff1a;计算机毕设匠心工作室 &#x1f34a;简介&#xff1a;毕业后就一直专业从事计算机软件程序开发&#xff0c;至今也有8年工作经验。擅长Java、Python、微信小程序、安卓、大数据、PHP、.NET|C#、Golang等。 擅长&#xff1a;按照需求定制化开发项目…

一文学会本地部署可视化应用JSONCrack并配置公网地址实现远程协作

文章目录 前言1. Docker安装JSONCrack2. 安装Cpolar内网穿透工具3. 配置JSON Crack界面公网地址4. 远程访问 JSONCrack 界面5. 固定 JSONCrack公网地址 前言 本文主要介绍如何在Linux环境使用Docker安装数据可视化工具JSONCrack&#xff0c;并结合cpolar内网穿透工具实现团队在…

网络编程/在哪些场景中不必要进行网络字节序装换? Windows Sockets: Byte Ordering

文章目录 概述字节序必须转换字节序的的情况不必转换字节序的的情况字节序转换的例程字节序转换函数字节序转换可以不生硬字节序和位序 概述 本文主要讲述了在哪些场景下必须要进行大小端字节序转换&#xff0c;在哪些场景下可以不用进行大小端字节序转换&#xff0c;IP和端口…

<数据集>安全帽和安全背心识别数据集<目标检测>

数据集格式&#xff1a;VOCYOLO格式 图片数量&#xff1a;22141张 标注数量(xml文件个数)&#xff1a;22141 标注数量(txt文件个数)&#xff1a;22141 标注类别数&#xff1a;3 标注类别名称&#xff1a;[helmet, vest, head] 序号类别名称图片数框数1helmet15937572402v…

程序员如何写PLC程序

PLC是可编程逻辑控制器的简称&#xff0c;常用的编程语言是IEC61131-3&#xff08;梯形图、结构化文本、指令表、功能块、顺序功能图&#xff09;和西门子的SCL。程序员常用的编程语言是JS、Java、Python、C/C、Go等。PLC广泛采用编程工具有codesys、博图等。程序员常用的编程工…

XSS DOM破坏实战案例

目录 案例一 思考 源码分析 查找问题 实现 案例二 查看源码 问题查找 实现 实验环境&#xff1a;DOM clobbering | Web Security Academy (portswigger.net) 案例一 里面是一篇篇的博客&#xff0c;点击进去里面是一些评论 思考 尝试一些常规的xss 没什么效果... 他将…

为什么穷大方

为什么有些人明明很穷&#xff0c;却非常的大方呢&#xff1f; 因为他们认知太低&#xff0c;根本不懂钱的重要性&#xff0c;总是想着及时享乐&#xff0c;所以一年到头也存不了什么钱。等到家人孩子需要用钱的时候&#xff0c;什么也拿不出来&#xff0c;还到处去求人。 而真…

【Qt】常用控件QCheckBox

常用控件QCheckBox QCheckBox表示复选按钮&#xff0c;可以允许选中多个。 QCheckBox继承自QAbstractButton 例子&#xff1a;获取复选按钮的取值 使用Qt Designer先大体进行设计 代码实现&#xff1a; #include "widget.h" #include "ui_widget.h"Widge…

Python爬虫——爬取某网站的视频

爬取视频 本次爬取&#xff0c;还是运用的是requests方法 首先进入此网站中&#xff0c;选取你想要爬取的视频&#xff0c;进入视频播放页面&#xff0c;按F12&#xff0c;将网络中的名称栏向上拉找到第一个并点击&#xff0c;可以在标头中&#xff0c;找到后续我们想要的一些…

不能使用乘除法、for、while、if、else、switch、case求1+2+3+...+n

求123...n_牛客题霸_牛客网 (nowcoder.com) 描述 求123...n&#xff0c;要求不能使用乘除法、for、while、if、else、switch、case等关键字及条件判断语句&#xff08;A?B:C&#xff09;。 数据范围&#xff1a; 0<n≤2000<n≤200 进阶&#xff1a; 空间复杂度 O(1)O(…

MySQL:查询(万字超详细版)

&#x1f48e;所属专栏&#xff1a; MySQL &#x1f48e;1. 单表查询 &#x1f48e;1.1 全列查询和指定列查询 全列查询&#xff1a; select * from exam; 在实际开发中不要使用 * 来进行查询&#xff0c;因为数据库会很大&#xff0c;影响效率 指定列查询&#xff1a; se…

Redis未授权访问漏洞利用合集

一、基本信息 靶机&#xff1a;IP:192.168.100.40 攻击机&#xff1a;IP:192.168.100.60 二、漏洞 & 过程 Redis 未授权访问漏洞利用无口令远程登录靶机 靶机 cd redis-4.0.8/src./redis-server ../redis.conf 攻击机 ./redis-cli -h 192.168.100.40 Redis 未授权访问…

eNSP 华为ACL配置

华为ACL配置 需求&#xff1a; 公司保证财务部数据安全&#xff0c;禁止研发部门和互联网访问财务服务器&#xff0c;但总裁办不受影响 R1&#xff1a; <Huawei>sys [Huawei]sys Router1 [Router1]undo info-center enable [Router1]int g1/0/0 [Router1-GigabitEth…

openharmony 南向开发基础:ohos自定义子系统,自定义部件,调用hilog部件,hilog日志封装傻瓜式教程

openharmony 南向开发基础:ohos自定义子系统,自定义部件,调用hilog部件,hilog日志封装 自定义单部件 关于开源鸿蒙的南向教程不多,很多都是从官方文档上抄的的例子,官网的例子不是很适合入门,写的很粗糙,不适合傻瓜阅读,毕竟对于刚入行鸿蒙的新手而言,gn语法就是第一劝退魔咒…

【k8s从节点报错】error: You must be logged in to the server (Unauthorized)

k8s主节点可以获取nodes节点信息&#xff0c;但是从节点无法获取&#xff0c;且报错“error: You must be logged in to the server (Unauthorized)” 排查思路&#xff1a; 当时证书过期了&#xff0c;只处理的主节点的证书过期&#xff0c;没有处理从节点的 kubeadm alpha …

解锁 Starknet 的深层洞察:利用 Dune 构建动态数据可视化

原文&#xff1a;https://dev.to/lordghostx/queries-to-insights-visualizing-starknet-data-with-dune-j8p 作者&#xff1a;LordGhostX 编译&#xff1a;TinTinLand Starknet 的链上数据为其区块链生态系统提供了丰富的洞察。它为用户活动、交易模式和网络交互提供了全面…