SQL Server數據庫學習總結及T-SQL語法使用實戰

聲明

你好!很高興你看到這篇博客,我寫這篇博客的目的有兩個:
1.總結有關T-SQl的實戰效果
2.總結SQL Server數據庫使用過程中給的技巧
希望朋友你有什麼好的意見可以留言,謝謝

名詞解釋

  • 邏輯名稱:邏輯名稱就是給用戶看的名稱,在數據庫管理工具中顯示的名稱,即創建數據庫中 create database 邏輯名稱。
  • 物理名稱:物理名稱即存儲在系統文件夾中的名字,在數據庫管理工具中右鍵數據庫,屬性,文件即可查看。
  • ps: 邏輯名稱和物理名稱在不同的書和系統中的名字有些不同,數據庫管理工具中可能將邏輯名稱設爲數據庫文件創建時name後的名稱。無傷大雅。

SQL Server數據庫

Sql Server數據庫是我們公司最常用的數據庫之一,那麼關於數據庫的基本內容講解,我在這裏就不重複了,想要了解的可以簡單看一下sql server百科.
關於學習sql server的優質學習資源我這裏收集了一下,下載鏈接

安裝sql server

可到官網下載最新版本的sql server,安裝教程可以到知乎或者百度查找。
若安裝不成功或者有好的安裝教程可以留言。
ps:學習資料中的SQL SERVER學習手冊,有介紹安裝的詳細步驟。

數據庫中的三種完整性

1.域完整性
對錶中字段屬性的約束,通常指數據的有效性,它包括字段的值域、字段的類型及字段的有效值值等,域完整性可以確保不會輸入無效的值。
2.實體完整性
實體完整性就是:主鍵的約束。
即:關係中的主屬性值不能爲null且不能有相同的值。
3.參照完整性
外鍵約束,關係中的外鍵必須是另一個關係的主鍵有效值,或者爲null.參照完整性維護表間數據的有效性,完整性,通常通過建立外部鍵聯繫另一表的主鍵實現,還可以用觸發器來維護參照完整性。

SQL Server數據庫基本操作

T-SQL語言和sql語言是差不多的,唯一的不同是改變了一些語法書寫或者規範,只要你學過sql,那麼學習t-sql就是一樣的了,相差無幾。
ps: t-sql語言不區分大小寫

創建數據庫

create database  database_name[on [primary][()]]
在這裏插入圖片描述
以上截圖來自《sql server完全學習手冊》,[ ]內的數據可以不寫。
在該語法中,on用來創建數據文件,加上primary代表是主數據文件。
filegroup關鍵字用來創建次文件組,其中還可以創建次數據文件。
log on 觀健字用來創建事務日誌文件。name爲所創建文件的文件名稱。
filename 指出了文件的存儲路徑。size定義初始化大小,maxsize定義文件的最大容量,filegrowth指定了文件增長值。
在這裏插入圖片描述

指定多個數據庫文件創建數據庫

在創建數據庫時,可以爲數據庫指定多個數據文件(一主多輔)
例如:創建【學生成績管理系統】數據庫,並指定多個數據庫文件。
在這裏插入圖片描述

爲什麼sql server一個數據庫有多個數據文件

SQL Server中一個數據庫可以對應多個物理文件,其中有一個的主數據庫文件,擴展名爲MDF,其他爲次數據庫文件,擴展名爲NDF。可以將不同的文件存放在不同的驅動器上,可以提高數據訪問速度。

指定多個文件組的數據庫

文件組時分配和管理數據文件的集合,是根據數據文件而創建的。通過創建文件組,可以將不同的數據文件存儲在不同的文件組中,這樣不僅可以優化數據存儲還可以提高數據的I/O讀寫性能。、
使用過程中需要注意以下幾點:

  • 只有數據文件具有文件組,日誌文件沒有文件組
  • 主數據文件一定存在在主文件組中
  • 與系統相關的數據文件一定在主文件組中
  • 一個數據文件只能存放在一個文件組中

創建【學生成績管理系統】數據庫,併爲該數據庫指定兩個文件組
在這裏插入圖片描述
在這裏插入圖片描述
在上述語句中,創建了兩個文件組,即:DBGROUP1 與 DBGROUP2。其中,DBGROUP1文件組中學生成績管理系統_GROUP1和學生成績管理系統_GROUP2兩個數據文件。DBGROUP2文件組中學生成績管理系統_GROUP3和學生成績管理系統_GROUP4兩個數據文件。

說明
目前用到文件組的情形是,在創建數據庫表的時候用關鍵字ON進行分組。

修改數據庫

1. 採用alter關鍵字
alter database database_name modify name = newdatabase_name
例如:把“學生成績管理系統” 改爲 “Student_result”
alter database “學生管理成績系統” modify name = “Student_result”
說明:alter修改的是數據庫的邏輯名稱,對物理名稱無影響。
2. 使用系統存儲過程 sp
EXEP sp_renamedb ‘學生成績管理系統’ ‘Student_result’

擴大和收縮數據庫文件

擴大和收縮數據庫文件目前還沒有找到相關語句,解決方案是在數據庫管理系統中操作即可。

添加輔助數據庫文件

使用add file 語句
修改“學生成績管理系統”,增加一個新的次要文件,大小爲5M
alter database 學生成績管理系統
add file
(
name = “學生成績管理系統_data1”,
filename=‘d:\sql server\database\學生成績管理系統_data1.mdf’,
size=5M,
maxsize=15M,
filegrowth=15%
)

刪除數據庫

drop database database_name […n]
例如,刪除【學生成績管理系統】數據庫,
drop database 學生成績管理系統

查看數據庫狀態

採用DATABASEPROPERTYEX(database_name,property)函數
此函數一次只能返回一個選項的信息。
例如:查看【學生成績管理系統】數據庫的狀態
use 學生成績管理系統
go
select DATABASEPROPERTYEX(‘學生成績管理系統’,‘status’)
as ‘當前數據庫狀態’

DATABASEPROPERTYEX函數參數說明

DATABASEPROPERTYEX ( database , property )
參數說明:

參數 說明
database 當前鏈接的數據庫名稱
property 說明
Collation 排序規則
ComparisonStyle 排列樣式
Edition 數據庫版本信息(標準版還是企業版)
IsAnsiNullDefault 數據庫遵循IOS規則,允許值爲null
IsAnsiNullsEnabled 所有與null的比較取值爲未知
IsAnsiPaddingEnabled 在比較或插入前,字符串將被填充到相同長度
IsAnsiWarningsEnabled 發生標準錯誤條件時,SQL Server 會發出錯誤消息或警告消息
IsArithmeticAbortEnable 如果執行查詢時發生溢出或被零除錯誤,則將結束查詢
IsAutoClose 在最後一個用戶退出後,數據庫完全關閉並釋放資源
IsAutoCreateStatistics 查詢優化器根據需要創建單列統計信息以提高查詢性能
IsAutoCreateStatisticsIncremental 條件允許時,自動創建的單列統計信息遞增
IsAutoShrink 可以定期自動收縮數據庫文件
IsAutoUpdateStatistics 自動更新統計信息
IsClone 數據庫是使用 DBCC CLONEDATABASE 創建的用戶數據庫的僅限架構和僅限統計數據
IsCloseCursorsOnCommitEnabled 提交事務後,會關閉所有打開的遊標
IsFulltextEnabled 支持對數據庫進行全文和語義索引
IsInStandBy 數據庫以只讀方式聯機,並允許還原日誌。
IsLocalCursorsDefault 遊標聲明默認爲 LOCAL
IsMemoryOptimizedElevateToSnapshotEnabled 在會話設置 TRANSACTION ISOLATION LEVEL 設置爲 READ COMMITTED、READ UNCOMMITTED 或較低的隔離級別時,使用 SNAPSHOT 隔離訪問內存優化表。
IsMergePublished 如果安裝了複製,則 SQL Server 支持發佈數據庫表供合併複製使用
IsNullConcat Null 串聯操作數產生 NULL
IsNumericRoundAbortEnabled 表達式中缺少精度時將產生錯誤
IsParameterizationForced PARAMETERIZATION 數據庫 SET 選項爲 FORCED
IsQuotedIdentifiersEnabled 允許對標識符使用英文雙引號
IsPublished 如果安裝了複製, SQL Server 支持發佈數據庫表供快照複製或事務複製使用
IsRecursiveTriggersEnabled 已啓用觸發器遞歸觸發
IsSubscribed 數據庫已訂閱發佈
IsSyncWithBackup 數據庫爲發佈數據庫或分發數據庫,並且支持在不中斷事務複製的情況下還原
IsTornPageDetectionEnabled SQL Server 數據庫引擎檢測到因電力故障或其他系統故障造成的不完全 I/O 操作
IsVerifiedClone 數據庫是使用 DBCC CLONEDATABASE 的 WITH VERIFY_CLONEDB 選項創建的用戶數據庫的僅限架構和僅限統計信息副本
IsXTPSupported 指示數據庫是否支持內存中 OLTP,即創建和使用內存優化表和本機編譯模塊。
LastGoodCheckDbTime 上次在指定數據庫上成功運行 DBCC CHECKDB 的日期和時間
LCID 排序規則的 Windows 區域設置標識符 (LCID)
MaxSizeInBytes 最大數據庫大小(以字節爲單位)
Recovery 數據庫恢復模式
ServiceObjective SQL Database或 SQL 數據倉庫 中的數據庫的性能級別
ServiceObjectiveId SQL Database 中的服務器目標 ID
SQLSortOrder SQL Server 早期版本中支持的 SQL Server 排序順序 ID
Status 數據庫狀態
Updateability 指示是否可以修改數據
UserAccess 指示哪些用戶可以訪問數據庫
Version 用於創建數據庫的 SQL Server 代碼的內部版本號。 標識爲僅供參考。 不提供支持。 不保證以後的兼容性

數據庫其他操作

分離數據庫

分離數據庫是指將數據庫從SQL SERVER 2008實例中刪除,但是保存其數據庫文件和日誌文件。
例如:使用sp_detach_db存儲過程分離“學生成績管理系統”數據庫
EXEC sp_detach_db 學生成績管理系統

附加數據庫

附加數據庫是指重新將分離的數據庫定位到相同/不同的是服務器中。
附加數據庫時,所有的數據庫文件(包括.mdf 和 .ndf文件)都必須可用。
如果任何數據庫的文件路徑有變,則必須指定文件的當前路徑。
使用 FOR ATTACH 語句將分離的“學生成績管理系統”附加到指定的數據庫實例中:
create database 學生成績管系統
on
(
filename='d:\sql server\DATABASE\學生成績管理系統_DAT.mdf ’
)
log on
(
filename=‘d:\sql server\DATABASE\學生成績管理系統_log.ldf’
)
for attach

收縮數據庫、複製和移動數據庫

語句未找到,可參考手冊中的數據庫管理工具進行操作。

優化數據庫

在sql server 2008中主要從以下三個方面進行優化數據庫:
1、數據文件和日誌文件的存儲位置
在數據庫系統中,如果將數據文件和日誌文件存放在同一個磁盤中,那麼在對這兩種數據進行讀寫操作中,會降低磁盤的運行效率。
方案:將數據文件和日誌文件存放在不同的磁盤中,對於多個數據文件應當將它們分散於不同的磁盤進行存儲。
2、文件組的使用
文件組時多個數據文件的集合,方便數據文件的管理和訪問。
文件組可以提高系統的性能,主要有兩個方面:平衡負荷和並行訪問。
另外,通過備份單個文件和文件組可以防止數據庫發生意外。當數據庫出現錯誤時,通過回覆備份的文件和文件組就可以還原數據庫,從而簡化了數據庫的維護工作。
將數據庫表和索引放在不同的文件組中,對於經常使用的表來說可以提高查詢效率。
注意:文件組可以提高數據庫的效率但是不能提高其穩定性
3、RAID技術
RAID 獨立磁盤構成的具有冗餘能力的陣列
(redundant 英[rɪˈdʌndənt] 多餘的
arrays 排列 of
Independent 英[ˌɪndɪˈpendənt] 獨立的
Disks 英[dɪsks] 磁盤
)
技術詳細介紹.
RAID是由多個磁盤驅動器組成的磁盤系統,它將多個磁盤驅動器組成一個磁盤陣列,以便提供高性能、高可靠性、大存儲容量、低成本的磁盤系統。
SQL SERVER中主要涉及的是RAID0、RAID1、RAID5

- RAID0是數據條帶化
raid0不斷地分割數據,將數據存儲在不同地磁盤中,因此具有很高地磁盤讀寫率。
打個比方:4個磁盤組成的磁盤系統,把數據分割存儲在四個磁盤中,在多核計算機中,I/O效率是單個磁盤的4倍。
不足:沒有冗餘容錯機制,一旦一個磁盤損壞,整個磁盤系統都不可以使用。
- RAID1是磁盤鏡像化
RAID1最大限度的保證了用戶數據的安全性和可修復性。RAID1的操作方式是把用戶存儲的數據完全複製到另一個磁盤中,就像鏡子一樣。RAID1的磁盤使用率是50%(如果是兩個磁盤)。在sql server中,RAID1策略可用於日誌。
- RAID5是帶奇偶校驗的條帶化
什麼是奇偶檢驗
簡單的說奇偶校驗就是根據檢驗讀取數據時1的個數有沒有發生奇偶變化,雖然說一次變化兩個的機率比較小,但是奇偶校驗檢驗不出雙位錯誤。
RAID5是最常用的容錯等級,沒有固定的校驗盤,而是按照規則將奇偶校驗信息均勻地分佈在陣列所屬地硬盤上,所以在每塊硬盤上,既有數據信息也有校驗信息。這樣解決了爭奪校驗盤地問題,而且同一組數據增加了併發操作。既解決了性能問題,也解決了安全問題,既適用於大量數據地操作也適用於各類事務的操作。

數據庫中的表及相關操作

SQL Server屬於關係型數據庫,所謂的關係,指的就是表。
表由行和列組成,每一列都是一個屬性,每一行都代表了一條完整的數據。

數據類型

詳情點擊

常用語法

切換數據庫

use + 數據庫的名稱
例子:切換成DB2數據庫
use DB2

創建表

一般我們在創建表之前已經切換到相應的數據庫了
簡單的書寫:
create table table_name
(
屬性列名 數據類型(所佔字節) [not null / null] [約束條件]

)
完整的寫法
s在這裏插入圖片描述
說明
database_name 用於指定在哪個數據庫中建立表
owner 用於指定該數據表的所有者
table_name: 數據表名
column_definition 用於定義數據表中的字段名稱
table_constraint 該字段的約束條件
column_name 列名
computed_column_expression 定義計算字段值的表達式
on {filegroup|default} 指定數據表所存儲的文件組
textimage_on {filegroup | default} 指定text文本和image文件存儲的文件組
data_type 數據類型
constant_expression 指定字段默認值的常量、null或者系統函數
indentity 用於指定該字段爲標識字段
seed 標識字段的起始值
increment 用於定義字段的標識增量

例如:在學生成績管理系統中創建以學號爲主鍵的學生信息表
一般的建表寫法

修改表

  • 添加列(屬性),語法規範
    alter table 表名
    add 屬性 數據類型[(長度)][NULL | NOT NULL]
    例子:爲student表添加sno列,數據類型爲varchar,字節數爲15,不能爲空
    alter table student
    add sno varchar(15) not null
  • 修改數據類型,語法規範
    alter table 表名
    alter column 屬性 數據類型
    例子:將student表中的sno列改爲int數據類型
    alter table student
    alter column sno int
  • 刪除(列)屬性
    alter table 表名
    drop column 屬性
    例子:student表中刪除sno列
    alter table student
    drop column sno
  • 修改列名
    exec sp_rename ‘表名.列名’,‘新列名’
  • 修改表名
    exec sp_rename ‘原表名’,‘新表名’

約束

  • 主鍵約束 primary key 唯一確定表中每一條記錄的標識符
  • 外鍵約束 foreign key 用於建立和加強兩個表數據之間的連接
  • 唯一約束 unique 指定一個列或多個列的值具有唯一性
  • 檢查約束 check 設置檢查條件,以限制輸入值
  • 默認約束 default 插入操作中沒有提供輸入值時系統會自動加上指定值

創建約束

