-- SQL Server EXEC sp_help 'TableName'; -- 或 SELECT COLUMN_NAME, DATA_TYPE, IS_NULLABLE FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME = 'TableName';
SELECT * FROM Emp; SELECT EmpNo, EName, Mgr FROM Emp; SELECT DISTINCT Mgr FROM Emp;
SELECT * FROM Emp WHERE Job = 'CLERK'; SELECT * FROM Emp WHERE HireDate > '1982-01-01';
SELECT EName, Sal*12 + ISNULL(Comm,0) AS YearSal FROM Emp;
SELECT * FROM Emp WHERE EName LIKE 'S__T%'; -- _ 單字元,% 多字元
SELECT * FROM Emp WHERE Job IN ('CLERK','ANALYST');
SELECT * FROM Emp WHERE Mgr IS NULL;
SELECT * FROM Emp WHERE (Sal > 500 OR Job = 'MANAGER') AND EName LIKE 'J%'; SELECT * FROM Emp ORDER BY DeptNo, Sal DESC;
SELECT MAX(Sal), MIN(Sal), AVG(Sal), SUM(Sal), COUNT(*) FROM Emp; SELECT * FROM Emp WHERE Sal = (SELECT MAX(Sal) FROM Emp); SELECT DeptNo, MAX(Sal), AVG(Sal) FROM Emp GROUP BY DeptNo; SELECT DeptNo, Job, AVG(Sal), MIN(Sal) FROM Emp GROUP BY DeptNo, Job HAVING AVG(Sal) < 2000;
規則:SELECT 清單中的非彙總欄位必須出現在 GROUP BY;HAVING 篩選分組結果;執行順序 GROUP BY → HAVING → ORDER BY。
SELECT E.EName, E.Sal, D.DName FROM Emp E JOIN Dept D ON E.DeptNo = D.DeptNo ORDER BY D.DeptNo;
SELECT E.EName, E.Sal, S.Grade FROM Emp E JOIN SalGrade S ON E.Sal BETWEEN S.LoSal AND S.HiSal;
SELECT E.EName AS EmpName, M.EName AS MgrName FROM Emp E JOIN Emp M ON E.Mgr = M.EmpNo;
SELECT EName FROM Emp WHERE DeptNo = (SELECT DeptNo FROM Emp WHERE EName = 'SMITH');
SELECT EName, Job, Sal, DeptNo FROM Emp WHERE Job IN (SELECT DISTINCT Job FROM Emp WHERE DeptNo = 10); SELECT EName, Sal, DeptNo FROM Emp WHERE Sal > ALL (SELECT Sal FROM Emp WHERE DeptNo = 30); -- 大於最高 -- 等價: WHERE Sal > (SELECT MAX(Sal) FROM Emp WHERE DeptNo = 30) -- 效能較好 SELECT EName, Sal, DeptNo FROM Emp WHERE Sal > ANY (SELECT Sal FROM Emp WHERE DeptNo = 30); -- 大於任一 -- 等價: WHERE Sal > (SELECT MIN(Sal) FROM Emp WHERE DeptNo = 30)
SELECT * FROM Emp WHERE (Job, DeptNo) = (SELECT Job, DeptNo FROM Emp WHERE EName = 'SMITH');
SELECT E.DeptNo, E.EName, E.Sal, T.AvgSal FROM Emp E JOIN (SELECT DeptNo, AVG(Sal) AS AvgSal FROM Emp GROUP BY DeptNo) T ON E.DeptNo = T.DeptNo WHERE E.Sal > T.AvgSal ORDER BY E.DeptNo;
SELECT * FROM Emp ORDER BY Sal OFFSET 5 ROWS FETCH NEXT 5 ROWS ONLY; -- 第 2 頁,每頁 5 筆
舊版:ROW_NUMBER() OVER (ORDER BY Sal) AS Rn 外層篩選。
SELECT EmpNo, EName, Sal, Job, DeptNo INTO MyTable FROM Emp;
SELECT EName, Sal, Job FROM Emp WHERE Sal > 2500 UNION -- 並集 (去重) -- INTERSECT -- 交集 -- UNION ALL -- 並集 (保留重複) -- EXCEPT -- 差集 (第一個減第二個) SELECT EName, Sal, Job FROM Emp WHERE Job = 'MANAGER';
效能:集合運算通常優於複雜 OR 條件。
INSERT INTO MyEmp (EmpID, Name, Sal, Job, Dept) SELECT EmpNo, EName, Sal, Job, DeptNo FROM Emp WHERE DeptNo = 10; UPDATE Emp SET (Job, Sal, Comm) = (SELECT Job, Sal, Comm FROM Emp WHERE EName = 'SMITH') WHERE EName = 'SCOTT';
ROWNUM (Oracle) / LIMIT (MySQL/PG) / OFFSET/FETCH (SQL Server 2012+ / PG / Oracle 12c+)。NVL (Oracle) ↔ ISNULL/COALESCE (SQL Server) ↔ COALESCE (標準)。DUAL 虛擬表 (Oracle) 在 SQL Server 不需要。掌握上述核心查詢模式,涵蓋 90% 日常開發與報表需求。複雜業務邏輯優先用 CTE/衍生表分解,善用索引覆蓋與執行計畫分析,避免 SELECT *、隱含轉換、非 SARGable 條件。