數據庫-數據類型,表的約束和基本查詢操作


一、數值類型

1. 整數類型
類型字節有符號范圍無符號范圍操作注意事項
TINYINT1-128 ~ 1270 ~ 255默認有符號,UNSIGNED定義無符號
SMALLINT2-32768 ~ 327670 ~ 65535無符號需顯式聲明
INT4-2^31 ~ 2^31-10 ~ 2^32-1推薦優先使用INT
BIGINT8-2^63 ~ 2^63-10 ~ 2^64-1存儲超長整數時使用

示例

CREATE TABLE tt2(num TINYINT UNSIGNED);  -- 無符號TINYINT
INSERT INTO tt2 VALUES(255);             -- 有效
INSERT INTO tt2 VALUES(-1);              -- 報錯:越界
2. 小數類型
類型特點語法示例精度對比
FLOAT單精度,約7位有效數字FLOAT(M, D)快速計算但精度低
DOUBLE雙精度,約15位有效數字DOUBLE(M, D)精度高于FLOAT
DECIMAL精確小數,高精度計算DECIMAL(M, D)精確存儲(如金額)

示例

CREATE TABLE tt8 (salary FLOAT(10,8), salary2 DECIMAL(10,8));
INSERT INTO tt8 VALUES(23.12345612, 23.12345612);
SELECT * FROM tt8; 
-- 結果:FLOAT顯示23.12345695,DECIMAL顯示23.12345612(精度更高)
3. BIT類型
  • 語法BIT(M),M范圍1~64,默認1。
  • 顯示規則:按ASCII碼顯示。
  • 適用場景:存儲二進制標志(如性別0/1)。

示例

CREATE TABLE tt5(gender BIT(1));  -- 存儲0或1
INSERT INTO tt5 VALUES(0), (1);   -- 有效
INSERT INTO tt5 VALUES(2);        -- 報錯:越界

二、字符串類型

1. CHAR與VARCHAR對比
類型特點最大長度存儲方式適用場景
CHAR定長,固定占用空間255字符預先分配空間身份證、MD5值
VARCHAR變長,按需分配空間65535字節動態分配空間姓名、地址

示例

CREATE TABLE tt10(name VARCHAR(6) CHARSET=utf8);  -- UTF8下最大21844字符
INSERT INTO tt10 VALUES('我愛你,中國');           -- 6個字符(UTF8每個漢字3字節)
2. BLOB與TEXT
  • BLOB:存儲二進制數據(如圖片、文件)。
  • TEXT:存儲大文本,不支持全文索引和默認值。

三、時間日期類型

類型格式范圍占用空間特點
DATEYYYY-MM-DD1000-01-01 ~ 9999-12-313字節僅日期
DATETIMEYYYY-MM-DD HH:MM:SS1000-01-01 ~ 9999-12-318字節日期+時間
TIMESTAMPYYYY-MM-DD HH:MM:SS1970-01-01 ~ 2038-01-194字節自動更新為當前時間

示例

CREATE TABLE birthday (t1 DATE, t2 DATETIME, t3 TIMESTAMP);
INSERT INTO birthday(t1,t2) VALUES('2000-01-01', '2023-10-01 12:00:00');
UPDATE birthday SET t1='2005-05-05';  -- t3自動更新為當前時間

四、ENUM與SET類型

1. ENUM(單選)
  • 語法ENUM('選項1', '選項2', ...),存儲對應數字(1,2,…)。
  • 示例
    CREATE TABLE votes(gender ENUM('男','女'));
    INSERT INTO votes VALUES('男'), (2);  -- 2對應'女'
    
2. SET(多選)
  • 語法SET('選項1', '選項2', ...),存儲對應數字(1,2,4,8,…)。
  • 查詢:使用FIND_IN_SET函數。
    CREATE TABLE votes(hobby SET('登山','游泳','籃球'));
    INSERT INTO votes VALUES('登山,游泳');
    SELECT * FROM votes WHERE FIND_IN_SET('登山', hobby);  -- 查詢包含"登山"的記錄
    

五、關鍵注意事項

  1. 數值類型選擇
    • 優先使用DECIMAL存儲精確小數(如金額)。
    • 避免使用UNSIGNED,直接升級類型(如INTBIGINT)更安全。
  2. 字符串類型優化
    • CHAR適合定長數據(如手機號),VARCHAR適合變長數據(如地址)。
  3. 時間類型自動更新
    • TIMESTAMP字段在數據更新時會自動刷新為當前時間。
  4. ENUM/SET查詢技巧
    • 避免直接使用數字插入,優先用可讀字符串。

一、約束類型概覽

約束類型作用關鍵字特點
空屬性約束控制字段是否允許為NULLNOT NULL強制字段必須有值
默認值約束指定字段的默認值DEFAULT插入數據時可選使用默認值
列描述約束為字段添加注釋COMMENT僅描述作用,不影響數據
零填充約束數字顯示時自動填充前導零ZEROFILL僅影響顯示,不改變存儲值
主鍵約束唯一標識表中的記錄PRIMARY KEY唯一、非空,一張表只能有一個
自增長約束自動生成遞增的整數值AUTO_INCREMENT需與主鍵/唯一鍵搭配使用
唯一鍵約束確保字段值唯一(允許NULL)UNIQUE KEY可多個,NULL不參與唯一性檢查
外鍵約束強制關聯主表的主鍵或唯一鍵FOREIGN KEY維護表間數據一致性

二、核心約束詳解

1. 空屬性約束(NOT NULL)
  • 語法
    CREATE TABLE 表名 (字段名 數據類型 NOT NULL);
    
  • 示例
    CREATE TABLE myclass (class_name VARCHAR(20) NOT NULL,class_room VARCHAR(10) NOT NULL
    );
    
  • 操作細節
    • 插入數據時,若未給NOT NULL字段賦值,會報錯:
      ERROR 1364 (HY000): Field 'class_room' doesn't have a default value
      

2. 默認值約束(DEFAULT)
  • 語法
    CREATE TABLE 表名 (字段名 數據類型 DEFAULT 默認值);
    
  • 示例
    CREATE TABLE tt10 (name VARCHAR(20) NOT NULL,age TINYINT UNSIGNED DEFAULT 0,sex CHAR(2) DEFAULT '男'
    );
    
  • 操作細節
    • 插入時省略字段,自動填充默認值:
      INSERT INTO tt10(name) VALUES('張三');  -- age=0, sex='男'
      

3. 列描述約束(COMMENT)
  • 語法
    CREATE TABLE 表名 (字段名 數據類型 COMMENT '注釋內容');
    
  • 查看注釋
    SHOW CREATE TABLE 表名\G
    

4. 零填充約束(ZEROFILL)
  • 語法
    CREATE TABLE 表名 (字段名 INT(顯示長度) ZEROFILL);
    
  • 示例
    ALTER TABLE tt3 CHANGE a a INT(5) UNSIGNED ZEROFILL;
    
  • 效果
    • 存儲值1 → 顯示為00001,實際存儲仍為1

5. 主鍵約束(PRIMARY KEY)
  • 語法
    -- 單字段主鍵
    CREATE TABLE 表名 (字段名 數據類型 PRIMARY KEY);-- 復合主鍵
    CREATE TABLE 表名 (字段1 數據類型, 字段2 數據類型, PRIMARY KEY(字段1, 字段2));
    
  • 示例
    CREATE TABLE tt14 (id INT UNSIGNED,course CHAR(10),PRIMARY KEY(id, course)  -- 復合主鍵
    );
    
  • 操作細節
    • 插入重復主鍵報錯:
      ERROR 1062 (23000): Duplicate entry '1-123' for key 'PRIMARY'
      
    • 刪除主鍵
      ALTER TABLE 表名 DROP PRIMARY KEY;
      

6. 自增長約束(AUTO_INCREMENT)
  • 語法
    CREATE TABLE 表名 (字段名 INT PRIMARY KEY AUTO_INCREMENT);
    
  • 示例
    CREATE TABLE tt21 (id INT UNSIGNED PRIMARY KEY AUTO_INCREMENT,name VARCHAR(10) NOT NULL DEFAULT ''
    );
    
  • 操作細節
    • 插入時省略自增長字段,自動生成遞增值:
      INSERT INTO tt21(name) VALUES('a');  -- id=1
      INSERT INTO tt21(name) VALUES('b');  -- id=2
      
    • 獲取最后插入的ID
      SELECT LAST_INSERT_ID();
      

7. 唯一鍵約束(UNIQUE KEY)
  • 語法
    CREATE TABLE 表名 (字段名 數據類型 UNIQUE KEY);
    
  • 示例
    CREATE TABLE student (id CHAR(10) UNIQUE COMMENT '學號',name VARCHAR(10)
    );
    
  • 操作細節
    • 允許插入多個NULL值,但非NULL值必須唯一:
      INSERT INTO student VALUES(NULL, '張三');  -- 允許
      INSERT INTO student VALUES('001', '李四');  -- 重復則報錯
      

8. 外鍵約束(FOREIGN KEY)
  • 語法
    CREATE TABLE 從表名 (字段名 數據類型,FOREIGN KEY (從表字段) REFERENCES 主表名(主表字段)
    );
    
  • 示例
    -- 主表
    CREATE TABLE myclass (id INT PRIMARY KEY, name VARCHAR(30) NOT NULL);-- 從表
    CREATE TABLE stu (id INT PRIMARY KEY,class_id INT,FOREIGN KEY (class_id) REFERENCES myclass(id)
    );
    
  • 操作細節
    • 插入無效外鍵值報錯:
      ERROR 1452 (23000): Cannot add or update a child row
      
    • 允許外鍵為NULL
      INSERT INTO stu VALUES(102, NULL);  -- 允許未分配班級
      

三、綜合案例解析

場景:設計商店數據庫(商品、客戶、購買表)
-- 商品表
CREATE TABLE goods (goods_id INT PRIMARY KEY AUTO_INCREMENT COMMENT '商品編號',goods_name VARCHAR(32) NOT NULL COMMENT '商品名稱',unitprice INT NOT NULL DEFAULT 0 COMMENT '單價(分)',category VARCHAR(12) COMMENT '分類',provider VARCHAR(64) NOT NULL COMMENT '供應商'
);-- 客戶表
CREATE TABLE customer (customer_id INT PRIMARY KEY AUTO_INCREMENT COMMENT '客戶編號',name VARCHAR(32) NOT NULL COMMENT '姓名',email VARCHAR(64) UNIQUE KEY COMMENT '郵箱',sex ENUM('男','女') NOT NULL COMMENT '性別',card_id CHAR(18) UNIQUE KEY COMMENT '身份證'
);-- 購買表(外鍵關聯)
CREATE TABLE purchase (order_id INT PRIMARY KEY AUTO_INCREMENT COMMENT '訂單號',customer_id INT COMMENT '客戶編號',goods_id INT COMMENT '商品編號',nums INT DEFAULT 0 COMMENT '購買數量',FOREIGN KEY (customer_id) REFERENCES customer(customer_id),FOREIGN KEY (goods_id) REFERENCES goods(goods_id)
);

四、關鍵注意事項

  1. 主鍵與業務無關:推薦使用自增ID,避免業務調整影響主鍵。
  2. 外鍵性能:外鍵約束可能影響插入/更新性能,高頻寫入場景需謹慎使用。
  3. 唯一鍵與NULL:唯一鍵允許NULL,但多個NULL不視為重復。
  4. 自增長字段:僅支持整數類型,且一張表只能有一個自增長字段。

MySQL基本查詢操作


1. Create(增)
  • 語法
    INSERT INTO 表名 [(列名,...)] VALUES (值列表)[, (值列表)...];
    
  • 操作細節
    • 全列插入:值與表結構列順序一致,可省略列名。
      INSERT INTO students VALUES (100, 10000, '唐三藏', NULL);
      
    • 指定列插入:插入部分列,未指定列使用默認值或NULL。
      INSERT INTO students (id, sn, name) VALUES (102, 20001, '曹孟德');
      
    • 沖突處理
      • 更新重復鍵ON DUPLICATE KEY UPDATE
        INSERT INTO students (id, sn, name) VALUES (100, 10010, '唐大師')
        ON DUPLICATE KEY UPDATE sn = 10010, name = '唐大師';
        
      • 替換重復鍵REPLACE(刪除舊記錄后插入新記錄)。
        REPLACE INTO students (sn, name) VALUES (20001, '曹阿晴');
        

