第 1 课:创建和查询数据库对象
适用于: SQL Server
Azure SQL 数据库
Azure SQL 托管实例
分析平台系统 (PDW)
注意
开始使用 Transact-SQL 查询学习路径提供了更深入的内容以及实践示例。
本课将介绍如何创建数据库,在数据库中创建表,然后访问表中的数据并对其进行更改。 由于本课是对使用 Transact-SQL 的简介,因此它未使用或说明为这些语句提供的许多选项。
Transact-SQL 语句可以使用下列方法进行编写并提交到 数据库引擎 :
通过使用 SQL Server Management Studio。 本教程假定使用的是 Management Studio,但是也可以使用 Management Studio Express(可以从 Microsoft 下载中心免费下载)。
通过使用 sqlcmd 实用工具。
通过从您创建的应用程序进行连接。
代码以相同方式和相同权限在 数据库引擎 上执行,而不管您如何提交代码语句。
若要在 Transact-SQL 中运行 Management Studio语句,请打开 Management Studio 并连接到 SQL Server 数据库引擎的实例。
先决条件
若要完成本教程,需要 SQL Server Management Studio 以及针对 SQL Server 实例的访问权限。
如果没有 SQL Server 实例,请创建一个。 若要创建一个 SQL Server 实例,请从以下链接选择平台。 如果选择 SQL 身份验证,请使用 SQL Server 登录凭据。
- Windows:下载 SQL Server 2022 开发人员版
- Linux:在容器中下载 SQL Server 2022。
创建数据库
与许多 Transact-SQL 语句一样,CREATE DATABASE 语句具有一个必需参数:数据库的名称。 CREATE DATABASE
还具有许多可选参数,如你希望放置数据库文件的磁盘位置。 当你执行不带可选参数的 CREATE DATABASE
时,SQL Server 使用其中许多参数的默认值。
在查询编辑器窗口中,键入以下代码,但不要执行它:
CREATE DATABASE TestData GO
使用指针选择词语
CREATE DATABASE
,再按 F1。CREATE DATABASE
文章将打开。 你可以使用此方法查找CREATE DATABASE
以及在本教程中使用的其他语句的完整语法。在查询编辑器中,按 F5 以执行语句并创建名为
TestData
的数据库。
创建数据库时, SQL Server 制作 model
数据库的副本,并将该副本重命名为数据库名称。 除非您将初始大小很大的数据库指定为可选参数,否则此操作应该只需要几秒钟。
注意
在单个批处理中提交多条语句时,可以用关键字 GO 分隔各语句。 当批处理只包含一条语句时,GO 是可选的。
创建表
适用于:SQL Server
Azure SQL 数据库
Azure Synapse Analytics
分析平台系统 (PDW)
若要创建表,您必须提供该表的名称以及该表中每个列的名称和数据类型。 指出每个列中是否允许空值,也是一种很好的做法。 若要创建表时,必须具有 CREATE TABLE
权限,以及对包含该表的架构的 ALTER SCHEMA
权限。 db_ddladmin 固定数据库角色具有这些权限。
大多数表有一个主键,主键由表的一列或多列组成。 主键始终是唯一的。 数据库引擎强制实施以下限制:表中的任何主键值都不能重复。
有关数据类型的列表以及每种数据类型的说明链接,请参阅数据类型 (Transact-SQL)。
注意
数据库引擎 可安装为区分大小写或不区分大小写。 如果 数据库引擎 区分大小写进行安装,则对象名必须始终具有相同的大小写。 例如,名为 OrderData 的表与名为 ORDERDATA 的表是不同的表。 如果 数据库引擎 按不区分大小写进行安装,则这两个表名被视为同一个表,而且该名称只能使用一次。
将查询编辑器连接切换到 TestData 数据库
在查询编辑器窗口中,键入以下代码,并执行它以更改与 TestData
数据库的连接。
USE TestData
GO
创建表
在查询编辑器窗口中,键入以下代码,并执行它以创建一个名为 Products
的表。 该表中各列的名称为 ProductID
、 ProductName
、 Price
和 ProductDescription
。 ProductID
列是表的主键。 int
varchar(25)
、 money
和 varchar(max)
都是数据类型。 当插入或更改行时,只有 Price
和 ProductionDescription
列可以不包含数据。 此语句包含称为架构的可选元素 (dbo.
)。 架构是拥有表的数据库对象。 如果您是管理员,则 dbo
是默认架构。 dbo
代表数据库所有者。
CREATE TABLE dbo.Products
(ProductID int PRIMARY KEY NOT NULL,
ProductName varchar(25) NOT NULL,
Price money NULL,
ProductDescription varchar(max) NULL)
GO
插入和更新表中的数据
现在已经创建了 Products
表,可以通过使用 INSERT 语句将数据插入到表中。 插入数据后,将通过使用 UPDATE 语句更改行的内容。 使用 UPDATE 语句的 WHERE 子句,以限制对单个行的更新。 这四条语句会输入以下数据。
ProductID | ProductName | 价格 | ProductDescription |
---|---|---|---|
1 | Clamp | 12.48 | Workbench clamp |
50 | Screwdriver | 3.17 | Flat head |
75 | Tire Bar | Tool for changing tires. | |
3000 | 3 mm Bracket | 0.52 |
基本语法如下:INSERT、表名、列的列表、VALUES,然后是要插入的值的列表。 如果某行的前面有两个连字符,则指示该行为注释,编译器将忽略其文本。 在这种情况下,注释说明允许的语法变体。
将数据插入到表
执行以下语句,将一行插入到在上一个任务中创建的
Products
表中。-- Standard syntax INSERT dbo.Products (ProductID, ProductName, Price, ProductDescription) VALUES (1, 'Clamp', 12.48, 'Workbench clamp') GO
如果插入成功,则继续执行下一步。
如果插入操作失败,则可能是因为
Product
表中已存在具有该产品 ID 的行。 若要继续,请删除表中的所有行并重复上一步。 TRUNCATE TABLE 删除表中的所有行。运行以下命令来删除表中的所有行:
TRUNCATE TABLE TestData.dbo.Products; GO
截断表后,在此步骤中重复
INSERT
命令。以下语句显示如何通过在字段列表(在圆括号中)中和值列表中均切换
ProductID
和ProductName
的位置,更改提供参数的顺序。-- Changing the order of the columns INSERT dbo.Products (ProductName, ProductID, Price, ProductDescription) VALUES ('Screwdriver', 50, 3.17, 'Flat head') GO
以下语句演示,只要值是按正确顺序列出的,列的名称就是可选的。 此语法很常见,但是建议不要使用它,因为其他人可能会难以理解你的代码。
NULL
为Price
列指定,因为还不知道此产品的价格。-- Skipping the column list, but keeping the values in order INSERT dbo.Products VALUES (75, 'Tire Bar', NULL, 'Tool for changing tires.') GO
只要在默认架构中访问和更改表,架构名称就是可选的。 由于
ProductDescription
列允许 Null 值,而且没有提供值,因此可以从语句中完全删除ProductDescription
列的名称和值。-- Dropping the optional dbo and dropping the ProductDescription column INSERT Products (ProductID, ProductName, Price) VALUES (3000, '3 mm Bracket', 0.52) GO
更新 products 表
键入并执行以下 UPDATE
语句,将第二种产品的 ProductName
从 Screwdriver
更改为 Flat Head Screwdriver
。
UPDATE dbo.Products
SET ProductName = 'Flat Head Screwdriver'
WHERE ProductID = 50
GO
从表中读取数据
使用 SELECT 语句可以读取表中的数据。 SELECT 语句是最重要的 Transact-SQL 语句之一,其语法有许多变体。 在本教程中,你将使用五个基础版本。
读取表中的数据
键入并执行以下语句以读取
Products
表中的数据。-- The basic syntax for reading data from a single table SELECT ProductID, ProductName, Price, ProductDescription FROM dbo.Products GO
你可以使用星号 (
*
) 选择表中的所有列。 星号用于临时查询。 在永久代码中,请提供列列表,使语句返回预测列,即使稍后会将新列添加到表中,也是如此。-- Returns all columns in the table -- Does not use the optional schema, dbo SELECT * FROM Products GO
可以省略不希望返回的列。 列会按列出它们的顺序返回。
-- Returns only two of the columns from the table SELECT ProductName, Price FROM dbo.Products GO
使用
WHERE
子句可以限制返回给用户的行。-- Returns only two of the records in the table SELECT ProductID, ProductName, Price, ProductDescription FROM dbo.Products WHERE ProductID < 60 GO
您可以在返回列中的值时使用它们。 以下示例对
Price
列执行数学运算。 除非通过使用AS
关键字提供一个名称,否则以此方式更改的列将没有名称。-- Returns ProductName and the Price including a 7% tax -- Provides the name CustomerPays for the calculated column SELECT ProductName, Price * 1.07 AS CustomerPays FROM dbo.Products GO
SELECT 语句中的有用函数
有关可以在 SELECT 语句中用来处理数据的一些函数的信息,请参阅以下文章:
创建视图和存储过程
视图是存储的 SELECT 语句,而存储过程是以批处理方式执行的一条或多条 Transact-SQL 语句。
视图像表那样进行查询,但不接受参数。 存储过程比视图更复杂。 存储过程可以同时具有输入参数和输出参数,并可以包括控制代码流的语句,如 IF 和 WHILE 语句。 将存储过程用于数据库中的所有重复操作,是一个良好的编程做法。
在此示例中,你使用 CREATE VIEW 创建一个视图,该视图仅选择 Products
表中的两列。 然后,使用 CREATE PROCEDURE 创建一个存储过程,该存储过程接受价格参数,并仅返回成本小于指定参数值的那些产品。
创建视图
执行以下语句创建一个视图,该视图执行 Select 语句,并将产品的名称和价格返回给用户。
CREATE VIEW vw_Names
AS
SELECT ProductName, Price FROM Products;
GO
测试视图
视图的处理方式与表类似。 使用 SELECT
语句访问视图。
SELECT * FROM vw_Names;
GO
创建存储过程
以下语句创建一个名为 pr_Names
的存储过程,接受名为 @VarPrice
、数据类型为 money
的输入参数。 该存储过程打印与输入参数(已从 Products less than
数据类型更改为 money
字符数据类型)串联的语句 varchar(10)
。 然后,该存储过程对视图执行 SELECT
语句,将输入参数作为 WHERE
子句的一部分进行传递。 这将返回价格小于输入参数值的所有产品。
CREATE PROCEDURE pr_Names @VarPrice money
AS
BEGIN
-- The print statement returns text to the user
PRINT 'Products less than ' + CAST(@VarPrice AS varchar(10));
-- A second statement starts here
SELECT ProductName, Price FROM vw_Names
WHERE Price < @VarPrice;
END
GO
测试存储过程
若要测试存储过程,请键入并执行以下语句。 存储过程应该返回在第 1 课中向 Products
表中输入的、其价格小于 10.00
的两个产品的名称。
EXECUTE pr_Names 10.00;
GO
后续步骤
下一篇文章将介绍如何配置对数据库对象的权限。 第 2 课将使用第 1 课中创建的对象。
转到下一篇文章,了解详细信息: