SQL Server - T-SQL
本文参考微软官方提供的sql文档:https://docs.microsoft.com/zh-cn/sql/t-sql/tutorial-writing-transact-sql-statements?view=sql-server-ver15
- 学习如何创建数据库、在数据库中创建表、将数据插入到表中、更新数据、读取数据、删除数据,然后删除表。
- 创建视图和存储过程,并为数据库和数据配置用户。
一、创建和查询数据库对象
创建数据库
CREATE DATABASE
CREATE DATABASE TestData
将查询编辑器连接切换到 TestData 数据库
USE TestData
创建表
CREATE TABLE
二、插入和更新表中的数据
(一)将数据插入到表
INSERT VALUE
4种插入数据的方式:
1.基本语法:INSERT、表名、列的列表、VALUES、要插入的值的列表。
2.在字段列表中和值列表中均切换 ProductID 和 ProductName 的位置,更改提供参数的顺序,也可插入数据:
3.(建议不要使用此方法)只要值是按正确顺序列出的,列的名称就是可选的:
4.只要在默认架构中访问和更改表,架构名称就是可选的。由于 ProductDescription 列允许 Null 值,而且没有提供值,因此可以从语句中完全删除 ProductDescription 列的名称和值:
(二)更新 products 表
UPDATE SET WHERE
三、从表中读取数据
SELECT FROM
5种读取数据的方式:
1.基本语法:SELECT、查询列的列表、FROM、表名:
2.也可以使用星号 (*) 选择表中的所有列。星号用于临时查询,在永久代码中,请提供列列表,使语句返回预测列,即使稍后会将新列添加到表中,也是如此:
3.可以省略不希望返回的列。 列将按列出它们的顺序返回:
4.使用 WHERE 子句可以限制返回给用户的行:
5.对 Price 列执行数学运算:(除非通过使用 AS 关键字提供一个名称,否则以此方式更改的列将没有名称,且为临时列)
四、创建视图和存储过程
视图是存储的 SELECT 语句,而存储过程是以批处理方式执行的一条或多条 Transact-SQL 语句。
视图像表那样进行查询,但不接受参数;存储过程比视图更复杂。存储过程可以同时具有输入参数和输出参数,并可以包括控制代码流的语句,如 IF 和 WHILE 语句。
将存储过程用于数据库中的所有重复操作,是一个良好的编程做法。
- 使用 CREATE VIEW 创建一个视图,该视图仅选择 Products 表中的两列。
- 使用 CREATE PROCEDURE 创建一个存储过程,该存储过程接受价格参数,并仅返回价格小于指定参数值的那些产品。
(一)视图
1.创建视图
2.测试视图
(二)存储过程
微软官方文档中关于存储过程的介绍略少,此处借鉴该博主的文章:https://blog.csdn.net/tojohnonly/article/details/70738629
1.存储过程的概念
存储过程 (Stored Procedure) 是在大型数据库系统中 , 一组为了完成特定功能的 SQL 语句集 , 存储在数据库中 , 经过第一次编译后再次调用不需要再次编译 , 用户通过指定存储过程的名字并给出参数 (如果该存储过程带有参数) 来执行它 , 存储过程是数据库中的一个重要对象 ; 存储过程中可以包含 逻辑控制语句 和 数据操纵语句 , 它可以接受参数 , 输出参数 , 返回单个或多个结果集以及返回值 ;
2.存储过程的优缺点
优点 :
(1)由于应用程序随着时间推移会不断更改 , 增删功能 , SQL 语句会变得更复杂 , 存储过程为封装此类代码提供了一个替换位置 ;
(2)由于存储过程在创建时即在数据库服务器上进行了编译并存储在数据库中 , 所以存储过程运行要比单个的 SQL 语句块要快 ;
(3)由于在调用时只需用提供存储过程名和必要的参数信息 , 所以在一定程度上也可以减少网络流量 , 简单网络负担 ;
(4)可维护性高 , 更新存储过程通常比更改 , 测试以及重新部署程序集需要较少的时间和精力 ;
(5)代码精简一致 , 一个存储过程可以用于应用程序代码的不同位置 ;
(6)增强安全性 :
- 通过向用户授予对存储过程 (而不是基于表) 的访问权限 , 它们可以提供对特定数据的访问 ;
- 提高代码安全 , 防止 SQL注入 (但未彻底解决 , 例如将数据操作语言 DML 附加到输入参数) ;
- SQLParameter 类指定存储过程参数的数据类型 , 作为深层次防御性策略的一部分 , 可以验证用户提供的值类型 (但也不是万无一失 , 还是应该传递至数据库前得到附加验证) ;
缺点 :
(1)如果更改范围大到需要对输入存储过程的参数进行更改 , 或者要更改由其返回的数据 , 则仍需要更新程序集中的代码以添加参数 , 等等 ;
(2)可移植性差 , 由于存储过程将应用程序绑定到 Server , 因此使用存储过程封装业务逻辑将限制应用程序的可移植性 ; 如果应用程序的可移植性在您的环境中非常重要 , 则将业务逻辑封装在不特定于 RDBMS 的中间层中可能是一个更佳的选择 ;
3.编写存储过程
CREATE PROCEDURE
创建一个名为 pr_Names的存储过程,接受名为 @VarPrice 、数据类型为 money的输入参数。 该存储过程打印与输入参数(已从 Products less than 数据类型更改为 money 字符数据类型)串联的语句 varchar(10) 。 然后,该存储过程对视图执行 SELECT 语句,将输入参数作为 WHERE 子句的一部分进行传递。 这将返回价格小于输入参数值的所有产品:
4.测试存储过程
存储过程返回向 Products 表中输入的、其价格小于 10.00的两个产品的名称: