数据库之SQL(二)

目录

一、简述SQL中如何将“行”转换为“列”

二、简述SQL注入

三、如何将一张表的部分数据更新到另一张表

四、WHERE和HAVING的区别


一、简述SQL中如何将“行”转换为“列”

        我们以MySQL数据库为例,来说明行转列的实现方式。

        首先,假设我们有一张分数表(tb_score),表中的数据如下图:

        然后,我们再来看一下转换之后需要得到的结果,如下图:

        可以看出,这里行转列是将原来的subject字段的多行内容选出来,作为结果集中的不同列,并根据userid进行分组显示对应的score。通常,我们有两种方式来实现这种转换。

        1、使用 CASE...WHEN...THEN 语句实现行转列,参考如下代码:

SELECT userid,
SUM(CASE `subject` WHEN '语文' THEN score ELSE 0 END) as '语文',
SUM(CASE `subject` WHEN '数学' THEN score ELSE 0 END) as '数学',
SUM(CASE `subject` WHEN '英语' THEN score ELSE 0 END) as '英语',
SUM(CASE `subject` WHEN '政治' THEN score ELSE 0 END) as '政治'
FROM tb_score
GROUP BY useri

        注意,SUM() 是为了能够使用GROUP BY根据userid进行分组,因为每一个userid对应的subject="语文"的记录只有一条,所以SUM() 的值就等于对应那一条记录的score的值。假如userid='001' and subject='语文' 的记录有两条,则此时SUM() 的值将会是这两条记录的和,同理,使用Max()的值将会是这两条记录里面值最大的一个。但是正常情况下,一个user对应一个subject只有一个分数,因此可以使用SUM()、MAX()、MIN()、AVG()等聚合函数都可以达到行转列的效果。

        2、使用 IF() 函数实现行转列,参考如下代码:

SELECT userid,
SUM(IF(`subject`='语文',score,0)) as '语文',
SUM(IF(`subject`='数学',score,0)) as '数学',
SUM(IF(`subject`='英语',score,0)) as '英语',
SUM(IF(`subject`='政治',score,0)) as '政治'
FROM tb_score
GROUP BY userid

        注意, IF(subject='语文',score,0) 作为条件,即对所有subject='语文'的记录的score字段进行SUM()、MAX()、MIN()、AVG()操作,如果score没有值则默认为0。

二、简述SQL注入

        SQL注入的原理是将SQL代码伪装到输入参数中,传递到服务器解析并执行的一种攻击手法。也就是说,在一些对SERVER端发起的请求参数中植入一些SQL代码,SERVER端在执行SQL操作时,会拼接对应参数,同时也将一些SQL注入攻击的“SQL”拼接起来,导致会执行一些预期之外的操作。

        举个例子:

        比如我们的登录功能,其登录界面包括用户名和密码输入框以及提交按钮,登录时需要输入用户名和密码,然后提交。此时调用接口/user/login/ 加上参数username、password,首先连接数据库,然后后台对请求参数中携带的用户名、密码进行参数校验,即SQL的查询过程。假设正确的用户名和密码为ls和123456,输入正确的用户名和密码、提交,相当于调用了以下的SQL语句。

SELECT * FROM user WHERE username = 'ls' AND password = '123456'

        SQL中会将#及--以后的字符串当做注释处理,如果我们使用 ' or 1=1 # 作为用户名参数,那么服务端构建的SQL语句就如下:

select * from user where username='' or 1=1 #' and password='123456'

        而#会忽略后面的语句,而1=1属于常等型条件,因此这个SQL将查询出所有的登录用户。其实上面的SQL注入只是在参数层面做了些手脚,如果是引入了一些功能性的SQL那就更危险了,比如上面的登录功能,如果用户名使用这个 ' or 1=1;delete * from users; # ,那么在";"之后相当于是另外一条新的SQL,这个SQL是删除全表,是非常危险的操作,因此SQL注入这种还是需要特别注意的。

        如何解决SQL注入?

        1、严格的参数校验。参数校验就没得说了,在一些不该有特殊字符的参数中提前进行特殊字符校验即可。

        2、SQL预编译。在知道了SQL注入的原理之后,我们同样也了解到MySQL有预编译的功能,指的是在服务器启动时,MySQL Client把SQL语句的模板(变量采用占位符进行占位)发送给MySQL服务器,MySQL 服务器对SQL语句的模板进行编译,编译之后根据语句的优化分析对相应的索引进行优化,在最终绑定参数时把相应的参数传送给MySQL服务器,直接进行执行,节省了SQL查询时间,以及MySQL服务器的资源,达到一次编译、多次执行的目的,除此之外,还可以防止SQL注入。

        具体是怎样防止SQL注入的呢?实际上当将绑定的参数传到MySQL服务器,MySQL服务器对参数进行编译,即填充到相应的占位符的过程中,做了转义操作。我们常用的JDBC就有预编译功能,不仅提升性能,而且防止SQL注入。

