`

SQL数据库常见查询问题

阅读更多

 

摘自:http://topic.csdn.net/u/20100528/16/f3c160a2-6d97-4e19-8f74-154d34a940d7.html?seed=1574840243&r=65853880#r_65853880

 

1. 生成若干行记录
有用指数:★★★★★

常见的问题类型:根据起止日期生成若干个日期、生成一天中的各个时间段

《SQL Server 2005技术内幕:T-SQL查询》作者建议在数据库中创建一个数据表:

SQL code
<!-- Code highlighting produced by Actipro CodeHighlighter (freeware) http://www.CodeHighlighter.com/ --> --自然数表1-1M CREATE TABLE Nums(n int NOT NULL PRIMARY KEY CLUSTERED) --书上介绍了很多种填充方法,以下是最高效的一种,需要SS2005的ROW_NUMBER()函数。 WITH B1 AS(SELECT n=1 UNION ALL SELECT n=1), --2 B2 AS(SELECT n=1 FROM B1 a CROSS JOIN B1 b), --4 B3 AS(SELECT n=1 FROM B2 a CROSS JOIN B2 b), --16 B4 AS(SELECT n=1 FROM B3 a CROSS JOIN B3 b), --256 B5 AS(SELECT n=1 FROM B4 a CROSS JOIN B4 b), --65536 CTE AS(SELECT r=ROW_NUMBER() OVER(ORDER BY (SELECT 1)) FROM B5 a CROSS JOIN B3 b) --65536 * 16 INSERT INTO Nums(n) SELECT TOP(1000000) r FROM CTE ORDER BY r



有了这个数字表,可以做很多事情,除上面提到的两个外,还有:生成一批测试数据、生成所有ASCII字符或UNICODE中文字符、等等。

经常有高手使用SELECT number FROM master..spt_values WHERE type = 'P',这是很妙的方法;但这样只有2048个数字,而且语句太长,不够方便。

总之,一个数字辅助表(10万还是100万根据个人需要而定),你值得拥有。


2. 日历表
有用指数:★★★☆☆

《SQL编程风格》一书建议一个企业的数据库应该创建一个日历表:

SQL code
<!-- Code highlighting produced by Actipro CodeHighlighter (freeware) http://www.CodeHighlighter.com/ --> CREATE TABLE Calendar( date datetime NOT NULL PRIMARY KEY CLUSTERED, weeknum int NOT NULL, weekday int NOT NULL, weekday_desc nchar(3) NOT NULL, is_workday bit NOT NULL, is_weekend bit NOT NULL ) GO WITH CTE1 AS( SELECT date = DATEADD(day,n,'19991231') FROM Nums WHERE n <= DATEDIFF(day,'19991231','20201231')), CTE2 AS( SELECT date, weeknum = DATEPART(week,date), weekday = (DATEPART(weekday,date) + @@DATEFIRST - 1) % 7, weekday_desc = DATENAME(weekday,date) FROM CTE1) --INSERT INTO Calendar SELECT date, weeknum, weekday, weekday_desc, is_workday = CASE WHEN weekday IN (0,6) THEN 0 ELSE 1 END, is_weekend = CASE WHEN weekday IN (0,6) THEN 1 ELSE 0 END FROM CTE2


这个表可以很容易根据第1条的数字辅助表生成出来。如果经常需要进行日期处理的话,或许会需要这个表。

还可以在这个表中包含一些企业关心的特殊日期,比如开盘日休市日(股票行业)、特殊纪念日和节日、重要员工的生日,等等。这些日期往往是很难计算的,比如中国的法定节假日(农历问题)。


3. 字符串的拼接(Join)与切分(Split)
有用指数:★★★★★

这个问题非常常见!开发中经常需要把一组值以逗号分隔拼接在一个字符串,或是反过来把一个逗号分隔的字符串切分成一组值
用SS2005对XML的支持可以非常方便地实现这个功能。

单变量的拼接与切分:

SQL code
<!-- Code highlighting produced by Actipro CodeHighlighter (freeware) http://www.CodeHighlighter.com/ --> --将一组查询结果按指定分隔符拼接到一个变量中 DECLARE @Datebases varchar(max) SET @Datebases = STUFF(( SELECT ','+name FROM sys.databases ORDER BY name FOR XML PATH('')),1,1,'') SELECT @Datebases --将传入的一个参数按指定分隔符切分到一个表中 DECLARE @SourceIDs varchar(max) SET @SourceIDs = 'a,bcd,123,+-*/=,x&y,<key>' SELECT v = x.n.value('.','varchar(10)') FROM ( SELECT ValuesXML = CAST('<root>' + REPLACE((SELECT v = @SourceIDs FOR XML PATH('')),',','</v><v>') + '</root>' AS XML) ) t CROSS APPLY t.ValuesXML.nodes('/root/v') x(n)



批量的拼接与切分:

SQL code
<!-- Code highlighting produced by Actipro CodeHighlighter (freeware) http://www.CodeHighlighter.com/ --> --测试数据: CREATE TABLE #ToJoin( TableName varchar(20) NOT NULL, ColumnName varchar(20) NOT NULL, PRIMARY KEY CLUSTERED(TableName,ColumnName)) GO CREATE TABLE #ToSplit( TableName varchar(20) NOT NULL PRIMARY KEY CLUSTERED, ColumnNames varchar(max) NOT NULL) GO INSERT INTO #ToJoin VALUES('tblEmployee','EmployeeCode') INSERT INTO #ToJoin VALUES('tblEmployee','EmployeeName') INSERT INTO #ToJoin VALUES('tblEmployee','HireDate') INSERT INTO #ToJoin VALUES('tblEmployee','JobCode') INSERT INTO #ToJoin VALUES('tblEmployee','ReportToCode') INSERT INTO #ToJoin VALUES('tblJob','JobCode') INSERT INTO #ToJoin VALUES('tblJob','JobTitle') INSERT INTO #ToJoin VALUES('tblJob','JobLevel') INSERT INTO #ToJoin VALUES('tblJob','DepartmentCode') INSERT INTO #ToJoin VALUES('tblDepartment','DepartmentCode') INSERT INTO #ToJoin VALUES('tblDepartment','DepartmentName') GO INSERT INTO #ToSplit VALUES('tblDepartment','DepartmentCode,DepartmentName') INSERT INTO #ToSplit VALUES('tblEmployee','EmployeeCode,EmployeeName,HireDate,JobCode,ReportToCode') INSERT INTO #ToSplit VALUES('tblJob','DepartmentCode,JobCode,JobLevel,JobTitle') GO --拼接(Join),SQL Server 2005的FOR XML扩展可以将一个列表转成一个字串: SELECT t.TableName, ColumnNames = STUFF( (SELECT ',' + c.ColumnName FROM #ToJoin c WHERE c.TableName = t.TableName FOR XML PATH('')), 1,1,'') FROM #ToJoin t GROUP BY t.TableName --切分(Split),使用SQL Server 2005对XQuery的支持: SELECT t.TableName, ColumnName = c.ColumnName.value('.','varchar(20)') FROM ( SELECT TableName, ColumnNamesXML = CAST('<Root>' + REPLACE((SELECT ColumnName = ColumnNames FOR XML PATH('')),',','</ColumnName><ColumnName>') + '</Root>' AS xml) FROM #ToSplit ) t CROSS APPLY t.ColumnNamesXML.nodes('/Root/ColumnName') c(ColumnName)



需要注意的是,倘若分隔符为“;”或者字符串值中包含XML特殊字符(比如&、<、>等等),以上方法可能会无法处理。


4. 树形结构的存储与查询
有用指数:★★★☆☆

数据库设计中常常会遇到需要存储树形结构,比如员工关系表、组织结构表,等等。

SQL code
<!-- Code highlighting produced by Actipro CodeHighlighter (freeware) http://www.CodeHighlighter.com/ --> --测试数据 CREATE TABLE #Employees( EmployeeCode varchar(20) NOT NULL PRIMARY KEY CLUSTERED, ReportToCode varchar(20) NULL) GO INSERT INTO #Employees VALUES('A',NULL) INSERT INTO #Employees VALUES('B','A') INSERT INTO #Employees VALUES('C','A') INSERT INTO #Employees VALUES('D','A') INSERT INTO #Employees VALUES('E','B') INSERT INTO #Employees VALUES('F','B') INSERT INTO #Employees VALUES('G','C') INSERT INTO #Employees VALUES('H','D') INSERT INTO #Employees VALUES('I','D') INSERT INTO #Employees VALUES('J','D') INSERT INTO #Employees VALUES('K','J') INSERT INTO #Employees VALUES('L','J') INSERT INTO #Employees VALUES('M','J') INSERT INTO #Employees VALUES('N','K') GO /* 可能遇到的查询问题: 1. 员工'D'的所有直接下属 2. 员工'D'的所有2级以内的下属(包括直接下属和直接下属的下属) 3. 员工'N'的所有上级(按报告线顺序列出) 4. 员工@EmployeeCode的所有@LevelDown级以内的下属(@EmployeeCode和@LevelDown以变量传入) DECLARE @EmployeeCode varchar(20), @LevelDown int; SET @EmployeeCode = 'D'; SET @LevelDown = 2; 5. 员工@EmployeeCode的所有@LevelUp级以内的上级(@EmployeeCode和@LevelUp以变量传入) DECLARE @EmployeeCode varchar(20), @LevelUp int; SET @EmployeeCode = 'N'; SET @LevelUp = 2; */ --用递归CTE实现员工树形关系表 WITH CTE AS( SELECT EmployeeCode, ReportToCode, ReportToDepth = 0, ReportToPath = CAST('/' + EmployeeCode + '/' AS varchar(200)) FROM #Employees WHERE ReportToCode IS NULL UNION ALL SELECT e.EmployeeCode, e.ReportToCode, ReportToDepth = mgr.ReportToDepth + 1, ReportToPath = CAST(mgr.ReportToPath + e.EmployeeCode + '/' AS varchar(200)) FROM #Employees e INNER JOIN CTE mgr ON e.ReportToCode = mgr.EmployeeCode ) SELECT * FROM CTE ORDER BY ReportToPath




5. IPv4地址的存储与查询
有用指数:★★☆☆☆

IPv4的地址实际上是一个4字节的数据。点分十进制的字符串表示是为了人工读写方便,但范围比较则是原始二进制形式方便。因此需要实现二者的相互转换。

SQL code
<!-- Code highlighting produced by Actipro CodeHighlighter (freeware) http://www.CodeHighlighter.com/ --> --测试数据 CREATE TABLE #IPs( strIP varchar(15) NULL, binIP binary(4) NULL) GO INSERT INTO #IPs VALUES('0.0.0.0',NULL) INSERT INTO #IPs VALUES('255.255.255.255',NULL) INSERT INTO #IPs VALUES('127.0.0.1',NULL) INSERT INTO #IPs VALUES('192.168.43.192',NULL) INSERT INTO #IPs VALUES('192.168.1.101',NULL) INSERT INTO #IPs VALUES('65.54.239.80',NULL) INSERT INTO #IPs VALUES(NULL,0xB92AEAD3) INSERT INTO #IPs VALUES(NULL,0x2D4B2E53) INSERT INTO #IPs VALUES(NULL,0x31031B0B) INSERT INTO #IPs VALUES(NULL,0x7C2D5F2F) INSERT INTO #IPs VALUES(NULL,0x473E5D31) INSERT INTO #IPs VALUES(NULL,0x90D7D66B) GO SELECT strIP,binIP, strIP_new = CAST(CAST(SUBSTRING(binIP,1,1) AS int) AS varchar(3)) + '.' + CAST(CAST(SUBSTRING(binIP,2,1) AS int) AS varchar(3)) + '.' + CAST(CAST(SUBSTRING(binIP,3,1) AS int) AS varchar(3)) + '.' + CAST(CAST(SUBSTRING(binIP,4,1) AS int) AS varchar(3)), binIP_new = CAST(CAST(PARSENAME(strIP,4) AS int) AS binary(1)) + CAST(CAST(PARSENAME(strIP,3) AS int) AS binary(1color: #0
分享到:
评论

相关推荐

    sql数据库死锁查询工具

    在SQL数据库管理中,死锁和阻塞是常见的问题,特别是在多用户环境下,它们可能导致系统性能下降甚至数据丢失。理解并有效地处理这些问题至关重要。本文将深入探讨“sql数据库死锁查询工具”及其在解决数据库死锁和...

    如何连接SQL数据库

    本文将深入探讨如何连接SQL数据库,同时也会提及Access作为参考。 一、SQL数据库连接基础 SQL数据库连接涉及几个关键要素:数据库服务器、数据库名、用户名、密码以及连接驱动。以下是一般的连接步骤: 1. **选择...

    SQL数据库置疑解决-问题集锦

    本文将深入探讨SQL数据库“置疑”问题的原因、分析、预防和解决方法。 首先,“置疑”状态通常表示数据库在尝试打开时遇到了问题,可能由于硬件故障、操作系统错误、文件权限问题或SQL Server服务异常等导致。SQL...

    SQL数据库编辑器

    SQL数据库编辑器是一种工具,专为数据库管理员和开发人员设计,用于更高效、便捷地管理和操作SQL数据库。这种编辑器通常具有丰富的功能,包括查询构建、数据编辑、表设计、索引管理、用户权限控制以及数据库备份和...

    SQL数据库可疑处理

    SQL数据库可疑处理 SQL Server 数据库可疑处理是数据库管理员经常遇到的一个问题。本文将详细介绍解决 SQL Server 数据库可疑的步骤和解决方案。 SQL Server 数据库可疑的原因 SQL Server 数据库可疑可能是由于...

    sql sever 数据库DBA常见问题集锦

    在SQL Server数据库管理中,DBA(Database Administrator)面临着各种挑战和常见问题。这些问题涵盖了性能优化、安全性、备份恢复、故障排查等多个方面。以下是一些关键的知识点,这些知识点不仅基于我过去一年的...

    SQL数据库超时过期问题的解决方案

    SQL 数据库超时过期问题是很多开发者和数据库管理员遇到的一个常见问题。本文将详细介绍 SQL 数据库超时过期问题的解决方案,并对每个问题进行了详细的分析和解决方法。 1. 数据库设计问题造成 SQL 数据库新增数据...

    SQL Server数据库查询自动导出发送工具

    《SQL Server数据库查询自动导出发送工具》 在IT行业中,数据管理与分析是至关重要的环节,而SQL Server作为一款广泛使用的数据库管理系统,为数据处理提供了强大的支持。本篇文章将详细解析一个名为“SQL Server...

    sql数据库常见面试题

    本文将介绍一些SQL数据库的常见面试题,它们不仅覆盖了基础知识点,也包含了一些实际操作中的应用技巧。 首先,了解SQL数据库的基本概念是非常重要的。SQL是用于访问和操作数据库的标准编程语言。它允许用户定义...

    SQL数据库SQL数据库SQL数据库

    SQL数据库是用于存储、管理和检索数据的关系型数据库管理系统(RDBMS)。它的全称是Structured Query Language...通过分析AdventureWorks中的表结构、数据关系和查询示例,我们可以深入学习SQL数据库的管理和使用。

    VBA连接SQL数据库的代码

    ### VBA连接SQL数据库的代码知识点解析 #### 一、VBA与SQL数据库连接的基本原理 在本案例中,我们探讨的...通过以上详细解析,希望可以帮助初学者更好地理解和掌握VBA连接SQL数据库的基础知识及常见问题的解决方法。

    SQL数据库课时笔记整理

    SQL数据库是数据管理和处理的核心工具,它用于存储、查询、更新和管理关系型数据库。以下是对标题和描述中提到的SQL关键概念的详细说明: 1. **索引**:索引是数据库中的一种数据结构,它能显著提高数据检索的速度...

    数据库SQL查询语句练习题.doc

    结构化查询语言(Structured Query Language)简称SQL,结构化查询语言是一种数据库查询和程序设计语言,用于存取数据以及查询、更新和管理关系数据库系统; sql 语句就是对数据库进行操作的一种语言。 常见语句 ...

    Sql Server数据库超时问题的解决方法

    在Sql Server数据库中,超时问题是一个常见的错误,可能会导致数据库的性能下降,影响应用程序的稳定运行。该问题的解决方法可以从多方面入手,包括数据库设计、连接设置、查询语句优化、应用程序连接设置等。 1. ...

    SQL数据库操作资源

    SQL数据库操作资源包含了一系列用于与数据库交互的工具和文档,主要涵盖了SQL语言的基本操作、类库的使用以及函数的应用。这些资源对于理解SQL数据库的工作原理、进行数据管理以及提升编程能力具有极大的帮助。 ...

    ZKtime5.0考勤管理系统sql 数据库建立及连接方法.pdf

    ### ZKtime5.0考勤管理系统SQL数据库建立及连接方法 #### 一、新建数据库 在进行数据库的创建之前,首先要确保您的计算机上已经安装了Microsoft SQL Server 2005或2008版本。打开SQL Server Management Studio,...

    vb.net做的图片存储到SQL数据库

    在VB.NET中,将图片存储到SQL数据库是一个常见的任务,主要涉及到BLOB(Binary Large Object)类型的数据处理。本文将详细介绍如何使用VB.NET实现这一功能,以及涉及的关键知识点。 首先,我们需要了解SQL数据库中...

    SQL Server数据库查询速度慢原因及优化方法

    【赛迪网-IT技术报道】SQL Server数据库查询速度慢的原因有很多,常见的有以下几种:  1、没有索引或者没有用到索引(这是查询慢最常见的问题,是程序设计的缺陷)  2、I/O吞吐量小,形成了瓶颈效应。  3、没有...

    迷你SQL数据库查看器

    迷你SQL数据库查看器是一款专为SQL Server设计的轻量级数据库管理和维护工具。它以其小巧的体积、强大的功能和易用性赢得了用户的喜爱。这款工具主要用于帮助IT专业人员以及数据库管理员快速、便捷地查看和管理SQL ...

    Oracle数据库常见维护问题手册-精典

    ### Oracle数据库常见维护问题手册-精典 #### 数据库基础 **数据库启动方式** Oracle数据库启动通常通过`SQL*Plus`工具来进行。首先确保已经安装并配置了正确的Oracle客户端环境,然后通过以下命令来启动数据库:...

Global site tag (gtag.js) - Google Analytics