Chapter 3-5 SQL 进阶查询语法大全


一、 基础查询 (Basic Queries)

1. SELECT & FROM

1
2
SELECT * FROM employees;
SELECT name, salary FROM employees;

2. WHERE 条件筛选

1
2
3
4
5
SELECT * FROM employees WHERE salary > 5000;
SELECT * FROM employees WHERE department = 'IT' AND salary > 6000;
SELECT * FROM employees WHERE name LIKE 'A%';  -- 名字以A开头
SELECT * FROM employees WHERE age BETWEEN 25 AND 35;
SELECT * FROM employees WHERE department IN ('IT', 'HR', 'Finance');

3. ORDER BY 排序

1
2
SELECT * FROM employees ORDER BY salary DESC;
SELECT * FROM employees ORDER BY department ASC, salary DESC;

4. DISTINCT 去重

1
SELECT DISTINCT department FROM employees;

二、 聚合函数与分组 (Aggregation & Grouping)

5. 聚合函数

1
2
3
4
5
6
7
SELECT 
    COUNT(*) as total_employees,
    AVG(salary) as avg_salary,
    MAX(salary) as max_salary,
    MIN(salary) as min_salary,
    SUM(salary) as total_salary
FROM employees;

6. GROUP BY 分组

1
2
3
4
5
6
SELECT 
    department,
    COUNT(*) as emp_count,
    AVG(salary) as avg_salary
FROM employees
GROUP BY department;

7. HAVING 分组后筛选

1
2
3
4
5
6
SELECT 
    department,
    COUNT(*) as emp_count
FROM employees
GROUP BY department
HAVING COUNT(*) > 5;

三、 多表连接 (Joins)

8. INNER JOIN

1
2
3
SELECT e.name, d.department_name
FROM employees e
INNER JOIN departments d ON e.department_id = d.id;

9. LEFT/RIGHT JOIN

1
2
3
SELECT e.name, d.department_name
FROM employees e
LEFT JOIN departments d ON e.department_id = d.id;

10. FULL OUTER JOIN

1
2
3
SELECT e.name, d.department_name
FROM employees e
FULL OUTER JOIN departments d ON e.department_id = d.id;

11. 多表连接

1
2
3
4
SELECT e.name, d.department_name, p.project_name
FROM employees e
JOIN departments d ON e.department_id = d.id
JOIN projects p ON e.id = p.leader_id;

四、 子查询 (Subqueries)

12. 标量子查询

1
2
3
SELECT name, salary,
    (SELECT AVG(salary) FROM employees) as company_avg
FROM employees;

13. IN 子查询

1
2
3
4
5
SELECT name
FROM employees
WHERE department_id IN (
    SELECT id FROM departments WHERE budget > 100000
);

14. EXISTS 子查询

1
2
3
4
5
6
SELECT name
FROM employees e
WHERE EXISTS (
    SELECT 1 FROM projects p 
    WHERE p.leader_id = e.id
);

15. 关联子查询

1
2
3
4
5
6
7
SELECT name, salary, department
FROM employees e1
WHERE salary > (
    SELECT AVG(salary) 
    FROM employees e2 
    WHERE e2.department = e1.department
);

五、 高级查询技术 (Advanced Techniques)

16. CTE (公用表表达式)

1
2
3
4
5
6
7
8
WITH department_stats AS (
    SELECT 
        department,
        AVG(salary) as avg_salary
    FROM employees
    GROUP BY department
)
SELECT * FROM department_stats WHERE avg_salary > 6000;

17. 递归 CTE

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
WITH RECURSIVE org_chart AS (
    -- 基础情况
    SELECT employee_id, name, manager_id, 1 as level
    FROM employees
    WHERE manager_id IS NULL
    
    UNION ALL
    
    -- 递归情况
    SELECT e.employee_id, e.name, e.manager_id, oc.level + 1
    FROM employees e
    JOIN org_chart oc ON e.manager_id = oc.employee_id
)
SELECT * FROM org_chart;

18. 窗口函数

1
2
3
4
5
6
7
8
SELECT 
    name,
    department,
    salary,
    RANK() OVER (PARTITION BY department ORDER BY salary DESC) as dept_rank,
    AVG(salary) OVER (PARTITION BY department) as dept_avg_salary,
    LAG(salary) OVER (ORDER BY salary) as prev_salary
FROM employees;

19. PIVOT 行列转换

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
-- SQL Server
SELECT *
FROM (
    SELECT department, salary
    FROM employees
) AS SourceTable
PIVOT (
    AVG(salary)
    FOR department IN ([IT], [HR], [Finance])
) AS PivotTable;

六、 数据操作 (Data Manipulation)

20. INSERT

1
2
3
4
5
6
INSERT INTO employees (name, salary, department) 
VALUES ('John Doe', 5000, 'IT');

-- 插入查询结果
INSERT INTO high_paid_employees (name, salary)
SELECT name, salary FROM employees WHERE salary > 8000;

21. UPDATE

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
UPDATE employees 
SET salary = salary * 1.1 
WHERE department = 'IT';

-- 使用子查询更新
UPDATE employees 
SET salary = (
    SELECT AVG(salary) FROM employees
) 
WHERE salary IS NULL;

22. DELETE

1
2
3
4
5
6
7
DELETE FROM employees WHERE salary < 3000;

-- 使用子查询删除
DELETE FROM employees 
WHERE department_id IN (
    SELECT id FROM departments WHERE active = 0
);

23. MERGE/UPSERT

1
2
3
4
5
-- PostgreSQL
INSERT INTO employees (id, name, salary)
VALUES (1, 'John', 5000)
ON CONFLICT (id) 
DO UPDATE SET name = EXCLUDED.name, salary = EXCLUDED.salary;

七、 事务控制 (Transaction Control)

24. 事务处理

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
BEGIN TRANSACTION;

UPDATE accounts SET balance = balance - 100 WHERE id = 1;
UPDATE accounts SET balance = balance + 100 WHERE id = 2;

-- 如果一切正常
COMMIT;

-- 如果出现错误
ROLLBACK;

八、 性能优化相关

25. 索引使用

1
2
CREATE INDEX idx_employee_department ON employees(department);
CREATE INDEX idx_employee_name_salary ON employees(name, salary);

26. 分页查询

1
2
3
4
5
-- MySQL
SELECT * FROM employees ORDER BY id LIMIT 10 OFFSET 20;

-- SQL Server
SELECT * FROM employees ORDER BY id OFFSET 20 ROWS FETCH NEXT 10 ROWS ONLY;

27. 查询性能分析

1
2
3
4
5
6
-- 查看执行计划
EXPLAIN SELECT * FROM employees WHERE salary > 5000;

-- SQL Server
SET STATISTICS TIME ON;
SELECT * FROM employees WHERE salary > 5000;

九、 实用函数

28. 字符串函数

1
2
3
4
5
6
7
SELECT 
    UPPER(name) as upper_name,
    LOWER(name) as lower_name,
    LENGTH(name) as name_length,
    SUBSTRING(name, 1, 3) as name_prefix,
    CONCAT(first_name, ' ', last_name) as full_name
FROM employees;

29. 日期函数

1
2
3
4
5
6
SELECT 
    CURRENT_DATE as today,
    EXTRACT(YEAR FROM hire_date) as hire_year,
    DATE_ADD(hire_date, INTERVAL 1 YEAR) as anniversary,
    DATEDIFF(CURRENT_DATE, hire_date) as days_employed
FROM employees;

30. 条件表达式

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
SELECT 
    name,
    salary,
    CASE 
        WHEN salary < 3000 THEN 'Low'
        WHEN salary BETWEEN 3000 AND 7000 THEN 'Medium'
        ELSE 'High'
    END as salary_level,
    COALESCE(bonus, 0) as bonus_amount
FROM employees;

这份指南涵盖了 SQL 从基础到高级的大部分常用语法。建议在实际工作中根据需要查阅相关部分,并通过练习来熟练掌握。

Licensed under CC BY-NC-SA 4.0
Built with Hugo
Theme Stack designed by Jimmy