alter table 表名
add constraint 約束名 約束類型 (列名)
說明:約束名是自定義的。

  • 主鍵約束,爲學生表中的學號列增加主鍵約束 primary key
    alter table 學生表
    add constraint pk_學號 primary key (學號)
    強調:主鍵約束列不可爲空

  • 唯一約束 unique , 給姓名添加一個唯一約束 unique
    alter table 學生表
    add constraint un_姓名 unique(姓名)

  • 檢查約束 check,給年齡添加檢查約束,年齡大於18 check
    alter table 學生表
    add constraint ck_年齡 check (年齡 > 18)

  • 默認約束 default,給性別添加默認約束,男
    alter tale 學生表
    add constraint de_性別 default ‘男’ for 性別。

  • 外鍵約束:加強兩個表之間的聯繫
    foreign key : 找到有相同的列
    外鍵的取值規則:空值或參照的主鍵值
    注意
    1、插入非空值時,如果主鍵中沒有這個值則不能插入
    2、更新時,不能改爲主鍵表中沒有的值
    3、刪除主鍵表記錄時,可以在外鍵時選定外鍵記錄一起刪除還是拒絕刪除
    4、更新主鍵記錄時,可以同時更新外鍵的值或者拒絕更改
    示例:
    有兩張表,成績表和學生表,都有學號的屬性,給成績表中的學號建立一個外鍵約束,來自於學生表
    alter table 成績表
    add constraint fk_學號 foregin key(學號)
    references 學生表 (學號)
    要求
    1、兩個表中的字段、類型、長度保持一致
    2、引用的列,references + 的列,必須是主鍵約束或者唯一約束
    3、兩個表中的列,儘量名字保持一致(規範)

創建表時添加約束

eg: test庫中,創建dz(編號,姓名,單位,性別,電話);
編號爲主鍵,所有屬性都是字符型,長度自己設定;
限制性別的取值爲男,女,單位默認值爲‘跳動字符’

create table dz
(
編號 char(20) primary key,
姓名 char(20),
單位 char(50) default ‘跳動字符’,
性別 char(5) check (性別=‘男’ or 性別=‘女’),
電話 char(20) unique
)

聲明
若存在聯合主鍵,則在最後聲明
primary key(列1,列2)

刪除約束

alter table 表名
drop constraint 約束名

根據添加約束中的語句操作:

  • 刪除默認約束
    alter table 學生表
    drop constraint de_性別
  • 刪除主鍵:若存在外鍵,則先刪除外鍵
    刪除外鍵約束(成績表的外鍵)
    alter table 成績表
    drop constraint fk_學號
    刪除主鍵約束
    alter table 學生表
    drop constraint pk_學號

T-SQL語言

基本概念

對sql server數據庫操作的,增強的sql語言
詳情.

標識符

數據庫對象的名稱即爲其標識符

命名規則

  1. 第一個字符必須是英文字母,下劃線、@符或#號
  2. 其他字符可以是:英文字母、十進制數字、@、$、#、_(下劃線)
  3. Transact_SQL爲保留字
  4. 不允許嵌入空格或者其他字符

批處理

t-sql語言一次可提交多條,語句順序依次執行。

變量

語法: declare @ 字符名稱 字符類型
eg:聲明兩個變量 name 字符類型 age int
declare @name varchar(10),age int
賦值 set 變量 = 值
eg: set @name = ‘張三’
同時多個賦值
select @name = ‘李四’,@age = 19.
輸出
print @name
print @age

全局變量

系統內部定義好的,用戶只能調用,不可修改
@@+字符名

DML

數據操作語言(Data Manipulation Language)
Manipulation 英[məˌnɪpjʊˈleɪʃən]
包括對數據庫的增刪改查

查詢

使用關鍵字DISTINCT

如果用戶希望在查詢返回結果中刪除重複行
select distinct 列名 from 表名稱

TOP 關鍵字

用於規定返回的記錄的數目
select top n *|column from table
top n 用於指定查詢結果返回的行數

使用別名查詢

使用select語句查詢數據時,可使用別名的方法根據需要對數據顯示的標題進行修改
1、在列的表達式中給出別名
select 列名 ‘別名’ from 表名
eg: select 學號 ‘no’ , 姓名 ‘name’, 性別 ‘sex’, 年級 ‘grade’ from 學生信息
2、使用‘=’表達式
select ‘別名’ = 列名 from 表名
eg: select ‘no’ = 學號,‘name’ = 姓名,‘sex’ = 性別 from 學生信息
3、使用AS關鍵字來連接列表達式和指定的別名
select 列名 as ‘別名’ from 表名
eg: select 學號 as ‘no’, 姓名 as ‘name’, 性別 as ‘sex’ from 表名

計算列

在進行數據查詢時,經常需要對查詢列的數據進行再次計算
eg:
select 編號,學號,‘調整前成績’ = 成績,‘調整後成績’ = 成績-10 from 成績表

選擇查詢

關鍵字where , sql server 支持比較、範圍、列表、字符串匹配等選擇方法

1、比較搜索條件

符號 說明 符號 說明
= 等於 <> 不等於
> 大於 !> 不大於
< 小於 !< 不小於
>= 大於等於 != 不等於
<= 小於等於

2、邏輯運算符
and 兩邊條件同時滿足
or 兩邊條件滿足其一

3、範圍搜索條件
範圍搜索返回介於兩個指定值之間的所有值,可分爲包括範圍和排他範圍兩種類型
用between , not between

4、列表搜索條件
IN 關鍵字,使用戶可以選擇與列表中的任意值匹配的行
例子:
select 學號,班級編號,姓名,性別,籍貫
from 學生信息
where 籍貫 in (‘beijing’,‘shenzhen’)

5、搜索條件中的字符匹配符
like 關鍵字搜索與指定模式匹配的字符串

字符 說明
% 替代零個或多個字符
_ 替代一個字符
[ ] 指定範圍內單個字符,[ ] 中可以是單個字符[abcd],或者多個字符[a-f]
[^] abcd不在範圍內的單個字符,單個 [ ^abcd],不在字符範圍[ ^a-f ]

6、涉及空值的查詢

  • 空值(null),在數據庫中表示不確定的值
  • 判斷取值爲空的格式爲: 列名 is null
  • 判斷取值不爲空的語句格式爲:列名 is not null

7、聚合函數
對一組值執行計算,並返回單個值

函數名 作用
SUM([distinct] <列名>) 計算列值總和
AVG([distinct] <列名>) 計算列值平均值
max([distinct] <列名>) 求列中最大值
min([distinct] <列名>) 求列中最小值
count(*) 統計表中行的個數
count([distinct] <列名>) 統計本列列值個數

上述函數中除了count(*)外,其他函數在計算的過程中均忽略null值。
語法:select 聚合函數 from 表名

8、數據分組
group by 語句用於結合聚合函數,根據一個或多個列對結果集進行分組
使用技巧:
group by 後面的字段,要寫在select 的後面第一位
eg:
查詢每個年級的總人數和班級總數
select 年級,sum(人數) as ‘總人數’,count(班級編號) as ‘班級個數’
from 班級信息
group by 年級

eg:
查詢每門課的最高分和最低分(表爲成績表)
select 課程編號 ,max(成績) as ‘最高分’,
min (成績) as ‘最低分’
from 成績表
group by 課程編號

having通常與group by子句一起使用。相當於一個用於組的where子句,制定組的搜索條件。having子句包含聚合函數,但where不可以使用。
select 學號,sum(成績)
group by 學號
having sum(成績) <60

9、order by 排序

  • order by 語句用於對指定的結果集進行排序
  • order by 默認升序
  • 降序排序可以使用desc關鍵字
  • select * from 成績表 order by 成績 [desc]

10、where

  • where子句可以使用的條件
運算符 符號 說明
比較符 =、>、<、>=等 比較兩個表達式
邏輯 and、or、not 組合兩個表達式的運算結果或取反
範圍 between、not between 搜索值是否在範圍內
列表 in、not in 查詢值是否屬於列表之一
字符匹配符 like、not like 字符串是否匹配

語法
select select_list
[into new_table_name]
from table_list
[where search_conditions]
[group by group_by_list]
[having search_conditions]
[order by order_list [ASC | DESC]]

說明:
select 選擇列表 into 新表名 from 表名
在查詢的基礎上創建新表

表連接

在實際查詢應用中,用戶所需要的數據並不全在一個表中,可能存在多個表中,這時就需要使用多表查詢。

在數據庫應用中,經常需要從多個相關的表中查詢數據,這就是需要進行表連接

  1. 使用內部連接 (只有匹配到的纔會有輸出
    內部連接是比較常用的一種數據連接查詢方式。
    內部連接有以下兩種語法式:
    select select_list from 表名1,表名2
    where 表1.列 = 表2.列
    或者
    select select_list from 表1 [inner] join 表2
    on 表1.列 = 表2.列
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章