SQL隐藏技术?
可能重复: SQL提供了哪些专业/微妙的技术,而很少有人知道哪些技术也可以减少代码并提高性能 我刚刚学会了如何在聚合函数中使用CASE语句,这完全改变了我的方法 还有其他的吗 更新:基本上是任何供应商。但是PostgreSQL如果您只想关注一个:DSQL GROUP BY- 分析AKA排名,AKA窗口功能,即: 行号 等级 密秩 安提尔 结束 视图:正常和物化SQL隐藏技术?,sql,mysql,sql-server,postgresql,Sql,Mysql,Sql Server,Postgresql,可能重复: SQL提供了哪些专业/微妙的技术,而很少有人知道哪些技术也可以减少代码并提高性能 我刚刚学会了如何在聚合函数中使用CASE语句,这完全改变了我的方法 还有其他的吗 更新:基本上是任何供应商。但是PostgreSQL如果您只想关注一个:DSQL GROUP BY- 分析AKA排名,AKA窗口功能,即: 行号 等级 密秩 安提尔 结束 视图:正常和物化 如果不参考特定于供应商的语法,就很难说什么人们没有充分使用内置函数,并且喜欢重新发明轮子,以下是 在集群的uniqueidentifi
如果不参考特定于供应商的语法,就很难说什么人们没有充分使用内置函数,并且喜欢重新发明轮子,以下是 在集群的uniqueidentifier列上使用NEWSEQUENTIALID而不是NEWID将执行得更好,因为它不会导致页面拆分和碎片 使用辅助的数字表,以便您可以快速执行一些基于集合的逻辑 比如说
select DATEADD(m,number,'20010101')
from master..spt_values
where type = 'P'
order by 1
任何、全部和部分SQL Server a.k.a.PostgreSQL或Oracle
我很高兴知道这件事。你可以做各种各样的方便的事情,比如计数、分区、排名等等。最近我用了很多
及
在挑出不同的行或公共行时非常有用且效率令人不安,这适用于集合之间行中的所有列。当您有很多列时,这非常有用
这是2005年的新版本,我知道那是很久以前的事了,但是很多人仍然在使用2000。
当name='tim'然后value else 0结束构建聚合时,省去了大量的case操作。。我很惊讶有多少人在检查存在或选择时仍然使用COUNT*。。。存在的子句可以更快地完成这项工作
最常见的情况是:
SELECT @MyVar = Count(*) FROM Table1 WHERE....
If @MyVar <> 0
BEGIN
--do something
END
总是更好。在MySQL下,使用关键字STRAIGHT\u JOIN。如果您知道自己的数据以及要加入的查找表之间的关系,有时优化器会将较小的表视为加入的基础,并尝试将较少的记录计数查询到较大的表中,从而占用更多的时间。如果您的主表在from中是第一个,并且它的条件在前面,那么直接连接将首先命中该表,然后连接到其余的表,并立即完成
我不得不处理1000多万条记录的政府数据,这些记录与大约15+个查找表连接在一起。如果没有直接连接,系统将在20多个小时后阻塞。添加直接连接大约需要2小时。来自Postgresql的两个:参见示例和新的。在Sql Server中,HAVING子句。特别是,让ingCount DISTINCT FOO>@SomeNumber快速查找给定分组中具有多个不同值的行 发件人: 从PostgreSQL文档: 分区是指将逻辑上的一个大表拆分为更小的物理部分。分区可以提供几个好处: 对于某些类型的查询,可以显著提高查询性能 更新性能也可以提高,因为表的每一部分的索引都小于整个数据集上的索引。当索引不再容易放入内存时,索引上的读写操作都会占用越来越多的磁盘访问 如果分区设计中计划了该需求,则只需删除一个分区即可完成批量删除。DROP TABLE比批量删除快得多,更不用说随之而来的真空开销了 很少使用的数据可以迁移到更便宜、速度更慢的存储介质
用于创建变量和减少重复代码的派生表 类似这样的东西,但可以扩展。显然,平均值可能是一个复杂得多的计算,如果您有几个,它有助于清理代码
Select *, case when AverageValue > 50 then 'Pass' Else 'Fail' end
From
(
Select ColA, ColB, AverageValue = (ColA+ColB)/2
From InnerMostTable
) AverageValues
Order By AverageValue Desc
公共表表达式SQL Server 2005+
WITH x AS (
SELECT 1 as A, 2 as B, 3 as C
),
WITH y AS (
SELECT 4 as A, 5 as B, 6 as C
UNION
SELECT 7 as A, 8 as B, 9 as C
)
SELECT A, B, C FROM x
UNION
SELECT A, B, C FROM y
在SQL Server中,使用Convert函数而不是Cast函数以mm/dd/yyyy格式获取日期,将查询分解为多个步骤,这非常好
SELECT convert(datetime, '1/1/2010', 101)
我一直使用这个排名函数非常有用。我很久没有使用过任何/all/SOME,使用join。第三项通常被称为使用理货表,对于查找序列中的空白非常有用。人们真的不知道GETUTCDATE吗?PostgreSQL窗口函数也是如此,语法基本相同。似乎是我最近回答的一半sql问题的答案…标记为的副本-将其扩展到所有平台只会将其进一步归入主观/NARQ类别。请阅读更新。我也在寻找常见的漂亮的sql技术。就像我的示例中适用于所有RDBMSes的一样,连接和聚合不是比使用子查询更好吗DOuter联接通常比不存在的联接要快,至少在SQLServer2000中是这样,除非集合不满足存在条件
谓词比表小得多。但是,总体性能将在很大程度上取决于查询优化程序是否正确地执行查询—在大多数情况下可能会这样做。在这种情况下,如果EXISTS使查询更清晰,则可能会更好。SQL Server 2005+、Oracle 11g+支持PIVOT/UNPIVOT。我相信是ANSI。CASE得到了更广泛的支持,为了便于携带,我更喜欢它而不是PIVOT.dude这些是kick@$$:D+1 clearlysee leonbloy的答案。更加优雅。
USE AdventureWorks2008R2 ;
GO
SELECT SalesOrderID, SUM(LineTotal) AS SubTotal
FROM Sales.SalesOrderDetail
GROUP BY SalesOrderID
HAVING SUM(LineTotal) > 100000.00
ORDER BY SalesOrderID ;
Select *, case when AverageValue > 50 then 'Pass' Else 'Fail' end
From
(
Select ColA, ColB, AverageValue = (ColA+ColB)/2
From InnerMostTable
) AverageValues
Order By AverageValue Desc
WITH x AS (
SELECT 1 as A, 2 as B, 3 as C
),
WITH y AS (
SELECT 4 as A, 5 as B, 6 as C
UNION
SELECT 7 as A, 8 as B, 9 as C
)
SELECT A, B, C FROM x
UNION
SELECT A, B, C FROM y
SELECT convert(datetime, '1/1/2010', 101)