-- 标量子查询(返回单个值) SELECT name, salary FROM employees WHERE salary > (SELECTAVG(salary) FROM employees);
-- 行子查询(返回一行) SELECT*FROM employees WHERE (department_id, salary) = (SELECT department_id, MAX(salary) FROM employees);
-- 表子查询(作为临时表) SELECT dept_name, avg_salary FROM (SELECT department_id, AVG(salary) AS avg_salary FROM employees GROUPBY department_id) AS dept_avg JOIN departments ON dept_avg.department_id = departments.id;
-- 关联子查询(引用外层表) SELECT e1.name, e1.salary FROM employees e1 WHERE salary > (SELECTAVG(salary) FROM employees e2 WHERE e2.department_id = e1.department_id);
-- EXISTS / NOT EXISTS SELECT d.name FROM departments d WHEREEXISTS (SELECT1FROM employees e WHERE e.department_id = d.id);
-- IN / NOT IN SELECT name FROM employees WHERE department_id IN (SELECT id FROM departments WHERE location ='北京');
-- ANY / ALL SELECT name, salary FROM employees WHERE salary >ANY (SELECT salary FROM employees WHERE department_id =10); -- 大于子查询中任意一个值
集合操作
合并多个查询的结果。
UNION:合并并去重
UNION ALL:合并保留重复行
INTERSECT:交集(MySQL 不支持)
EXCEPT / MINUS:差集(MySQL 不支持)
1 2 3 4 5
SELECT name FROM customers UNION SELECT name FROM employees;
-- 必须列数相同,数据类型兼容
事务
保证一组操作要么全部成功,要么全部失败。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
-- 开始事务 BEGIN; -- 或 START TRANSACTION;
-- 执行操作 UPDATE accounts SET balance = balance -100WHERE id =1; UPDATE accounts SET balance = balance +100WHERE id =2;
-- 提交事务 COMMIT;
-- 回滚事务(撤销未提交的更改) ROLLBACK;
-- 设置保存点 SAVEPOINT sp1; ROLLBACKTOSAVEPOINT sp1;
事务需满足 ACID 特性(原子性、一致性、隔离性、持久性)。
常见数据库差异提示
字符串连接:
MySQL:CONCAT('a', 'b') 或 'a' 'b'(空格)
PostgreSQL / SQLite:'a' || 'b'
SQL Server:'a' + 'b'
分页:
MySQL / PostgreSQL / SQLite:LIMIT 10 OFFSET 20
SQL Server / Oracle 12c+:OFFSET 20 ROWS FETCH NEXT 10 ROWS ONLY
-- 查询每个部门的平均薪资,显示部门名称 SELECT d.name AS 部门名称, AVG(e.salary) AS 平均薪资 FROM employees e JOIN departments d ON e.department_id = d.id GROUPBY d.name HAVINGAVG(e.salary) >7500;
-- 查找薪资高于公司平均薪资的员工及其部门 SELECT e.name, e.salary, d.name AS department FROM employees e JOIN departments d ON e.department_id = d.id WHERE e.salary > (SELECTAVG(salary) FROM employees);
-- 更新薪资(为研发部员工加薪10%) UPDATE employees SET salary = salary *1.1 WHERE department_id = (SELECT id FROM departments WHERE name ='研发部');
-- 删除没有员工的部门 DELETEFROM departments WHERE id NOTIN (SELECTDISTINCT department_id FROM employees WHERE department_id ISNOT NULL);