三、如何将一张表的部分数据更新到另一张表

        可以采用关联更新的方式,将一张表的数据更新到另一张表内。参考下面代码:

update b set b.col=a.col from a,b where a.id=b.id;
update b set col=a.col from b inner join a on a.id=b.id;
update b set b.col=a.col from b left join a on b.id=a.id;

四、WHERE和HAVING的区别

        WHERE:WHERE是一个约束声明,使用WHERE约束来自数据库的数据,WHERE是在结果返回之前起作用的,WHERE中不能使用聚合函数。

        HAVING:HAVING是一个过滤声明,是在查询返回结果集以后对查询结果进行的过滤操作,在HAVING中可以使用聚合函数。另一方面,HAVING子句中不能使用除了分组字段和聚合函数之外的其他字段。

        从性能的角度来说,HAVING子句中如果使用了分组字段作为过滤条件,应该替换成WHERE子句。因为WHERE可以在执行分组操作和计算聚合函数之前过滤掉不需要的数据,性能会更好。

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

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

相关文章

C# —— FileStream文件流

一个文件进行读写的时候,会变成一个文件流 FileStream类 输入流 用于从文件进行读取文件 输出流,向文件写入操作 I/O 类就是对应文件的操作的类 I/O类 包含各种不同的类 用于执行各种文件操作,创建文件删…

数据库中的schema和database

一、什么是schema schema可以简单理解为就是一个具体的数据库实例,不同的实例可以有不同的组成以及约束规则,比如数据库的字符编码方式、执行引擎等等。一个数据库服务器中可以包含多个schema,就像可以包含多个数据库实例一样。 二、如何创建…

使用stream流过滤对象中相同的属性值

使用stream流过滤对象中相同的属性值 文章目录 使用stream流过滤对象中相同的属性值前言一、使用stream流过滤集合对象中相同属性1.创建一个实体类2.创建一个过滤工具类3.创建一个测试类 总结 前言 我们在开发项目中,有很多需求是需要集合根据某个属性筛选出重复的…

什么是前端?

1、什么是前端? 将产品的UI设计稿在用户终端上实现,这就是前端。 简单来讲,前端要做的就是将产品的UI设计稿在用户终端上实现,因此可以说用户看到的所有视觉和交互都是前端的工作领域。 根据这个定义,我们可以把前端…

移动校园(8): Uniapp 中路由守卫进行用户权限管理--不同用户不同功能

思路,在登录之后将用户类型type写入本地存储,然后在前置路由守卫里面读取然后鉴权。 路由守卫VS拦截器 路由守卫主要管理前端之间页面的跳转 拦截器管理后端交互, 所以说权限管理需要路由守卫来做。 但是没有原生路由守卫,查…

A65 STM32_HAL库函数 之 USART通用驱动 -- A -- 所有函数的介绍及使用

A65 STM32_HAL库函数 之 USART通用驱动 -- A -- 所有函数的介绍及使用 1 该驱动函数预览1.1 HAL_USART_Init1.2 HAL_USART_DeInit1.3 HAL_USART_MspInit1.4 HAL_USART_MspDeInit1.5 HAL_USART_Transmit1.6 HAL_USART_Receive1.7 HAL_USART_TransmitReceive1.8 HAL_USART_Transm…

Echarts桑基图

