SQL 常用的判断、连表、跨库、去重、分组、ROW_NUMBER()分析函数SQL用法
常用的SQL 由浅入深
大致上回想一下自己常用的SQL,并做个记录,目标是实现可以通过在此页面查找到自己需要的SQL ,陆续补充 有不足之处,请提醒改正
首先我创建了两个库,每个库两张表.(工作的时候,每个公司最好有自己的数据库模型,产品也可以看,模型工具一般用PD(power designer)什么的,用起来简单规范方便,建议萌新学习)
·
第二个库crtest2是复制第一个crtset的 复制表的方法为右键--》编写脚本--》打开库2的窗口复制(建议瞟一眼脚本,执行不成功的 脚本最上面数据库改成目标数据库)
1.增删改查
查:程序员最主要的技能 有很多方法 这里由浅入深讲一下
select 字段名 from 表名 (*代表查一个表的所有字段,其实不建议具体开发查全部,用哪个字段查哪个,*号的效率太慢,耗性能,优化的一部分)

查三个字名字的人,并把name= 杨永信 的输出为 雷电法王,这一手是为了使用一下case when (碰到条件查询不要着急,一步步来,先确保数据逻辑的正确性,写好后,再去优化SQL)(美化SQL用Navicat Premium,SQL format,SQL Beautifier等等,这三个亲测好用)
case when .. then .. else ..end 就当做 if ...else....来用就行

查数据量,不建议用 count(*),换成count(字段名),没有字段名的约束 用 count(1)来查,执行速度截然不同

连表查询,超过两个表以上的连表查询,一定要记得大表在前小表在后。实际情况里 inner join,left join使用的比较多,这里做一下区分,到底什么时候用inner,什么时候用left
网上也有很多,说的太官方,容易迷。这里我通俗的讲一讲
left join:左联合 就是说两个表关联 左边的是大哥,一切以大哥为准,大哥表的数据无条件全部返回,其他表跟大哥对应的数据,大哥也全都要 (所以一般来说,left比inner的数据量要多)
inner join:内联合 两个表是拜把子 互相谦让,你有我也有的数据才要,取共同点
语法: select * from A表 left join B表 on a.id = b.id 很简单
跨库查询也是一样,这里我查crtest 和crtest2 两个库的HelloMan表的联合查询,很简单,看一下

去重
SQL去重一般用distinct,group by这两种方法,介绍一下
distinct: select distinct(字段名) from 表名 where 条件
group by:select 字段 from 表名 group by 字段 having 条件
使用 group by的时候 用having语法 而不是where (本人倾向于group by,因为它不仅仅是去重查找,删重,条件嵌套可以一起写,功能多一些吧。 )

ROW_NUMBER()函数
这个ROW_NUMBER(),在数据库执行的时候有点耗性能,但它的任务多数情况下是用来提升性能的。奇怪吧,往下看看
你可以帮他当做成分组函数或是分析函数
刚接触.NET的时候。大家对GridView,Repeater这些控件很熟悉吧。数据量多的时候我们使用了分页,但是一般的是直接绑定数据源的分页,又称为假分页,还是一次性从数据库里select这些数据。但是用ROW_NUMBER() 就可以做成真分页,每次都只差Pagesize条数据。提升了性能速度吧。
语法:ROW_NUMBER() over(order by 字段名 desc)

看到了吧,多了个排序字段 在where一下 真分页就OK了嘛
假设我们想查一个商场一个时间段内,第88位消费的顾客的信息。嘿嘿,一步到位的话也可以写,不用ROW_NUMBER()的函数还真的不好写。用ROW_NUMBER()就好多了
回到我们的测试表 对着上面 我们查一下年龄段在15-25,四个字名字,排名第二高的武林高手(武林排名按照各自的cid来算,剑无尘第一,因为数据少我们能从上面提前看出答案,是关谷),SQL如下:

先分组,再寻找 简单的很
模糊查询
很简单,一看便知 这里说一下我们经常用的通配符为 %% ,但是还有一些 像 like '_ a_' ,like '[a]b' 这种的 也是通配符,LZ觉得看关键字Like就完事儿了。知道就行了不常用

提一下,左右两边带 %,是两边都进行模糊匹,只放在左边是左边匹配,右边同理,一看便知

时间日期函数
convert() date() 大家可以去这来看看学习 http://www.w3school.com.cn/sql/func_convert.asp
写的全面,很好,这里我就不写了
数据格式转换,时间戳
时间戳:就是linux的时间 好一点的数据库储存时间的字段都是用时间戳存的,int类型,安全,占用空间小, 简单查看时间戳 https://tool.lu/timestamp/
方法: CONVERT(VARCHAR(10),DATEADD(s, ttime + 8 * 3600, '1970-01-01'),120) AS times (这里我又在测试表里又加了个ttime字段,用来存时间戳,取出来的时候用这个函数转换成时间,精确度自己设置)

convert() 在SQL中convert()函数除了转时间还可以进行其他格式的转换,最常用的就是钱,money,decimal类型,还有如果数据库是varchar类型之类的,然后你扔进来的是int,dateteime之类的就需要convert()转换一下,很简单
格式: convert(要转的类型,要转的数据) 例如: CONVERT(VARCHAR(50),tid) tid是int型转成varchar,很简单
说到这里要熟练使用 IsNULL()函数,加减乘除都要外面包一层IsNull()函数
格式:IsNull(数据,默认值) 例如 ISNULL(sum,0) as sum
先写到这里,差不多够用,有时间的话lz会补充的,总结写复杂的SQL不一定需要会那些新颖或者太复杂的函数,按照逻辑一点点的来,分步查,慢慢提高自己SQL。
通过简单的两句代码,慢慢发现编程的乐趣
SQL 常用的判断、连表、跨库、去重、分组、ROW_NUMBER()分析函数SQL用法的更多相关文章
- 2017.9.15 postgres使用postgres_fdw实现跨库查询
postgres_fdw的使用参考来自:https://my.oschina.net/Kenyon/blog/214953 postgres跨库查询可以通过dblink或者postgres_fdw来完 ...
- SQL Server跨库复制表数据错误的解决办法
SQL Server跨库复制表数据的解决办法 跨库复制表数据,有很多种方法,最常见的是写程序来批量导入数据了,但是这种方法并不是最优方法,今天就用到了一个很犀利的方法,可以完美在 Sql Serv ...
- SQL Server 跨库复制表方法小笔记
insert into tableA (column1,column2.....) SELECT * FROM OPENDATASOURCE('SQLOLEDB', 'Data Source=127. ...
- SQL语法精讲(包括建库、建表、建视图、查询、增加、删除、)
SQL语法精讲(包括建库.建表.建视图.查询.增加.删除.修改) SQL分类: DDL—数据定义语言(CREATE,ALTER,DROP,DECLARE) DML—数据操纵语言(SELECT,DELE ...
- 如何使用SQL SERVER数据库跨库查询
SQL Server中内置了数据库跨库查询功能,下面简要介绍一下SQL Server跨库查询.首先打开数据源码:OPENDATASOURCE不使用链接的服务器名,而提供特殊的连接信息,并将其作为四部分 ...
- SQL Server跨库查询
方式一: 语句 SELECT * FROM 数据库A.dbo.表A a, 数据库B.dbo.表B b WHERE a.field=b.field "DBO"可以省略 如 SELEC ...
- c# 实现定义一套中间SQL可以跨库执行的SQL语句
c# 实现定义一套中间SQL可以跨库执行的SQL语句 目前数据的种类非常多,每种数据都支持sql语句,但是大家发现没有每种数据的SQL都有自己的语法特性,都是SQL语句都没有一个特定的语法标准,导致开 ...
- sql 跨库查询备忘笔记
select * from OPENDATASOURCE( 'SQLOLEDB', 'Data Source=远程ip;User ID=sa;Password=密码' ).库名.dbo.表名 inse ...
- SQL Server 跨库同步数据
最近有个需求是要跨库进行数据同步,两个数据库分布在两台物理计算机上,自动定期同步可以通过SQL Server代理作业来实现,但是前提是需要编写一个存储过程来实现同步逻辑处理.这里的存储过程用的不是op ...
随机推荐
- 记一次Weblogic发布Springboot遇到的坑
项目使用的是Springboot,之前直接使用JAR包的方式发布,但在客户这边实施发布的时候,客户使用的容器是weblogic,版本为 10.3.6. 痛苦就此开始! 不过项目组还有另外一个也同样使 ...
- winform中TextBox只能输入字母
private void txtTestPerson_KeyPress(object sender, KeyPressEventArgs e) { if ((e.KeyChar >= 'a' & ...
- 逆向暴力求解 538.D Weird Chess
11.12.2018 逆向暴力求解 538.D Weird Chess New Point: 没有读好题 越界的情况无法判断,所以输出任何一种就可以 所以他给你的样例输出完全是误导 输出还搞错了~ 输 ...
- python基础自学 第一天
python的概述 python的创始人:吉多·范罗苏姆 1991年,第一个python解释器诞生,用C语言实现,并能调用C语音的库文件 解释器(解释型语言和编 译型语言的区别) 把其他语言翻译成计算 ...
- Docker系列教程26-Docker Compose控制服务启动顺序
作者:周立 在生产中,往往有严格控制服务启动顺序的需求.然而Docker Compose自身并不具备该能力.要想实现启动顺序的控制,Docker Compose建议我们使用: wait-for-it ...
- java处理数据库不支持的emoji表情符
一般数据库的编码是utf8,utf8是不支持存储表情符的,当存入的微信昵称带有表情符时就会出现乱码情况,有两种解决方法: 1.mysql数据库升级到5.5版本以上,utf8改为utf8mb4,utf8 ...
- Android 流媒体技术见解
一.技术关键点 1. 音频采集:设置合理的采样参数,包括采样率.通道数.采样深度. 2. 视频采集:手机摄像头采集输出的格式(NV12/NV21/YV12),要注意相互间的转换,以及采集出来图像的方向 ...
- ProgressBar 进度条开源项目总结
在Android开发中,我们不免会遇到进度条展示的需求,以下是本人之前star的开源项目,供大家参考: 一.ArcProgressBar 开源项目地址:https://github.com/zenoT ...
- 第48节:Java当中的集合框架
Java当中的集合框架 01 在我们班里有50位同学,就有50位对象. // 简书作者:达叔小生 Student[] stus = new Student[20]; 结果来了一位插班生,该同学因为觉得 ...
- 橙色优学:Java编程怎么提升技术,Java编程思维至关重要
橙色优学了解做为程序员,一旦进入技术行列,就开启了持续学习的道路,更迭迅速的互联网时代,技术自然也是一代一代的更新,在技术进阶的道路上,要不断吸收新的想法和技术知识. 牛逼的人总是让人羡慕,但如何才能 ...