本文共 2520 字,大约阅读时间需要 8 分钟。
在数据库开发中,多表查询是处理复杂数据关系的核心技能之一。本文将从基础到高级详细讲解多表查询的使用方法,帮助你在实际项目中高效处理数据。
多表查询在SQL中用于从不同表中获取数据,通常用于处理复杂的数据关联关系。基本语法如下:
SELECT {DISTINCT} *|查询列1 别名1,查询列2 别名2FROM 表名称1 别名1,表名称2 别名2{WHERE 条件(s)}{ORDER BY 排序字段 ASC|DESC,排序字段 ASC|DESC} SELECT * FROM emp, dept;
返回了56条数据,emp表有14条记录,dept表有4条记录,56=14*4,这正是笛卡尔积的结果。
在实际项目中,笛卡尔积往往会导致冗余数据,需要通过左、右连接来去除冗余数据。
SELECT e.ename, e.deptno, d.dnameFROM emp eRIGHT JOIN dept dON e.deptno = d.deptno;
SELECT e.ename, e.deptno, d.dnameFROM emp eLEFT JOIN dept dON e.deptno = d.deptno(+);
左、右连接的区别在于连接符的位置,(+)表示外连接。
SQL:1999语法提供了更灵活的表连接方式,包括:
常用的组函数包括 COUNT(), MAX(), MIN(), AVG(), SUM() 等。
SELECT deptno, SUM(sal) AS total_salFROM empWHERE deptno = 20;
分组统计需要使用 GROUP BY 进行分组,语法格式如下:
SELECT {DISTINCT} *|列1 别名1, 列2 别名2FROM 表1 别名1, 表2 别名2{WHERE 条件(s)}{GROUP BY 分组条件}{ORDER BY 排序字段 ASC|DESC , 排序字段 ASC|DESC , …} SELECT COUNT(e.empno) AS emp_count, d.dnameFROM emp e, dept dWHERE e.deptno = d.deptnoGROUP BY d.dname;
当 WHERE 条件不足以完成分组筛选时,可以使用 HAVING。
SELECT deptno, avg(sal) AS avg_salFROM empGROUP BY deptnoHAVING avg(sal) > 2000;
子查询是将一个查询嵌入另一个查询中,常用于复杂的数据筛选。
SELECT * FROM empWHERE sal > (SELECT sal FROM emp WHERE empno = 7654);
通过 IN 运算符可以将子查询的结果限定在特定范围内。
SELECT d.dname, SUM(e.sal) AS total_salFROM dept d, emp eWHERE d.dname LIKE '%S%'GROUP BY d.dname;
-- 使用精确写法INSERT INTO myemp (empno, ename, job, hiredate, sal, deptno)VALUES (7899, '张三', '清洁工', '14-2月-1995', 500, 40);-- 使用简略写法INSERT INTO myemp VALUES (7899, '张三', '清洁工', '14-2月-1995', 500, 40);
-- 修改所有记录UPDATE myemp SET comm = 1000;-- 修改指定条件UPDATE myemp SET sal = 7000 WHERE empno = 7899;
事务处理确保数据库操作的完整性,防止部分更新。
-- 创建临时表CREATE TABLE emp10 AS SELECT * FROM emp WHERE deptno = 10;-- 删除数据DELETE FROM emp10 WHERE empno = 7782;-- 查看结果SELECT * FROM emp10; -- 仍然存在7782记录
SELECT d.deptno, d.dnameFROM dept dJOIN (SELECT deptno FROM emp) on d.deptno = dn.deptno;
SELECT * FROM empWHERE sal > (SELECT sal FROM emp WHERE ename = 'SMITH');
通过以上内容,你应该掌握了多表查询、组函数、子查询等SQL高级技巧的使用方法。实际项目中,建议结合实际需求进行灵活运用,逐步提升你的数据库开发能力。
转载地址:http://xmpfk.baihongyu.com/