2. Retrieve(查)
  • 語法
    SELECT [DISTINCT] 列名 FROM 表名 [WHERE ...] [ORDER BY ...] [LIMIT ...];
    
  • 操作細節
    • 基礎查詢

      • 全列查詢(不推薦):SELECT * FROM exam_result;
      • 指定列查詢:SELECT id, name FROM exam_result;
      • 表達式查詢:SELECT name, math + 10 AS math_plus FROM exam_result;
      • 別名:SELECT name, chinese + math + english 總分 FROM exam_result;
      • 去重:SELECT DISTINCT math FROM exam_result;
    • 條件過濾(WHERE)

      • 比較運算符:>, =, <=>, BETWEEN, IN, LIKE%匹配任意字符,_匹配單個字符)。
      • 邏輯運算符:AND, OR, NOT
      • 案例:
        -- 英語不及格
        SELECT name, english FROM exam_result WHERE english < 60;
        -- 姓孫的同學
        SELECT name FROM exam_result WHERE name LIKE '孫%';
        -- 總分 < 200(WHERE中不能使用別名)
        SELECT name, chinese + math + english 總分 FROM exam_result WHERE chinese + math + english < 200;
        
    • 排序(ORDER BY)

      • 默認升序(ASC),降序用DESC。
      • 多字段排序:按書寫順序優先級。
        SELECT name, math, english FROM exam_result ORDER BY math DESC, english;
        
    • 分頁(LIMIT)

      • 語法:LIMIT n OFFSET s(從s開始取n條,s起始為0)。
        -- 第2頁(每頁3條)
        SELECT * FROM exam_result ORDER BY id LIMIT 3 OFFSET 3;
        

3. Update(改)
  • 語法
    UPDATE 表名 SET 列名=[WHERE ...] [ORDER BY ...] [LIMIT ...];
    
  • 操作細節
    • 單列更新:
      UPDATE exam_result SET math = 80 WHERE name = '孫悟空';
      
    • 多列更新:
      UPDATE exam_result SET math = 60, chinese = 70 WHERE name = '曹孟德';
      
    • 表達式更新:
      -- 總分倒數前三的數學加30分
      UPDATE exam_result SET math = math + 30 ORDER BY chinese + math + english LIMIT 3;
      
    • 慎用全表更新:無WHERE條件時更新全表。

4. Delete(刪)
  • 語法
    DELETE FROM 表名 [WHERE ...] [ORDER BY ...] [LIMIT ...];
    
  • 操作細節
    • 刪除指定數據:
      DELETE FROM exam_result WHERE name = '孫悟空';
      
    • 清空表
      • DELETE FROM 表名:逐行刪除,自增值保留。
      • TRUNCATE 表名:快速清空,重置自增值,不可回滾。

5. 高級操作
  • 聚合函數

    • COUNT, SUM, AVG, MAX, MIN,支持DISTINCT
      -- 統計數學成績種類數
      SELECT COUNT(DISTINCT math) FROM exam_result;
      -- 計算平均總分
      SELECT AVG(chinese + math + english) 平均總分 FROM exam_result;
      
  • GROUP BY 分組

    • 按部門統計平均工資:
      SELECT deptno, AVG(sal) FROM EMP GROUP BY deptno;
      
    • HAVING過濾分組:
      SELECT deptno, AVG(sal) FROM EMP GROUP BY deptno HAVING AVG(sal) < 2000;
      

6. 注意事項
  • 執行順序
    FROM → WHERE → GROUP BY → HAVING → SELECT → ORDER BY → LIMIT
  • NULL處理
    • = NULL不安全,需用IS NULL<=>
    • 聚合函數忽略NULL(如COUNT(qq)僅統計非NULL值)。
  • 性能提示
    • 避免全列查詢(SELECT *)。
    • 分頁時建議用LIMIT防止全表掃描。

7. 實戰技巧
  • 去重插入:通過臨時表實現原子操作。
    CREATE TABLE no_duplicate_table LIKE duplicate_table;
    INSERT INTO no_duplicate_table SELECT DISTINCT * FROM duplicate_table;
    RENAME TABLE duplicate_table TO old_table, no_duplicate_table TO duplicate_table;
    
  • 分頁優化:按主鍵分頁,避免OFFSET過大時性能問題。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/78579.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/78579.shtml
