SQL SERVER常用语句

1.以逗号分割参数

SELECT
    departmentid,
    code = (
        stuff(
            ( SELECT ',' + CONVERT ( VARCHAR, workcode ) FROM HrmResource WHERE departmentid = A.departmentid FOR XML PATH ( '' ) ),1,1,''
        )
    )
FROM
    HrmResource A
WHERE
    A.departmentid = 1406
GROUP BY
    departmentid

结果如下 :

2.分割字段查询

SELECT
    f.requestid,
    stuff(
        (
        SELECT ',' + workcode FROM HrmResource e
        WHERE CAST ( e.id AS CHAR ) IN ( SELECT * FROM dbo.[Get_splitstr] ( '379,379,387,636,380,748', ',' ) ) FOR xml path ( '' )),1,1,''
    ) Reasons
FROM
    workflow_requestbase f
WHERE
    f.requestid = 831
GROUP BY
    requestid

查询结果:

注意Get_splitstr 是用的一个存储过程

-- 列如:select *  from [dbo].[Get_splitstr] ('1,2,3,4',',')
ALTER FUNCTION [dbo].[Get_splitstr] 
	(
		@SourceSql VARCHAR ( 8000 ), -- 需要分割的字符串
		@StrSeprate VARCHAR ( 100 ) -- 分隔符
	) 
returns @temp TABLE ( val VARCHAR ( 100 ) ) AS BEGIN
	DECLARE
		@ch AS VARCHAR ( 100 ) 
		SET @SourceSql = @SourceSql + @StrSeprate
	WHILE
			( @SourceSql <> '' ) BEGIN
				SET @ch = LEFT ( @SourceSql, charindex( ',',@SourceSql, 1 ) - 1 ) INSERT @temp
			VALUES
				( @ch ) 
				SET @SourceSql = stuff( @SourceSql, 1, charindex( ',',@SourceSql, 1 ), '' ) 
		END RETURN 
END

3.存储过程实现满足条件的存入临时表输出

游标循环 把满足条件存入临时表

ALTER PROCEDURE [dbo].[GetSex]
AS
BEGIN
 
	-- 定义错误返回信息
	declare @error int 
	
	--创建临时表#Tmp
create table #Tmp 
(
    ID int IDENTITY (1,1) not null, --创建列ID,并且每次新增一条记录就会加1
		name_    varchar (200),
		sex_     int
    primary key (ID)      --定义ID为临时表#Tmp的主键      
);
	
	
	-- 定义接收参数
  declare @User_Name varchar(50)
  declare @Sex varchar(50)

  set @error=0
	
	 --定义游标
  declare demo_cursor cursor
	for (select lastname,sex from HrmResource)
	
	 --打开游标--
  open demo_cursor
 
	--开始循环游标变量--
  fetch next from demo_cursor into @User_Name,@Sex
	
	while @@FETCH_STATUS = 0  --返回被 FETCH语句执行的最后游标的状态--
	
	begin       
			
			-- 判断条件
			IF(@Sex = 0)
-- 				print @User_Name+'____'+@Sex
				insert into #Tmp(name_,sex_) VALUES (@User_Name,@Sex)


      set @error = @error + @@ERROR  --记录每次运行sql后是否正确,0正确

      fetch next from demo_cursor into @User_Name,@Sex  --转到下一个游标,没有会死循环

  end  

  close demo_cursor --关闭游标

  deallocate demo_cursor  --释放游标
	
	SELECT * FROM #Tmp;
 
END

4.存储过程封装分页查询

-- 分页查询
-- 条件查询案例: EXEC pageSearchList '20','1','uf_Account','id = 254147 AND name = ''安徽省万援医药有限公司'' '
ALTER PROC [dbo].[pageSearchList]
    @pageSize VARCHAR(50), -- 每页数量
    @pageNumber VARCHAR(20), -- 当前页码
    @tableName VARCHAR ( 50 ),  -- 表名
    @term VARCHAR ( 50 ) = NULL -- 条件
    AS
BEGIN
    DECLARE  @sqlfilter VARCHAR ( MAX ),
             @offset VARCHAR(20); --SQL语句起始索引
        
        SET @offset = convert(VARCHAR(20),((convert(int,@pageNumber) - 1) * convert(int,@pageSize)) + 1)  
        
        
        SET @sqlfilter = 'SELECT TOP ' + @pageSize + ' * FROM ' +  @tableName +
        
        ' WHERE 1 = 1 AND id >= ( SELECT MAX ( id ) FROM ( SELECT TOP ' + @offset + ' id FROM ' + @tableName + ' WHERE 1 = 1 ';
        
        -- 判断是否有条件
        IF(isnull(@term,'') <> '')
            SET @sqlfilter +=     @term + ' ORDER BY id ASC ) temp_max_ids ) ';
        ELSE
            SET @sqlfilter += ' ORDER BY id ASC ) temp_max_ids ) ';
        
        
        IF(isnull(@term,'') <> '')
            SET @sqlfilter +=     @term + ' ORDER BY id';
        ELSE
            SET @sqlfilter += ' ORDER BY id';
    
     -- print @sqlfilter
        
    
    EXEC ( @sqlfilter )
END

5.分割字符串 返回指定的参数

-- 列如:SELECT [dbo].[Get_stringBySplit]('1,2,3,4',',',1)
ALTER FUNCTION [dbo].[Get_stringBySplit] ( @List nvarchar ( 2000 ), --要分隔的字符串
	@SplitOn nvarchar ( 5 ), --分隔符
	@num1 INT -- 返回第几个参数
	) RETURNS VARCHAR ( 50 ) AS BEGIN
	DECLARE
		@i INT,
		@j INT,
		@p INT,
		@num INT,
		@aa VARCHAR ( 200 ) 
		SET @i = 0 
		SET @j = len( @SplitOn ) 
		SET @p = 0
	WHILE
			LEN( @List ) > 0 BEGIN
				
				SET @p = CHARINDEX( @SplitOn,@List )
			IF
				@p > 0 BEGIN
					
					SET @aa = SUBSTRING ( @List, 1,@p - 1 ) 
					SET @List = SUBSTRING ( @List,@p + @j, LEN( @List ) ) 
				END ELSE BEGIN
					
					SET @aa = @List 
					SET @List = '' 
				END 
					SET @i = @i + 1
				IF
					@i =@num1 BEGIN
					BREAK 
				END ELSE 
					SET @aa = '' 
				END RETURN @aa 
END

6.常用语句

-- 获取当前年
SELECT DateName( YEAR, GetDate( ) ) AS year
-- 获取当前月
SELECT DateName( month, GetDate( ) ) AS month
-- 获取当前日
SELECT DateName( day, GetDate( ) ) AS month
-- 获取上一个月
SELECT DATEPART( m, DATEADD( m, -1, GetDate( ) ) ) 

---替换字符串中的@字符
select replace('maomao365.com@blog.com',char(64),'') ---使用空格替换"@"字符
---替换字符串中tab
select replace('maomao365.com@blog.com',char(9),'') ---使用空格替换"tab"字符
---替换字符串中的回车键
select replace('maomao365.com@blog.com',char(13),'') ---使用空格替换"enter"字符


/为表加唯一索引
create unique index 索引名 on 表名(列名);
//创建覆盖索引
create index 索引名 on 表名(列名1,列名2);
create index 索引名 on 表名 (ID) include(Name);

<think>首先,用户的问题是关于SQL Server常用语句大全的学习指南。我需要根据系统指令来构建回答: 1. **系统级指令**: - 行内数学表达式用 `$...$`,但这里涉及SQL,可能没有数学表达式,所以忽略。 - 独立公式用 `$$...$$`,但SQL没有公式,所以可能不需要。 - LaTeX语法正确:确保任何数学格式正确,但这里不适用。 - 使用中文回答:整个回答用中文。 - 生成相关问题:在回答末尾生成相关问题。 - 添加引用标识:在引用段落末尾添加 `[^1]` 等。 2. **用户可见层**: - 回答结构清晰,逐步解决问题。 - 保证真实可靠:基于提供的引用内容,特别是引用[2]和[3],它们提供了SQL Server的学习指南和常用函数。 提供的引用: - 引用[1]:微软官方SQL Server文档是最权威的。 - 引用[2]:SQL Server全面学习指南,包括安装、配置、数据库管理、T-SQL等。 - 引用[3]:SQL Server常用函数使用指南,包括函数示例和最佳实践。 用户意图是了解SQL Server常用语句,可能是为数据库开发或管理做准备。所以,我需要创建一个关于SQL Server常用SQL语句的学习指南。 **回答结构**: - 开头:介绍SQL Server常用语句的重要性。 - 主体:分步骤介绍常用语句类别,例如: 1. 数据定义语言 (DDL):CREATE, ALTER, DROP 2. 数据操作语言 (DML):SELECT, INSERT, UPDATE, DELETE 3. 数据控制语言 (DCL):GRANT, REVOKE 4. 事务控制:BEGIN TRANSACTION, COMMIT, ROLLBACK 5. 常用函数:如引用[3]中提到的CASE, IIF, COALESCE等。 6. 其他:JOIN, GROUP BY, ORDER BY等。 - 每个部分提供基本语法和简单示例。 - 确保基于引用内容,特别是引用[2]和[3]。 - 在相关地方添加引用标识。 - 结尾:鼓励查阅官方文档,并生成相关问题。 **生成相关问题**:在末尾添加相关问题,如关于优化、应用场景等。 **添加引用标识**: - 例如,当提到官方文档时,添加 `[^1]`。 - 当引用学习指南或函数指南时,添加 `[^2]` 或 `[^3]`。 完整回答大纲: 1. **引言**:介绍SQL Server常用语句的重要性。 2. **DDL语句**:CREATE TABLE, ALTER TABLE, DROP TABLE。 3. **DML语句**:SELECT, INSERT, UPDATE, DELETE。 4. **查询语句**:JOIN, WHERE, GROUP BY, HAVING, ORDER BY。 5. **函数和表达式**:基于引用[3],介绍常用函数。 6. **事务和并发控制**:BEGIN TRAN, COMMIT, ROLLBACK。 7. **安全语句**:GRANT, REVOKE。 8. **最佳实践**:引用[3]中的最佳实践。 9. **结论**:推荐官方文档。 10. **相关问题**:生成3-5个相关问题。 确保回答真实可靠:使用标准SQL Server语法,避免错误。</think>### SQL Server 常用语句大全学习指南 SQL Server 是一个强大的关系型数据库管理系统,广泛应用于企业级数据管理、开发和数据分析。掌握常用 SQL 语句数据库管理员、开发人员和数据分析师的基础技能。本指南基于权威资料(如微软官方文档[^1]和全面学习资源[^2]),系统地介绍 SQL Server常用语句类别,包括语法、示例和最佳实践。指南结构清晰,从基础到进阶,帮助您逐步构建知识体系。学习过程中,建议结合官方文档实践[^1],确保理解透彻。 #### 1. **数据定义语言 (DDL)** DDL 语句用于定义和管理数据库对象(如表、索引)。常用语句包括: - **CREATE TABLE**:创建新表。 ```sql CREATE TABLE Employees ( EmployeeID INT PRIMARY KEY, FirstName NVARCHAR(50), LastName NVARCHAR(50), HireDate DATE ); ``` - **ALTER TABLE**:修改表结构(如添加列)。 ```sql ALTER TABLE Employees ADD DepartmentID INT; ``` - **DROP TABLE**:删除表。 ```sql DROP TABLE Employees; ``` **最佳实践**:在修改生产环境表结构前,先在测试环境验证[^2]。 #### 2. **数据操作语言 (DML)** DML 语句用于操作表中的数据。核心语句包括: - **SELECT**:查询数据。支持过滤、排序和聚合。 ```sql SELECT FirstName, LastName FROM Employees WHERE HireDate > '2020-01-01' ORDER BY LastName; ``` - **INSERT**:插入新记录。 ```sql INSERT INTO Employees (EmployeeID, FirstName, LastName) VALUES (1, 'John', 'Doe'); ``` - **UPDATE**:更新现有记录。 ```sql UPDATE Employees SET DepartmentID = 2 WHERE EmployeeID = 1; ``` - **DELETE**:删除记录。 ```sql DELETE FROM Employees WHERE EmployeeID = 1; ``` **注意**:使用 WHERE 子句避免误删数据;事务控制可确保数据一致性[^2]。 #### 3. **查询增强语句** 这些语句优化复杂查询,常用于数据分析。 - **JOIN**:连接多表数据(如 INNER JOIN、LEFT JOIN)。 ```sql SELECT e.FirstName, d.DepartmentName FROM Employees e INNER JOIN Departments d ON e.DepartmentID = d.DepartmentID; ``` - **GROUP BY 和 HAVING**:分组聚合数据。 ```sql SELECT DepartmentID, COUNT(*) AS EmployeeCount FROM Employees GROUP BY DepartmentID HAVING COUNT(*) > 5; ``` - **ORDER BY**:排序结果集。 ```sql SELECT * FROM Employees ORDER BY HireDate DESC; ``` **性能提示**:WHERE 条件中避免使用函数,以利用索引优化查询[^3]。 #### 4. **常用函数和表达式** SQL Server 提供内置函数简化数据处理。基于引用[^3],关键函数包括: - **条件判断**:使用 CASE 或 IIF 处理逻辑分支。 ```sql SELECT EmployeeID, CASE WHEN HireDate < '2010-01-01' THEN 'Veteran' ELSE 'New' END AS Status FROM Employees; ``` - **空值处理**:COALESCE 或 ISNULL 替代 NULL 值。 ```sql SELECT COALESCE(MiddleName, 'N/A') AS MiddleName FROM Employees; ``` - **字符串函数**:CONCAT、SUBSTRING 等。 ```sql SELECT CONCAT(FirstName, ' ', LastName) AS FullName FROM Employees; ``` **最佳实践**:优先使用内置函数;空值处理用 ISNULL()/COALESCE() 提前处理;注意函数嵌套限制(最多10级)[^3]。 #### 5. **事务和并发控制** 确保数据操作的原子性和一致性。 - **BEGIN TRANSACTION**:启动事务。 - **COMMIT**:提交更改。 - **ROLLBACK**:回滚错误操作。 ```sql BEGIN TRANSACTION; UPDATE Accounts SET Balance = Balance - 100 WHERE AccountID = 1; UPDATE Accounts SET Balance = Balance + 100 WHERE AccountID = 2; -- 如果无误 COMMIT; -- 如果出错 ROLLBACK; ``` **应用场景**:适用于银行转账等需原子操作的业务[^2]。 #### 6. **数据控制语言 (DCL)** 管理数据库访问权限。 - **GRANT**:授予权限。 ```sql GRANT SELECT, INSERT ON Employees TO User1; ``` - **REVOKE**:撤销权限。 ```sql REVOKE INSERT ON Employees FROM User1; ``` **安全提示**:使用最小权限原则,防止未授权访问[^1]。 #### 7. **最佳实践总结** - **性能优化**:避免在 WHERE 子句中使用函数;利用索引加速查询[^3]。 - **错误处理**:使用 TRY...CATCH 块捕获异常。 ```sql BEGIN TRY -- 可能出错的代码 END TRY BEGIN CATCH SELECT ERROR_MESSAGE(); END CATCH ``` - **学习资源**:微软官方文档是最权威的参考,覆盖所有语法细节[^1]。初学时可从简单查询入手,逐步扩展到复杂场景。实践时,使用 SQL Server Management Studio (SSMS) 工具执行语句并查看结果。 通过本指南,您能快速掌握 SQL Server 的核心语句。但实际应用中,需结合具体业务需求调整。建议定期查阅官方文档[^1]和进阶教程[^2],以深化理解。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值