首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 數據庫知識 >  >> SQL Server 資料庫 >> 關於SqlServer

精妙實用的 SQL 技巧大全:從複製表到複雜查詢一網打盡

     編輯:關於SqlServer

前言

SQL 不僅是查詢語言,更是資料處理的瑞士軍刀。本文匯總多個實戰中高頻、高效的 SQL 寫法,涵蓋建表、複製、刪除、外連接、排程提醒、關聯刪除、分組統計等場景,助你快速解決棘手需求。

1. 僅複製表結構(不含資料)

-- Oracle / SQL Server 通用
SELECT * INTO new_table FROM source_table WHERE 1 <> 1;

利用永假條件 1<>1 讓查詢不返回任何行,僅建立同結構的空表。

2. 完整複製表(結構 + 資料)

INSERT INTO target_table (col_a, col_b, col_c)
SELECT col_d, col_e, col_f FROM source_table;

指定欄位順序可避免結構不一致報錯。

3. 顯示文章、提交人及最後回覆時間

SELECT a.title, a.username, b.adddate
FROM   table_a a,
       (SELECT MAX(adddate) AS adddate FROM table_a WHERE table_a.title = a.title) b;

子查詢在關聯條件中引用外層表別名,實現逐行計算最新回覆時間。

4. 標準外連接寫法(LEFT OUTER JOIN)

SELECT a.a, a.b, a.c, b.c, b.d, b.f
FROM   table_a a
LEFT OUTER JOIN table_b b ON a.a = b.c;

優先使用 ANSI 標準語法,可讀性強且避免 Oracle 舊式 (+) 陷阱。

5. 日程提前 5 分鐘提醒

SELECT * FROM schedule
WHERE  DATEDIFF(minute, start_time, GETDATE()) > 5;

適用於 SQL Server;MySQL 可用 TIMESTAMPDIFF(MINUTE, start_time, NOW()) > 5。

6. 刪除主表中副表不存在的資料(反向同步)

DELETE FROM info
WHERE  NOT EXISTS (SELECT 1 FROM infobz WHERE info.infid = infobz.infid);

NOT EXISTS 配合關聯子查詢,效率優於 NOT IN 且能正確處理 NULL 值。

7. 複雜分組統計:同比庫存變動

SELECT A.NUM, A.NAME, B.UPD_DATE, B.PREV_UPD_DATE
FROM   TABLE1 A,
       (SELECT X.NUM,
               X.UPD_DATE,
               Y.UPD_DATE AS PREV_UPD_DATE
        FROM   (SELECT NUM, UPD_DATE, INBOUND_QTY, STOCK_ONHAND
                FROM   TABLE2
                WHERE  TO_CHAR(UPD_DATE, 'YYYY/MM') = TO_CHAR(SYSDATE, 'YYYY/MM')) X,
               (SELECT NUM, UPD_DATE, STOCK_ONHAND
                FROM   TABLE2
                WHERE  TO_CHAR(UPD_DATE, 'YYYY/MM') = TO_CHAR(ADD_MONTHS(TRUNC(SYSDATE, 'MM'), -1), 'YYYY/MM')) Y
        WHERE  X.NUM = Y.NUM(+)
        AND    X.INBOUND_QTY + NVL(Y.STOCK_ONHAND, 0) <> X.STOCK_ONHAND) B
WHERE  A.NUM = B.NUM;

展示多層子查詢、外連接、日期截取、NVL 空值處理的綜合應用。

8. 多條件排除查詢:學生資料篩選

SELECT * FROM studentinfo
WHERE  NOT EXISTS (SELECT 1 FROM student WHERE studentinfo.id = student.id)
AND    department = :dept_name
AND    major = :major_name
ORDER BY gender, origin, gaokao_score DESC;

使用參數化查詢防注入,NOT EXISTS 確保高效排除。

總結

掌握這些模式,能將許多原本需要應用層迴圈處理的邏輯下推到資料庫,大幅提升效能與簡潔度。建議收藏備查,實戰中靈活組合。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved