复杂sql查询经验

本文分享了复杂SQL查询的经验,包括从结果出发编写SQL,逐步替换固定值,以及分层调试的方法。示例涉及SELECT、DISTINCT、GROUP BY、SUM等函数,以及UPDATE、INSERT和多表连接操作,展示了如何处理不重复部门的查询,并强调在使用GROUP BY时的注意事项。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1.任何SQL在开始写时,先写最终要实现的结果,比如说,最终是要更新数据,则开始就要写好update语句以及外层的where条件,然后再根据需要,进行层层深入;

2.在写复杂的SQL时,可以先用固定的数值来代替查询子句等实现基本的功能,然后将子句分割实现需要的功能后,直接用已经写好的子句替换掉刚开始时相对应的数值;

3.复杂的SQL语句编写时,一定要层层实现调试后再组合在一起进行最终调试,否则很难调试.

以下示例主要涉及到简单的SELECT查询,DISTINCT关键字,GROUP BY关键字,SUM等常用的聚集函数,UPDATE语句,INSERT语句,多表连接等。 

----查询2012年,type为月的不重复的部门,使用关键字:distinct

select distinct DepartmentName from DepartmentForm where (time = ' 2012-01-01' OR time = '2012-02-01' OR time = '2012-03-01' OR time = '2012-04-01' OR time = '2012-05-01' OR time = '2012-06-01' OR time = '2012-07-01' OR time = '2012-08-01' OR time = '2012-09-01' OR time = '2012-10-01' OR time = '2012-11-01' OR time = '2012-12-01') AND type = '';

其中,WHERE子句中同一个字段如果有一个或者多个值但不需要同时满足时,使用OR连接。

----查询2012年,type为月的不重复的部门,使用关键字:GROUP BY

select DepartmentName from DepartmentForm where (time = '2012-01-01' OR time = '2012-02-01' OR time = '2012-03-01' OR time = '2012-04-01' OR time = '2012-05-01' OR time = '2012-06-01' OR time = '2012-07-01' OR time = '2012-08-01' OR time = '2012-09-01' OR time = '2012-10-01' OR time = '2012-11-01' OR time = '2012-12-01') AND type = '' Group BY DepartmentName;

----查询2012年,type为月的不重复的部门,使用关键字:GROUP BY;并且使用GROUP BY 时,所要检索的字段名必须在GROUP BY之后出现,否则只能已聚集函数的形式出现,不然则出错。

select DepartmentName, Expense, sum(CommunicationExpense) from DepartmentForm where (time = '2012-01-01' OR time = '2012-02-01' OR time = '2012-03-01' OR time = '2012-04-01' OR time = '2012-05-01' OR time = '2012-06-01' OR time = '2012-07-01' OR time = '2012-08-01' OR time = '2012-09-01' OR time = '2012-10-01' OR time = '2012-11-01' OR time = '2012-12-01') AND type = '' Group BY DepartmentName, Expense;

----添加数据时,直接通过SELECT语句来查询出要添加的数据形成虚拟表,再将SELECT语句直接写在表字段的后面。需要注意的是,此处的SELECT语句中,如果要检索的字段是特殊的数据类型,如date型等,在书写时应在数据前面加上相应的字段类型.

insert into PersonForm(Time, Name, DepartmentName) select Date '2012-01-01' as Time, '王五' as Name, DepartmentName FROM DepartmentForm;

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值