英文地址,請注明出處:http://en.pswp.cn/web/78579.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

【C語言編譯】編譯原理和詳細過程

文章目錄 1. C 語言編譯原理和詳細過程1.1 預處理階段1.2 編譯階段1.3 匯編階段1.4 鏈接階段 2. 疑問點解析2.1 三地址碼是什么&#xff1f;有什么作用2.2 符號表是什么&#xff1f;有何作用2.3 重定位的含義與作用2.3 符號表和重定位在整個編譯過程中的作用2.4 動態鏈接庫.so和…

游戲引擎學習第251天:完成調試層級結構

運行游戲&#xff0c;查看當前調試層級的狀態。 我們正在直播中開發一個完整的游戲&#xff0c;目前正進行調試代碼的整理和清理工作。現在我們直接進入正題&#xff0c;雖然還不完全確定今天要完成哪些具體內容&#xff0c;但有幾個明確的目標&#xff1a; 首先&#xff0c;…

關于Python:9. 深入理解Python運行機制

一、Python內存管理&#xff08;引用計數、垃圾回收&#xff09; Python&#xff08;CPython&#xff09;采用的是&#xff1a; “引用計數為主&#xff0c;垃圾回收為輔” 的內存管理機制。 也就是說&#xff1a; 引用計數機制&#xff1a;負責大部分內存釋放&#xff0c;簡…

【STM32單片機】#13 RTC實時時鐘

主要參考學習資料&#xff1a; B站江協科技 STM32入門教程-2023版 細致講解 中文字幕 開發資料下載鏈接&#xff1a;https://pan.baidu.com/s/1h_UjuQKDX9IpP-U1Effbsw?pwddspb 單片機套裝&#xff1a;STM32F103C8T6開發板單片機C6T6核心板 實驗板最小系統板套件科協 目錄 Uni…

SecureCRT 使用指南:安裝、設置與高效操作

目錄 一、SecureCRT 簡介 1.1 什么是 SecureCRT&#xff1f; 1.2 核心功能亮點 1.3 軟件特點 二、SecureCRT 安裝與激活 2.1 安裝步驟&#xff08;Windows 系統&#xff09; 2.2 激活與破解&#xff08;僅供學習參考&#xff09; 三、基礎配置與優化 3.1 界面與編碼設…

3.5/Q1,GBD數據庫最新一區文章解讀

文章題目&#xff1a;Global burden of low vision and blindness due to age-related macular degeneration from 1990 to 2021 and projections for 2050 DOI&#xff1a;10.1186/s12889-024-21047-x 中文標題&#xff1a;1990年至2021年因年齡相關性黃斑變性導致的低視力和失…

【Hive入門】Hive安全管理與權限控制:基于SQL標準的授權GRANT REVOKE深度解析

目錄 引言 1 Hive權限模型概述 2 SQL標準授權基礎 2.1 核心概念解析 2.2 授權模型工作流程 3 GRANT/REVOKE語法詳解 3.1 基礎授權語法 3.2 權限回收語法 3.3 參數說明 4 授權場景 4.1 基礎授權示例 4.2 列級權限控制 4.3 視圖權限管理 5 權限查詢與驗證 5.1 查看…

無縫監控:利用 AWS X-Ray 增強 S3 跨賬戶復制的可見性

您準備好提升您的云和 DevOps 技能了嗎? ??《云原生devops》專門為您打造,我們精心打造的 30 篇文章庫,這些文章涵蓋了 Azure、AWS 和 DevOps 方法論的眾多重要主題。無論您是希望精進專業知識的資深專業人士,還是渴望學習相關知識的新手,這套資源庫都能滿足您的需求。 …

Python Cookbook-7.2 使用 pickle 和 cPickle 模塊序列化數據

任務 你想以某種可以接受的速度序列化和重建Python 數據結構&#xff0c;這些數據既包括基本Python 對象也包括類和實例。 解決方案 如果你不想假設你的數據完全由基本 Python 對象組成&#xff0c;或者需要在不同的 Python 版本之間移植&#xff0c;再或者需要將序列化后的…

2025.5.5總結

