Mysql中关于on,in,as,where的区别

news2024/11/25 20:42:34

目录

Mysql on,in,as,where的区别

Mysql语句问题解决

1、left join数据筛选问题

2、相同数据重复筛选使用问题

3、根据某个字段排序取每个类别最后三条数据或前三条数据

4、业务逻辑书写位置问题

5、查找另一表内和本表相关字段的数量

6、关于union的使用

7、limit的巧用

8、update ignore和insert ignore的使用

9、mysql存在更新,不存在则插入


Mysql on,in,as,where的区别

Where查询条件,on内外连接时候用,as作为别名,in查询某值是否在某条件里

创建2个表:student,score

student:

score:

where

SELECT * FROM student WHERE s_sex='男'

例如:on

SELECT * FROM student LEFT JOIN score on student.s_id=score.s_id;

on和where组合:

SELECT * FROM student LEFT JOIN score on student.s_id=score.s_id WHERE s_name='赵雷' 

例如:in

SELECT * FROM score WHERE s_id in (SELECT s_id FROM student WHERE s_name='赵雷')

as

select * from score as a LEFT JOIN student as b on a.s_id=b.s_id where s_name='赵雷'

Mysql语句问题解决

1、left join数据筛选问题

on后面的条件只能对left join右边的表进行筛选,左表匹配不到右表数据会在原右表位置处显示null,left join左边的表数据不受约束,将on后的条件加到where后会对所有数据进行筛选。

2、相同数据重复筛选使用问题

with <name> as()

mysql内可以使用with as生成临时表,<name>为临时表的名字,使用如下:

with arc as( 

    select id,arc.title,update_time,is_top,cId,pid,name_id from article arc where is_del = 0 

) 

select * from arc

with...as的作用范围只有一次sql执行的时间,执行过后就不再存在,根据例子我们本要处理article表,但表里的数据并非都是我们需要的,所系先筛选建立了一个临时表arc,我们会对arc进行操作。

如果只是上述例子的简单操作是没必要使用with...as的,但是当我们需要将article表与其他表进行联查甚至嵌套时,会出现要多次进行is_del = 0的判断,最终出来的sql语句可能个十分复杂,并且极易出错,但使用arc就不需要在对数据进行重复筛选了。

with...as里的sql可以更复杂些,比如article表里有name_id,但更多时候我们希望使用name,我们可以预先在with...as内查找好,再使用临时表去做其他操作。

3、根据某个字段排序取每个类别最后三条数据或前三条数据

这算是个比较经典的一个问题了,我初学,只会一种解题方法,但会尽力讲的简单通俗点。

示例:

select * from ( 

select cId,title,content( 

    select count(*)+1 from arc a1 where (a1.cId = a2.cId) and a1.updateTime > a2.updateTime 

)updateTimeSort from arc a2 

) a3 

where updateTimeSort <= 3 order by cId,updateTime desc

示例中cId是类别id,updateTime 是更新时间,解决问题是选取arc内每个类别最晚更新的的三条数据,就像新闻的首页需要为每个分类选出最新的三条新闻,按照数据库里的数据我们可以使用排序 order by cId,updateTime desc 对数据按类别和更新时间进行排序,但去取每个类别的特定几条数据,现有数据库是做不到的,因此我们可以添加一个临时字段。

updateTimeSort 它表示的是每个类别中每个子项在这个类别中的排序,在当前问题中这个临时字段应该是和字段 updateTime 相关的,根据更新时间为类别中的每个子项排出顺序。

如示例代码,我们能找到a1和a2这两个表,他们都是arc表的别称,通过子查询的形式结合在一起,以a2为主,去a1表内查找类别和a2当前数据相同的,并且更新时间晚于a2当前数据的数据数量,能看到 count(*)+1 也就是数量加一了,不加一也可以,只是当一条数据在它所处类别更新时间最晚时count(*) 的值是0,若果使用count(*)+1 我们就可以将数据从1开始排序。

最终我们只要选取 updateTimeSort <= 3 的数据即可,如果想要筛选最早发布的新闻也只需要将updateTimeSort 的筛选逻辑变更一下即可,在示例代码中即将

a1.updateTime > a2.updateTime 更改为 a1.updateTime < a2.updateTime

可以看到示例代码中还有一个表a3,它其实时一个临时表,前面我们了解了with..as可以生成临时表,也重这次代码中可以看出,临时表也可以以另一种形式存在,with...as我们只有当sql复杂时才会使用,一般来说现在这种方式能帮我们解决不少问题了,各有优劣,看情况使用。

4、业务逻辑书写位置问题

接触sql多了会发现,sql其实能帮我们解决一定的业务问题,明显的有sql的存储过程和方法,对sql语句的批量处理其实在一定程度上帮我们解决一定的业务问题,但缺点也很明显,当新手接触这个项目时他很难搞清楚某个功能到底是如何实现的,不利于维护。

一般来说我们解决业务是在server层,有时会使用sql解决一些问题,但很少,在sever处理受制于计算机硬件,在数据库处理受制于数据库性能,相比之下,计算机硬件更易于扩展,因此还是不推荐大量使用sql解决问题的。

例如上个问题:根据某个字段排序取每个类别最后三条数据或前三条数据问题,虽然问题基本解决但让存在一些 ‘bug’,例如排序时会产生1、2、3、3、4这种排序,这是因为同个类别内有两条数据更新时间重复了,那我们直观想法(还是要看个人经验值)应该是,既然问题出在数据库,那应该在数据库查询的时候就解决这个问题,但事实上,让数据库去解决并不好解决,数据库的强项在于各种搜索算法,不在于逻辑处理,因此我们就要转移到server层处理,会有不少人陷于这个坑,花费大量时间去找办法让数据库去处理这类问题,但其实就算数据库处理得了,它也不一定有server层处理的效率高,当然如果是为了学习更多东西,这些时间也是值得花的,但是这种解题思路还是要改变下的。将1、2、3、3、4问题交给server处理也就是利用java等高级语言处理这种问题,相信熟用这些语言的开发者解决这些问题都是小case了。

5、查找另一表内和本表相关字段的数量

先复习下知识:用过count函数的人都清楚一旦使用count这类聚合函数,不做其他处理数据就会归为一行数据,但很多时候我们并不期望这样的结果,以此就要想些办法能用聚合函数,也能获取很多数据,我常用的是利用group by分组。

回归问题,现有(现不讨论表是否合理)文章表(id,title,content)有文章id,标题,文章内容三个字段,点赞收藏表(id,arc_id,fav,like)有表id,文章id,收藏字段(0未收藏,1收藏),点赞字段(0未点赞,1点赞),现要查询文章表内每篇文章的点赞收藏数,sql语句:

select art.title,art.content, 

count(case afl.fav when 1 then 1 end) as collectNum, 

count(case afl.like when 1 then 1 end) as likeNum 

from article art 

left join article_favor_like afl on afl.arc_id = art.id 

group by afl.arc_id //这是关键

如果没有group by afl.arc_id 后果就是,查出来一行数据,数据还牛头不对马嘴,但通过对文章收藏表中的文章id进行分组就可以针对每个文章id查询数据,这样left join时右表就有每个文章id对相应的收藏数与点赞数,而不是表内所有点赞数和收藏数,最终数据也是我们所需的。

6、关于union的使用

例子:

select id,title,content,1 isArc from arc 

union 

select id,name,content,0 isArc from news
  • 使用union进行的是上下整合
  • 被联合的数据列数要求一致
  • 列数相同,数据类型不同会自动进行数据类型转换
  • 联合后的列的名字由联合中第一次出现的列名为依据,即使后续被联合数据有自己的列名也不会使用,在例子中最终列名为:id,title,content,name等列名不会使用,因此使用union一般配合别名使用统一结果。
  • 有时候会区分数据是哪个表的,可以通过附加额外的字段来区别,就像例子中的isArc字段,news表中的isArc可以不写,原因也就是第4条,最终列名由第一次出现的列名决定,后续数据列名有没有都可以。

7、limit的巧用

limit一般用于分页,功能是获取指定区间内的数据,因此我们也可以用它来减少数据库的查询,例子:

select * from arc where id = 12 limit 1

数据库查询由索引还好,没有索引是要遍历数据库的,有些数据经由条件筛选在逻辑上应该是唯一的,使用limit 1可以使数据库查询到该数据时不再搜索,减少数据库搜索次数,但这种方法仅是一种技巧,想大幅度优化sql还要另想办法。

8、update ignore和insert ignore的使用

//标题是唯一索引,'新标题'存在则更新操作不执行 

update ignore arc set title = '新标题' 

  

//标题是唯一索引,'标题1号'存在则插入操作不执行 

insert ignore into arc values(null,'标题1号','文章内容')

有这种需求,数据存在时不执行任何操作,不存在则更新或插入,一个办法是使用ingore,它会忽略数据库报错,而数据库执行原子操作时报错是会回滚的,因此只要我们给数据加上主键或唯一索引,当被更新字段或插入字段与原有数据冲突时会报错,但因为ingore会忽视这种报错,后端也就不会报错,sql也未执行,达到了目的,有人会对报错敏感,其实也没什么,报错也是在检查数据是发现不合理之处给的一个提醒或警告,对数据库无害的。

9、mysql存在更新,不存在则插入

区别于上面那个需求,这个是当插入的数据存在时更新数据,不再是不做任何操作,例子:

//本例子中title不是唯一索引,id是主键 

insert into arc values(1,'标题1号','文章内容') 

on duplicate key update title='标题1号'

//若要更新多个字段使用','隔开,例:title='标题1号',content='文章内容'

在例子中,当id为1的数据存在时,更新标题和内容,不存在则插入,如果执行更新操作,未设置新值的字段保持原来的值。

还有一个REPLACE INTO也可以达到这种效果,区别在于,REPLACE INTO更新时是先删除后插入会破坏原有索引,id为3的数据更新时会删除插入id为4的数据,未更新新值的字段设置为默认值或null。

无论是两个中的哪种方式判断数据是否存在的依据都是主键和唯一索引。

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

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

相关文章

Ubuntu如何设置成中文

1、右上角点击&#xff08;音量图标和电池图标位置&#xff09;&#xff0c;选择“Settings”&#xff08;设置&#xff09;。 2、左侧选择“Region & Language”&#xff08;区域与语言&#xff09;&#xff0c;然后选择“Manage Installed Languages”&#xff08;管理已…

测试开发-2-概念篇

文章目录 衡量软件测试结果的依据—需求1.需求的概念2.从软件测试人员角度看需求3.为什么需求对软件测试人员如此重要4.如何才可以深入理解被测试软件的需求5.测试用例的概念6.软件错误&#xff08;BUG&#xff09;的概念7.开发模型和测试模型8.软件的生命周期9.瀑布模型&#…

中科大计网学习记录笔记(十一):CDN

前言&#xff1a; 学习视频&#xff1a;中科大郑烇、杨坚全套《计算机网络&#xff08;自顶向下方法 第7版&#xff0c;James F.Kurose&#xff0c;Keith W.Ross&#xff09;》课程 该视频是B站非常著名的计网学习视频&#xff0c;但相信很多朋友和我一样在听完前面的部分发现信…

Qt 的准备知识

文章目录 1. Qt 背景介绍2. 搭建 Qt 开发环境3. 认识 Qt Creator3.1 main.cpp3.2 widget.h3.3 widget.cpp3.4 Forms3.5 .pro文件 1. Qt 背景介绍 Qt 是⼀个 跨平台的 C 图形用户界面应用程序框架 。它为应用程序开发者提供了建立艺术级图形界⾯所需的所有功能。它是完全⾯向对…

SAP MM学习笔记42 - 特殊调达流程 - 受托品(寄售)

上一章讲了 外注加工的知识。 详细可以参考如下链接。 SAP MM学习笔记41 - 特殊调达流程 - 外注加工-CSDN博客 咱们继续学习特殊调达流程。 本章主要讲受托品。 1&#xff0c;什么是受托品 &#xff08;寄售&#xff09; 仕入先提供的商品&#xff0c;商品是放在你公司了&a…

Python爬虫——解析库安装(1)

目录 1.lxml安装2.Beautiful Soup安装3.pyquery 的安装 我创建了一个社区&#xff0c;欢迎大家一起学习交流。社区名称&#xff1a;Spider学习交流 注&#xff1a;该系列教程已经默认用户安装了Pycharm和Anaconda&#xff0c;未安装的可以参考我之前的博客有将如何安装。同时默…

C语言第二十四弹---指针(八)

✨个人主页&#xff1a; 熬夜学编程的小林 &#x1f497;系列专栏&#xff1a; 【C语言详解】 【数据结构详解】 指针 1、数组和指针笔试题解析 1.1、字符数组 1.1.1、代码1&#xff1a; 1.1.2、代码2&#xff1a; 1.1.3、代码3&#xff1a; 1.1.4、代码4&#xff1a; 1…

LeetCode 每日一题 Day 62 - 75

1686. 石子游戏 VI Alice 和 Bob 轮流玩一个游戏&#xff0c;Alice 先手。 一堆石子里总共有 n 个石子&#xff0c;轮到某个玩家时&#xff0c;他可以 移出 一个石子并得到这个石子的价值。Alice 和 Bob 对石子价值有 不一样的的评判标准 。双方都知道对方的评判标准。 给你…

手动汉化unity编辑器,解决下载中文语言报错问题

手动汉化unity编辑器&#xff0c;解决下载中文语言报错问题 START 最近在下载支持微信小程序版本的编辑器时&#xff0c;中文语言包&#xff0c;一直无法下载。记录一下 手动汉化unity编辑器的方法 &#xff0c;帮助和我遇到同样问题的人。 解决方案 1. 下载汉化包 https:…

