Oracle多表查询与数据更新
单列子查询:返回一个字段的结果。 单行子查询:返回多个字段的结果。 多行子查询:返回多条记录的结果。
发布日期:2025-04-30 01:33:51
浏览次数:15
分类:精选文章
本文共 2520 字,大约阅读时间需要 8 分钟。
多表查询入门:掌握SQL复杂查询技巧
在数据库开发中,多表查询是处理复杂数据关系的核心技能之一。本文将从基础到高级详细讲解多表查询的使用方法,帮助你在实际项目中高效处理数据。
2.1 多表查询
2.1.1 多表查询的基本语法
多表查询在SQL中用于从不同表中获取数据,通常用于处理复杂的数据关联关系。基本语法如下:
SELECT {DISTINCT} *|查询列1 别名1,查询列2 别名2FROM 表名称1 别名1,表名称2 别名2{WHERE 条件(s)}{ORDER BY 排序字段 ASC|DESC,排序字段 ASC|DESC} 例:同时查询emp和dept表
SELECT * FROM emp, dept;
返回了56条数据,emp表有14条记录,dept表有4条记录,56=14*4,这正是笛卡尔积的结果。
2.1.2 左、右连接
在实际项目中,笛卡尔积往往会导致冗余数据,需要通过左、右连接来去除冗余数据。
左连接(左外连接)
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(+);
左、右连接的区别在于连接符的位置,(+)表示外连接。
2.1.3 SQL:1999语法支持
SQL:1999语法提供了更灵活的表连接方式,包括:
- 交叉连接(CROSS JOIN):产生笛卡尔积
- 自然连接(NATURAL JOIN):自动匹配字段
- 使用连接(USING):指定连接字段
- ON子句:自定义连接条件
- 左、右、外连接:处理冗余数据
2.2 组函数及分组统计
2.2.1 组函数
常用的组函数包括 COUNT(), MAX(), MIN(), AVG(), SUM() 等。
例:查询部门的总工资
SELECT deptno, SUM(sal) AS total_salFROM empWHERE deptno = 20;
2.2.2 分组统计
分组统计需要使用 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;
使用HAVING完成分组筛选
当 WHERE 条件不足以完成分组筛选时,可以使用 HAVING。
例:查询平均工资大于2000的部门编号和平均工资
SELECT deptno, avg(sal) AS avg_salFROM empGROUP BY deptnoHAVING avg(sal) > 2000;
2.3 子查询
子查询是将一个查询嵌入另一个查询中,常用于复杂的数据筛选。
子查询类型
例:查询工资比7654高的所有雇员信息
SELECT * FROM empWHERE sal > (SELECT sal FROM emp WHERE empno = 7654);
子查询中的IN操作符
通过 IN 运算符可以将子查询的结果限定在特定范围内。
例:查询部门名称中包含’S’的部门员工总工资
SELECT d.dname, SUM(e.sal) AS total_salFROM dept d, emp eWHERE d.dname LIKE '%S%'GROUP BY d.dname;
2.4 数据库更新操作
2.4.1 添加数据
-- 使用精确写法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);
2.4.2 修改数据
-- 修改所有记录UPDATE myemp SET comm = 1000;-- 修改指定条件UPDATE myemp SET sal = 7000 WHERE empno = 7899;
2.5 事务处理
事务处理确保数据库操作的完整性,防止部分更新。
示例:创建临时表并删除数据
-- 创建临时表CREATE TABLE emp10 AS SELECT * FROM emp WHERE deptno = 10;-- 删除数据DELETE FROM emp10 WHERE empno = 7782;-- 查看结果SELECT * FROM emp10; -- 仍然存在7782记录
2.6 查询练习
1. 列出所有至少有一个员工的部门
SELECT d.deptno, d.dnameFROM dept dJOIN (SELECT deptno FROM emp) on d.deptno = dn.deptno;
2. 列出薪水高于“SMITH”的员工
SELECT * FROM empWHERE sal > (SELECT sal FROM emp WHERE ename = 'SMITH');
通过以上内容,你应该掌握了多表查询、组函数、子查询等SQL高级技巧的使用方法。实际项目中,建议结合实际需求进行灵活运用,逐步提升你的数据库开发能力。
发表评论
最新留言
不错!
[***.144.177.141]2026年06月05日 18时05分28秒
关于作者
喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!