教程:在 Azure SQL 数据库中设计关系数据库

适用于:Azure SQL 数据库

Azure SQL 数据库是 Azure 中的关系数据库即服务 (DBaaS)。 本教程介绍如何执行下列操作:

  • 连接到数据库
  • 使用 T-SQL 命令创建表
  • 使用 BCP 大容量加载数据
  • 使用 T-SQL 命令查询数据

注意

本教程使用 Azure SQL 数据库。 你也可以使用弹性池中的共用数据库或 SQL 托管实例。 若要连接到 SQL 托管实例,请参阅以下 SQL 托管实例快速入门:快速入门:配置 Azure VM 以连接到 Azure SQL 托管实例快速入门:配置从本地到 Azure SQL 托管实例的点到站点连接

先决条件

登录到 Azure 门户

登录 Azure 门户

创建服务器级 IP 防火墙规则

Azure SQL 数据库在服务器级别创建 IP 防火墙。 此防火墙阻止外部应用程序和工具连接到服务器和服务器上的任何数据库,除非防火墙规则允许其 IP 通过防火墙。 若要启用与数据库的外部连接,必须首先为 IP 地址(或 IP 地址范围)添加 IP 防火墙规则。 遵循这些步骤创建服务器级 IP 防火墙规则

重要

通过端口 1433 进行的 Azure SQL 数据库通信。 如果尝试从企业网络内部连接到此服务,则该网络的防火墙可能不允许经端口 1433 的出站流量。 如果是这样,则无法连接到数据库,除非管理员打开端口 1433。

  1. 部署完成后,请从 Azure 门户菜单中选择“SQL 数据库”,或在任何页面上搜索并选择“SQL 数据库”。

  2. 在“SQL 数据库”页上选择“yourDatabase”。 此时会打开数据库的概览页,其中显示了完全限定的服务器名称(例如 contosodatabaseserver01.database.chinacloudapi.cn),并提供了其他配置的选项。

    Azure 门户的数据库概述页的屏幕截图,其中突出显示了服务器名称。

  3. 复制此完全限定的服务器名称,将其用于从 SQL Server Management Studio 连接到服务器和数据库。

  4. 在“设置”下选择“网络” 。 选择“公共访问”选项卡,然后选择“公用网络访问”下的“所选网络”以显示“防火墙规则”部分。

    Azure 门户“网络”页的屏幕截图,其中显示了设置服务器级 IP 防火墙规则的位置。

  5. 在工具栏上选择“添加客户端 IPv4”,将当前的 IP 地址添加到新的 IP 防火墙规则。 IP 防火墙规则可以针对单个 IP 地址或一系列 IP 地址打开端口 1433。

  6. 选择“保存”。 此时会针对当前的 IP 地址创建服务器级 IP 防火墙规则,在服务器上打开端口 1433。

  7. 选择“确定”,然后关闭“防火墙设置”页。

你的 IP 地址现在可以通过 IP 防火墙。 现在可以使用 SQL Server Management Studio 或其他所选工具连接到数据库。 确保使用之前创建的服务器管理员帐户。

重要

默认情况下,所有 Azure 服务都允许通过 SQL 数据库 IP 防火墙进行访问。 在此页上选择“关”可禁止所有 Azure 服务进行访问。

连接到数据库

Azure SQL 数据库位于逻辑 SQL Server 中。 可以使用登录信息连接到逻辑 SQL Server 的 master,然后连接到数据库。 或者,使用包含的用户,可以直接连接到 Azure SQL 数据库。

使用 SQL Server Management Studio 连接到 Azure SQL 数据库。

  1. 打开 SQL Server Management Studio。

  2. 在“连接到服务器”对话框中,输入以下信息。 将其他选项保留为默认值。

    设置 建议值 说明
    服务器类型 数据库引擎 此值是必需的。
    服务器名称 完全限定的 Azure SQL 数据库逻辑服务器名称 例如 your_logical_azure_sql_server.database.chinacloudapi.cn
    身份验证 SQL Server 身份验证 使用 SQL Server 身份验证输入用户名和密码。
    Microsoft Entra 身份验证 若要使用 Microsoft Entra ID 进行连接,对于 Microsoft Entra 服务器管理员,请选择 Microsoft Entra MFA。 有关详细信息,请参阅使用 Azure SQL 配置和管理 Microsoft Entra 身份验证
    登录 服务器管理员帐户 如果使用 SQL Server 身份验证,则为创建服务器时指定的帐户。
    密码 服务器管理员帐户的密码 如果使用 SQL Server 身份验证,则为创建服务器时指定的密码。

    屏幕截图显示了 SQL Server Management Studio (SSMS) 中的“连接到 Azure SQL 数据库逻辑服务器”对话框。

  3. 选择“连接到服务器”对话框中的“选项”。 在“连接到数据库”部分输入 yourDatabase,以连接到此数据库。

    屏幕截图显示了 SQL Server Management Studio (SSMS) 中的“连接到服务器”对话框的“选项”选项卡。

  4. 选择“连接” 。 此时会在 SSMS 中打开“对象资源管理器”窗口。

  5. 在对象资源管理器中展开“数据库”,然后展开 yourDatabase,查看示例数据库中的对象 。

    SQL Server Management Studio (SSMS) 的屏幕截图,其中显示了对象资源管理器中的数据库对象。

  6. 在“对象资源管理器”中,右键单击 yourDatabase,并选择“新建查询”。 此时会打开一个空白查询窗口,该窗口连接到数据库。

在数据库中创建表

使用 Transact-SQL 创建 4 个表,这些表是大专院校的学生管理系统的模型:

  • Person
  • Course
  • Student
  • Credit

以下关系图显示了这些表的相互关系。 其中一些表引用其他表中的列。 例如,Student 表引用 Person 表的 PersonId 列。 请研究此关系图,了解本教程中各种表的相互关系。 若要深入了解如何创建有效的规范化数据库表,请参阅设计规范化数据库。 有关如何选择数据类型的信息,请参阅 Data types(数据类型)。 默认情况下,表在默认 dbo 架构中创建,这意味着表的两部分名称将为 dbo.Person

注意

还可以使用 SQL Server Management Studio 中的表设计器来创建和设计表。

SQL Server Management Studio (SSMS) 中表设计器的屏幕截图,其中显示了表关系。

  1. 在查询窗口中,执行以下 T-SQL 查询以在数据库中创建四个表:

    -- Create Person table
    CREATE TABLE Person
    (
        PersonId INT IDENTITY PRIMARY KEY,
        FirstName NVARCHAR(128) NOT NULL,
        MiddelInitial NVARCHAR(10),
        LastName NVARCHAR(128) NOT NULL,
        DateOfBirth DATE NOT NULL
    )
    
    -- Create Student table
    CREATE TABLE Student
    (
        StudentId INT IDENTITY PRIMARY KEY,
        PersonId INT REFERENCES Person (PersonId),
        Email NVARCHAR(256)
    )
    
    -- Create Course table
    CREATE TABLE Course
    (
        CourseId INT IDENTITY PRIMARY KEY,
        Name NVARCHAR(50) NOT NULL,
        Teacher NVARCHAR(256) NOT NULL
    )
    
    -- Create Credit table
    CREATE TABLE Credit
    (
        StudentId INT REFERENCES Student (StudentId),
        CourseId INT REFERENCES Course (CourseId),
        Grade DECIMAL(5,2) CHECK (Grade <= 100.00),
        Attempt TINYINT,
        CONSTRAINT [UQ_studentgrades] UNIQUE CLUSTERED
        (
            StudentId, CourseId, Grade, Attempt
        )
    )
    

    SSMS 的屏幕截图,其中显示了创建表脚本已成功执行。

  2. 展开“对象资源管理器”中 yourDatabase 下的“”节点以查看创建的新表。

将数据加载到表

  1. 在“下载”文件夹中创建名为 sampleData 的文件夹,为数据库存储示例数据。 例如 c:\Users\<your user name>\Downloads

  2. 右键单击以下链接并将它们保存到 sampleData 文件夹。

  3. 打开新的 Windows 命令提示符窗口并导航到 sampleData 文件夹。 例如 cd c:\Users\<your user name>\Downloads

  4. 执行以下 bcp 命令,将示例数据插入表,使用环境值替换“服务器”、“数据库”、“用户”和“密码”的值。

    bcp Course in SampleCourseData -S <server>.database.chinacloudapi.cn -d <database> -U <user> -P <password> -q -c -t ","
    bcp Person in SamplePersonData -S <server>.database.chinacloudapi.cn -d <database> -U <user> -P <password> -q -c -t ","
    bcp Student in SampleStudentData -S <server>.database.chinacloudapi.cn -d <database> -U <user> -P <password> -q -c -t ","
    bcp Credit in SampleCreditData -S <server>.database.chinacloudapi.cn -d <database> -U <user> -P <password> -q -c -t ","
    

现已将示例数据加载到了之前创建的表中。

查询数据

执行以下 T-SQL 查询,从数据库表中检索信息。

第一个查询将联接所有 4 个表,以查找由“Dominick Pope”授课的分数高于 75% 的学生。 在查询窗口中执行以下 T-SQL 查询:

-- Find the students taught by Dominick Pope who have a grade higher than 75%
SELECT  person.FirstName, person.LastName, course.Name, credit.Grade
FROM  Person AS person
    INNER JOIN Student AS student ON person.PersonId = student.PersonId
    INNER JOIN Credit AS credit ON student.StudentId = credit.StudentId
    INNER JOIN Course AS course ON credit.CourseId = course.courseId
WHERE course.Teacher = 'Dominick Pope'
    AND Grade > 75;

此查询将联接所有 4 个表,以查找“Noe Coleman”注册过的课程。 在查询窗口中执行以下 T-SQL 查询:

-- Find all the courses in which Noe Coleman has ever enrolled
SELECT  course.Name, course.Teacher, credit.Grade
FROM  Course AS course
    INNER JOIN Credit AS credit ON credit.CourseId = course.CourseId
    INNER JOIN Student AS student ON student.StudentId = credit.StudentId
    INNER JOIN Person AS person ON person.PersonId = student.PersonId
WHERE person.FirstName = 'Noe'
    AND person.LastName = 'Coleman';

提示

若要了解有关编写 SQL 查询的更多信息,请访问教程:编写 Transact-SQL 语句

提示

准备好开始开发 .NET 应用程序了吗? 此免费 Learn 模块介绍如何开发和配置可查询 Azure SQL 数据库的 ASP.NET 应用程序,包括创建简单数据库。

下一步

转向下一教程,了解如何使用 Visual Studio 和 C# 设计数据库。