今日感悟&#xff1a;這假期就這樣結束了&#xff0c;玩了一次滑板&#xff0c;打掃了一次租房&#xff0c;出去逛了一次街&#xff0c;看完了一本書&#xff0c;追了一部劇。既沒有家人&#xff0c;也沒有能一同暢飲的同學&#xff0c;更沒有對象&#xff0c;顯得確實有些孤獨…

MySQL | DQL語句-連接查詢

MySQL | DQL語句-連接查詢 &#x1fa84;個人博客&#xff1a;https://vite.xingji.fun 什么是連接查詢 從一張表中查詢數據稱為單表查詢。從兩張或更多張表中聯合查詢數據稱為多表查詢&#xff0c;又叫做連接查詢。什么時候需要使用連接查詢&#xff1f; 比如這樣的需求&…

Vite簡單介紹

Vite 是一個現代化的前端構建工具&#xff0c;由 Vue.js 的創始人 Evan You 開發&#xff0c;旨在提供更快的開發體驗和更高效的構建流程。它的名字來源于法語單詞“vite”&#xff0c;意為“快速”&#xff0c;這也反映了它的核心優勢——極速的冷啟動和熱模塊替換&#xff08…

C語言-回調函數

回調函數 通過函數指針調用函數&#xff0c;而這個被調用的函數稱為回調函數 回調函數是C語言中一種強大的機制&#xff0c;允許將函數作為參數傳遞給其他函數&#xff0c;從而在特定時機由后者調用。它的核心在于函數指針的使用 以下是回調函數的使用例子 先創建好一個函數…

啟發式算法-禁忌搜索算法

禁忌搜索是一種可以用于解決組合優化問題的啟發式算法&#xff0c;通過引入記憶機制跳出局部最優&#xff0c;避免重復搜索。該算法從一個初始解開始&#xff0c;通過鄰域搜索策略來尋找當前解的鄰域解&#xff0c;并在鄰域解中選擇一個最優解作為下一次迭代的當前解&#xff0…

Python 整理3種查看神經網絡結構的方法

1. 網絡結構代碼 import torch import torch.nn as nn# 定義Actor-Critic模型 class ActorCritic(nn.Module):def __init__(self, state_dim, action_dim):super(ActorCritic, self).__init__()self.actor nn.Sequential(# 全連接層&#xff0c;輸入維度為 state_dim&#xf…

Linux 查詢CPU飆高的原因

獲取進程ID ps -efgrep xxxx查詢占用最高的線程ID top -Hp 線程ID線程ID 轉 16進制數 printf 0x%x\n 線程ID基于jstack工具 跟蹤堆棧定位代碼位置 jstack 進程ID | grep 16禁止線程ID -A 20

Oracle OCP認證考試考點詳解083系列09

題記&#xff1a; 本系列主要講解Oracle OCP認證考試考點&#xff08;題目&#xff09;&#xff0c;適用于19C/21C,跟著學OCP考試必過。 41. 第41題&#xff1a; 題目 解析及答案&#xff1a; 關于應用程序容器&#xff0c;以下哪三項是正確的&#xff1f; A) 它可以包含單個…

GESP2024年3月認證C++八級( 第二部分判斷題(1-5))

孫子定理參考程序&#xff1a; #include <iostream> #include <vector> using namespace std;// 擴展歐幾里得算法&#xff1a;用于求逆元 int extendedGCD(int a, int b, int &x, int &y) {if (b 0) {x 1; y 0;return a;}int x1, y1;int gcd extende…

C 語言比較運算符:程序如何做出“判斷”?

各類資料學習下載合集 ??https://pan.quark.cn/s/8c91ccb5a474?? 在編寫程序時,我們經常需要根據不同的條件來執行不同的代碼。比如,如果一個分數大于 60 分,就判斷為及格;如果用戶的年齡小于 18 歲,就禁止訪問某個內容等等。這些“判斷”的核心,就依賴于程序能夠比…

WITH在MYSQL中的用法

WITH 子句&#xff08;也稱為公共表表達式&#xff0c;Common Table Expression&#xff0c;簡稱 CTE&#xff09;是 SQL 中一種強大的查詢構建工具&#xff0c;它可以顯著提高復雜查詢的可讀性和可維護性。 一、基本語法結構 WITH cte_name AS (SELECT ... -- 定義CTE的查詢…