关于Echarts的使用方法参考:vue2中echarts的使用_vue2中使用echarts-CSDN博客 实现效果: 代码: var sysT {"用采": #2D9BFF,"营销系统": #39BFFF,"ERP": #76C2FF,"财务管控": #5F57FC,"PMS&…

Java面试八股之描述一下MySQL使用索引查询数据的过程

描述一下MySQL使用索引查询数据的过程 1.解析查询语句与查询优化 用户提交一个 SQL 查询语句,MySQL 的查询解析器对其进行词法分析和语法分析,生成解析树。 查询优化器根据解析树、表结构信息、统计信息以及索引信息,决定是否使用 B树索引…

QProgressDialog 在进度条达到最大值时自动关闭,屏蔽esc和cancel按钮

使用QProgressDialog来展示当前任务执行进度 QProgressDialog 默认会在进度达到设定的最大值时自动关闭。 setAutoReset()设置为false或setAutoClose()设置为false时对话框无法自动关闭。 功能设计 任务未完成时,不允许其他操作,对话框设置为模态阻塞…

昇思MindSpore学习总结十二 —— ShuffleNet图像分类

当前案例不支持在GPU设备上静态图模式运行,其他模式运行皆支持。 1、ShuffleNet网络介绍 ShuffleNetV1是旷视科技提出的一种计算高效的CNN模型,和MobileNet, SqueezeNet等一样主要应用在移动端,所以模型的设计目标就是利用有限的计算资源来达…

拖拽排序 + 置顶和置底逻辑的实现

最近在实现拖拽排序、置顶和置底逻辑时遇到了比较恶心的问题。以下为记录 背景 我们系统的排序是基于数据库中的 sort_num 字段进行的,sort_num 值越大,数据排位越靠前。新增数据时,其 sort_num 默认为其 id 值。假设当前有 10 条数据&…

Linux实战记录

踩坑实录: day2: 最坑:安装UB居然不知道创建文件夹。 1.虚拟机上不了网:多重置几次 网卡 2.Winscp链接主机: 用户名 就是 linux terminal中的 第一个用户名!

mybatis-plus参数绑定异常

前言 最近要搞个发票保存的需求,当发票数据有id时说明是发票已经保存只需更新发票数据即可,没有id时说明没有发票数据需要新增发票;于是将原有的发票提交接口改造了下,将调用mybatis-plus的save方法改为saveOrUpdate方法&#xff…

架构设计(2)云原生架构与实例部署

云原生架构 云原生架构是一种面向云环境设计和构建应用程序的方法论,旨在充分利用云计算的优势,如弹性、自动化和可扩展性,以实现更高效、可靠和灵活的应用部署和管理。以下是云原生架构的核心理念和关键特点: 核心理念&#xf…

opencv读取视频文件夹内视频的名字_时长_帧率_分辨率写入excel-cnblog

看视频的时候有的视频文件名贼长。想要翻看,在文件夹里根本显示不出来,缩短又会丢失一些信息,所以我写了一份Python代码,直接获取视频的名字,时长,帧率,还有分辨率写到excel里。 实际效果如下图…

打造个性化科学工具箱:使用conda-build自定义软件包

打造个性化科学工具箱:使用conda-build自定义软件包 引言 Conda是一个强大的包管理系统,广泛用于Python社区,尤其在数据科学和机器学习领域。除了安装现成的包,Conda还允许用户通过conda-build工具构建和分享自己的软件包。本文…

imx6ull/linux应用编程学习(15) 移植MQTT客户端库

1. 准备开发环境 确保你的Ubuntu系统已经安装了必要的工具和依赖项。打开终端并运行以下命令: sudo apt update sudo apt install build-essential cmake git2. 获取MQTT库 git clone https://github.com/eclipse/paho.mqtt.c.git cd paho.mqtt.c3. 编译MQTT库 mk…

NI SCXI-1001 模块处理器控制器

NI SCXI-1001 一款小巧紧凑的传感器,可提供准确可靠的测量。它具有四个通道,允许同时进行多个测量。该传感器设计用于各种传感器,包括热电偶,rtd和应变片。 NI SCXI-1001 特征: 高密度设计:实现大量开关…

教程系列1 | 趋动云『社区项目』极速部署 SD WebUI

在上周,趋动云新推出的『社区项目』功能,以“一键克隆”的极致便捷与“省时省力”的高效体验,赢得了广大用户的关注。 随后,启动趋动云『社区项目』教程系列,旨在从零开始,全方位、手把手地引领您深入探索…

Pandas在生物信息学中的应用详解

Pandas在生物信息学中的应用详解 引言 生物信息学作为一门将计算机科学和生物学相结合的跨学科领域,正随着高通量实验技术的飞速发展而日益重要。Pandas,作为Python中一个强大的数据处理库,为生物信息学研究提供了便捷高效的数据处理和分析…