建模语言CellML初步

文章目录 简介洛伦兹吸引子仿真 简介 CellML是主打计算生理学的一个编程语言&#xff0c;擅长处理微分方程问题&#xff0c;并且内置了单位系统&#xff0c;是细胞层次的建模工具。openCOR为其运行环境&#xff0c;提供了舒适的代码编辑窗口&#xff0c;以及一系列IDE工具&…

QEMU使用步骤

1、安装虚拟机环境&#xff1a;ubuntu-16.04.7-desktop-amd64.iso,下载地址&#xff1a;Index of /ubuntu-releases/16.04.7/ | 清华大学开源软件镜像站 | Tsinghua Open Source Mirror 2、安装gcc-linaro-7.3.1-2018.05-x86_64_arm-linux-gnueabihf.tar.xz到/opt目录&#xf…

漫漫数学之旅020

文章目录 经典格言数学习题古今评注名人小传 - 尼尔斯玻尔 经典格言 专家就是这样一个人&#xff0c;在一个很狭小的领域里犯下一切可能犯的错误。——尼尔斯玻尔&#xff08;Niels Bohr&#xff09; 尼尔斯玻尔&#xff0c;这位量子物理界的巨头&#xff0c;以一句幽默且充满…

【Python】高级数据类型

&#x1f6a9; WRITE IN FRONT &#x1f6a9; &#x1f50e; 介绍&#xff1a;"謓泽"正在路上朝着"攻城狮"方向"前进四" &#x1f50e;&#x1f3c5; 荣誉&#xff1a;2021|2022年度博客之星物联网与嵌入式开发TOP5|TOP4、2021|2222年获评…

几个经典金融理论

完整EA&#xff1a;Nerve Knife.ex4黄金交易策略_黄金趋势ea-CSDN博客 一、预期效用理论 预期效用理论是描述人们在做出决策时如何考虑风险和不确定性的一种理论。该理论最初由经济学家冯诺伊曼&#xff08;John von Neumann&#xff09;和奥斯卡摩根斯坦恩&#xff08;Oskar…

图像配准之HomographyNet

文章名称&#xff1a;Deep Image Homography Estimation&#xff0c;论文地址&#xff1a;https://arxiv.org/pdf/1606.03798.pdf&#xff0c;代码地址&#xff1a;GitHub - mazenmel/Deep-homography-estimation-Pytorch: Deep homography network with Pytorch 1、背景介绍 …

maven创建webapp+Freemarker组件的实现

下载安装配置maven Maven官方版下载丨最新版下载丨绿色版下载丨APP下载-123云盘123云盘为您提供Maven最新版正式版官方版绿色版下载,Maven安卓版手机版apk免费下载安装到手机,支持电脑端一键快捷安装https://www.123pan.com/s/9QRqVv-TcUY.html链接为3.6.2-3.6.3的版本 下载解…

【C++】类和对象(四)

前言&#xff1a;在类和对象中&#xff0c;我们走过了十分漫长的道路&#xff0c;今天我们将进一步学习类和对象&#xff0c;类和对象这块荆棘地很长&#xff0c;各位一起加油呀。 &#x1f496; 博主CSDN主页:卫卫卫的个人主页 &#x1f49e; &#x1f449; 专栏分类:高质量&a…

《小强升职记:时间管理故事书》阅读笔记

目录 前言 一、你的时间都去哪儿了 1.1 你真的很忙吗 1.2 如何记录和分析时间日志 1.3 如何找到自己的价值观 二、无压工作法 2.1 传说中的“四象限法则 2.2 衣柜整理法 三、行动时遇到问题怎么办&#xff1f; 3.1 臣服与拖延 3.2 如何做到要事第一&#xff1f; 3.…

【碎片知识点】安装Linux系统 VMware与kali

天命&#xff1a;VMware就是可以运行操作系统的载体&#xff0c;kali就是Linux的其中一个分支 天命&#xff1a;Linux有两个分支版本&#xff1a;centos与ubuntu&#xff0c;kali底层就是ubuntu&#xff08;所有Linux用起来都差不多&#xff0c;没啥区别&#xff09; 天命&…

linux系统zabbix自动发现主机

自动发现主机 新的主机浏览器配置创建发现规则创建发现主机后动作 新的主机 rpm -Uvh https://repo.zabbix.com/zabbix/5.0/rhel/7/x86_64/zabbix-release-5.0-1.el7.noarch.rpm# yum clean allyum install zabbix-agentvim /etc/zabbix/zabbix_agentd.conf Server10.12.153.1…