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

SQL 進階查詢技巧:UPDATE 多欄位、SELECT INTO 複製表、彙總函數 (COUNT/AVG/SUM/MAX/MIN) 完全攻略

     編輯:關於SqlServer

UPDATE 多欄位同步修改

UPDATE MyTable
SET FirstColumn  = 'Updated!',
    SecondColumn = 'Updated!',
    ThirdColumn  = 'Updated!'
WHERE FirstColumn = 'Update Me1';

無條件 UPDATE:全表批次修改

-- 所有書價格加倍
UPDATE Titles SET Price = Price * 2;

SELECT INTO:建立新表並複製資料/結構

-- 完整複製 (結構+資料+身分識別屬性)
SELECT * INTO NewTable FROM MyTable;

-- 指定欄位 + 條件篩選
SELECT FirstColumn INTO NewTable
FROM MyTable
WHERE SecondColumn = 'Copy Me!';

利用 SELECT INTO 實現「刪除欄位」與「變更型別」

SQL Server 不支援直接 DROP COLUMN 或 ALTER COLUMN 變更型別 (舊版本),變通方案:

  1. 建立新表 (含正確結構)
  2. INSERT INTO NewTable SELECT ... FROM OldTable
  3. 驗證無誤後 DROP TABLE OldTable、sp_rename 'NewTable', 'OldTable'

彙總函數完全攻略

函數用途忽略 NULL範例
COUNT(*)列數 (含 NULL 列)否SELECT COUNT(*) FROM Authors
COUNT(col)非 NULL 值個數是SELECT COUNT(Au_LName) FROM Authors
COUNT(DISTINCT col)互不相同非 NULL 值個數是SELECT COUNT(DISTINCT Au_LName) FROM Authors
AVG(col)數值平均是SELECT AVG(Vote) FROM Opinion
SUM(col)數值總和是SELECT SUM(PurchaseAmount) FROM Orders
MAX(col)最大值是SELECT MAX(Vote) FROM Opinion
MIN(col)最小值是SELECT MIN(Vote) FROM Opinion

別名賦予:ASP/應用程式取用

SELECT AVG(Vote) AS TheAverage FROM Opinion;
-- Recordset("TheAverage") 即可取得

COUNT(*) vs COUNT(PK) vs COUNT(其他) 效能實測

SELECT COUNT(*)       FROM Tgongwen;  -- 1500 ms
SELECT COUNT(GID)     FROM Tgongwen;  -- 1483 ms (PK, 最快)
SELECT COUNT(Fariqi)  FROM Tgongwen;  -- 3140 ms
SELECT COUNT(Title)   FROM Tgongwen;  -- 52050 ms (長字串最慢)

結論:COUNT(*) ≈ COUNT(PK) 最優;優化器自動選最窄欄位。長字串欄位統計極慢。

GROUP BY 進階:分組統計

-- 各部門員工數、平均薪資、最高/最低薪資
SELECT DeptID,
       COUNT(*) AS EmpCount,
       AVG(Salary) AS AvgSalary,
       MAX(Salary) AS MaxSalary,
       MIN(Salary) AS MinSalary
FROM Employees
GROUP BY DeptID;

HAVING 過濾分組結果

-- 員工數 > 5 的部門
SELECT DeptID, COUNT(*) AS Cnt
FROM Employees
GROUP BY DeptID
HAVING COUNT(*) > 5;

實務建議

  1. 彙總查詢加索引:GROUP BY、ORDER BY 欄位建索引可避免排序運算子。
  2. 大表 COUNT(*) 替代方案:sys.dm_db_partition_stats 即時估算、觸發器維護計數表、定期快取。
  3. 避免 SELECT * 配合 GROUP BY:只選分組鍵與彙總欄位,減少資料傳輸與排序成本。
  4. NULL 語意注意:AVG 忽略 NULL,若需視為 0 請用 AVG(ISNULL(col,0))。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved