news 2026/4/17 13:40:46

Oracle 19c入门学习教程,从入门到精通,SQL语言基础详解:语法、使用方法与综合案例(5)

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
Oracle 19c入门学习教程,从入门到精通,SQL语言基础详解:语法、使用方法与综合案例(5)

SQL语言基础详解:语法、使用方法与综合案例

SQL(Structured Query Language)是用于管理关系型数据库的标准语言。本章系统讲解 SQL 语言的基础知识,包括其分类、编写规则、数据查询、函数使用、子查询、DML 操作等,并结合 Oracle 数据库环境提供详细示例和综合性实战。


一、SQL语言简介与特点

1. SQL 简介

  • SQL 是 ANSI/ISO 标准的数据库查询与操作语言。
  • 最早由 IBM 在 1970 年代开发(SEQUEL),后被 Oracle 等厂商广泛采用。
  • 在 Oracle 中,SQL 与 PL/SQL 结合使用,支持复杂业务逻辑。

2. SQL 语言特点

特点说明
非过程化用户只需说明“做什么”,无需指定“怎么做”
统一性DDL、DML、DCL 均用 SQL 实现
高度可读语法接近自然语言(如 SELECT … FROM … WHERE)
跨平台支持多种数据库(Oracle、MySQL、PostgreSQL 等)

二、SQL语言的分类

类别全称功能常见语句
DDLData Definition Language定义数据库结构CREATE, ALTER, DROP
DMLData Manipulation Language操作表中数据SELECT, INSERT, UPDATE, DELETE
DCLData Control Language控制权限与事务GRANT, REVOKE, COMMIT, ROLLBACK
TCLTransaction Control Language事务控制COMMIT, ROLLBACK, SAVEPOINT

本章重点讲解DML(尤其是 SELECT)和部分 DDL/DCL。


三、SQL语言编写规则(Oracle)

  1. 大小写不敏感SELECTselect等效(但字符串值区分大小写)。

  2. 语句以分号;/结束(在 SQL*Plus 中)。

  3. 关键字建议大写,提高可读性。

  4. 对象名(表、列)默认大写,若用小写需加双引号(不推荐)。

  5. 注释方式

    -- 单行注释/* 多行注释 */

四、用户模式(Schema)与模式对象

1. 什么是模式(Schema)?

  • 模式是数据库对象(表、视图、索引等)的集合,属于一个数据库用户。
  • 用户名 = 模式名(如SCOTT用户拥有SCOTT模式)。

2. 模式对象示例

对象类型说明
表(Table)存储数据的基本单位
视图(View)虚拟表,基于 SQL 查询
索引(Index)加速查询
序列(Sequence)生成唯一数字
同义词(Synonym)对象别名

3. 示例模式:SCOTT

Oracle 自带的经典教学模式,包含以下表:

表名说明
EMP员工表
DEPT部门表
SALGRADE工资等级表
BONUS奖金表(通常为空)
启用 SCOTT 模式(Oracle 12c+)
-- 以 sysdba 登录CONNECT/ASSYSDBA-- 解锁 scott 用户并设置密码ALTERUSERscott ACCOUNTUNLOCKIDENTIFIEDBYtiger;-- 连接 scottCONNECTscott/tiger

若未安装 SCOTT 表,可手动运行$ORACLE_HOME/rdbms/admin/scott.sql脚本。


五、检索数据(SELECT 语句详解)

1. 简单查询(SELECT … FROM)

-- 查询所有员工姓名和职位SELECTename,jobFROMemp;-- 使用 * 查询所有列(不推荐用于生产)SELECT*FROMdept;

2. 筛选查询(WHERE 子句)

-- 查询工资大于 2000 的员工SELECTename,salFROMempWHEREsal>2000;-- 多条件筛选SELECTename,job,hiredateFROMempWHEREdeptno=20ANDjob='ANALYST';

3. 排序查询(ORDER BY)

-- 按工资降序排列SELECTename,salFROMempORDERBYsalDESC;-- 多列排序:先按部门升序,再按工资降序SELECTdeptno,ename,salFROMempORDERBYdeptnoASC,salDESC;

4. 分组查询(GROUP BY + HAVING)

-- 统计每个部门的平均工资SELECTdeptno,AVG(sal)ASavg_salaryFROMempGROUPBYdeptno;-- 筛选平均工资 > 2000 的部门SELECTdeptno,AVG(sal)ASavg_salaryFROMempGROUPBYdeptnoHAVINGAVG(sal)>2000;

⚠️ 注意:WHERE用于筛选行,HAVING用于筛选分组。

5. 多表关联查询(JOIN)

-- 内连接:查询员工及其部门名称SELECTe.ename,e.job,d.dnameFROMemp eINNERJOINdept dONe.deptno=d.deptno;-- 左外连接:显示所有部门,即使没有员工SELECTd.dname,e.enameFROMdept dLEFTJOINemp eONd.deptno=e.deptno;-- Oracle 旧式写法(不推荐)SELECTe.ename,d.dnameFROMemp e,dept dWHEREe.deptno=d.deptno;

六、Oracle常用系统函数

1. 字符类函数

函数说明示例
UPPER(str)转大写UPPER('scott') → 'SCOTT'
LOWER(str)转小写LOWER('KING') → 'king'
SUBSTR(str, pos, len)截取子串SUBSTR('ORACLE', 2, 3) → 'RAC'
LENGTH(str)字符长度LENGTH('Hello') → 5
TRIM(str)去除空格TRIM(' abc ') → 'abc'
-- 示例:格式化员工姓名为大写SELECTUPPER(ename)AS"Employee Name"FROMemp;

2. 数字类函数

函数说明
ROUND(n, d)四舍五入(d 为小数位)
TRUNC(n, d)截断(不四舍五入)
MOD(m, n)取余
ABS(n)绝对值
-- 计算每人奖金(假设佣金为 10%)SELECTename,sal,NVL(comm,0)AScommission,ROUND(sal*0.1+NVL(comm,0),2)AStotal_bonusFROMemp;

3. 日期和时间类函数

函数说明
SYSDATE当前系统日期时间
ADD_MONTHS(date, n)加 n 个月
MONTHS_BETWEEN(d1, d2)两日期间月数
TO_CHAR(date, fmt)日期转字符串
-- 查询入职超过 40 年的员工(截至 2026 年)SELECTename,hiredate,ROUND(MONTHS_BETWEEN(SYSDATE,hiredate)/12,1)ASyears_workedFROMempWHEREMONTHS_BETWEEN(SYSDATE,hiredate)/12>40;

4. 转换类函数

函数说明
TO_CHAR(value, fmt)转字符串
TO_NUMBER(str)转数字
TO_DATE(str, fmt)转日期
NVL(expr1, expr2)若 expr1 为 NULL,返回 expr2
-- 将工资格式化为货币字符串SELECTename,TO_CHAR(sal,'$99,999.99')ASformatted_salaryFROMemp;

5. 聚集函数(Aggregate Functions)

函数说明
COUNT(*)行数
SUM(col)求和
AVG(col)平均值
MAX(col)最大值
MIN(col)最小值
-- 统计员工总数、最高/最低工资、平均工资SELECTCOUNT(*)AStotal_employees,MAX(sal)ASmax_salary,MIN(sal)ASmin_salary,AVG(sal)ASavg_salaryFROMemp;

七、子查询(Subquery)

1. 什么是子查询?

  • 在一个 SQL 语句中嵌套另一个SELECT语句。
  • 子查询先执行,结果作为外层查询的条件。

2. 单行子查询(返回一行一列)

-- 查询工资高于平均工资的员工SELECTename,salFROMempWHEREsal>(SELECTAVG(sal)FROMemp);

3. 多行子查询(返回多行)

-- 查询在 SALES 或 RESEARCH 部门工作的员工SELECTename,jobFROMempWHEREdeptnoIN(SELECTdeptnoFROMdeptWHEREdnameIN('SALES','RESEARCH'));-- 使用 ANY / ALLSELECTename,salFROMempWHEREsal>ANY(SELECTsalFROMempWHEREdeptno=30);-- 高于销售部任一员工

4. 关联子查询(Correlated Subquery)

子查询引用外层查询的列。

-- 查询每个部门中工资最高的员工SELECTe1.ename,e1.deptno,e1.salFROMemp e1WHEREe1.sal=(SELECTMAX(e2.sal)FROMemp e2WHEREe2.deptno=e1.deptno-- 关联条件);

八、操作数据库(DML 语句)

1. 插入数据(INSERT)

-- 插入完整行INSERTINTOdept(deptno,dname,loc)VALUES(50,'IT','BEIJING');-- 插入部分列(其他列为 NULL 或默认)INSERTINTOemp(empno,ename,job,hiredate,sal,deptno)VALUES(8000,'ALICE','DEVELOPER',SYSDATE,5000,50);

2. 更新数据(UPDATE)

-- 给所有 ANALYST 加薪 10%UPDATEempSETsal=sal*1.1WHEREjob='ANALYST';-- 更新多个字段UPDATEempSETsal=6000,comm=500WHEREempno=8000;

3. 删除数据

DELETE(可回滚,触发器生效)
-- 删除奖金为 NULL 的员工DELETEFROMempWHEREcommISNULL;
TRUNCATE(不可回滚,更快,不触发触发器)
-- 清空 bonus 表TRUNCATETABLEbonus;

⚠️ 区别:

  • DELETE是 DML,可ROLLBACK
  • TRUNCATE是 DDL,自动COMMIT,不能回滚。

九、综合性实战案例

案例:生成“高绩效员工年度报告”

需求

  1. 找出每个部门工资最高的员工;
  2. 显示其姓名、职位、工资、部门名、入职年限;
  3. 工资格式化为货币;
  4. 按部门编号排序;
  5. 输出到 SQL*Plus 报表。
-- 设置 SQL*Plus 环境SETPAGESIZE40SETLINESIZE150SETFEEDBACKOFFTTITLE CENTER'High Performer Annual Report - &SYSDATE'SKIP2BTITLE CENTER'Confidential'-- 格式化列COLUMNename HEADING"Employee Name"FORMAT A15COLUMNjob HEADING"Job Title"FORMAT A12COLUMNdname HEADING"Department"FORMAT A15COLUMNsal_fmt HEADING"Salary"FORMAT A12COLUMNyears HEADING"Years Worked"FORMAT999.9-- 主查询:使用关联子查询找部门最高薪员工SELECTe.ename,e.job,d.dname,TO_CHAR(e.sal,'$99,999.99')ASsal_fmt,ROUND(MONTHS_BETWEEN(SYSDATE,e.hiredate)/12,1)ASyearsFROMemp eJOINdept dONe.deptno=d.deptnoWHEREe.sal=(SELECTMAX(sal)FROMemp e2WHEREe2.deptno=e.deptno)ORDERBYe.deptno;-- 清理TTITLEOFFBTITLEOFFSETFEEDBACKON

输出效果(示例):

High Performer Annual Report - 14-JAN-2026 Employee Name Job Title Department Salary Years Worked --------------- ------------ --------------- ------------ ------------ KING PRESIDENT ACCOUNTING $5,000.00 41.2 SCOTT ANALYST RESEARCH $3,000.00 40.8 BLAKE MANAGER SALES $2,850.00 41.0

十、总结

模块核心知识点
SQL 基础分类、规则、模式概念
数据查询SELECT + WHERE + GROUP BY + ORDER BY + JOIN
函数字符、数字、日期、转换、聚集
子查询单行、多行、关联
DMLINSERT / UPDATE / DELETE / TRUNCATE

💡 提示:掌握这些基础是进阶 PL/SQL、性能调优、数据库设计的前提。建议在SQL*Plus 或 SQL Developer中反复练习 SCOTT 模式下的各类查询。


✅ 附:快速启用 SCOTT 模式的完整脚本(若缺失)

-- 以 sys 用户运行@?/rdbms/admin/scott.sqlALTERUSERscott IDENTIFIEDBYtiger ACCOUNTUNLOCK;
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/4/18 7:55:07

文件清理神器,绝了

在日常电脑使用中清理C盘垃圾是没有办法回避的,因为电脑用的时间久了,C盘肯定会越来越拥挤。今天给大家推荐的这款神器可以帮助清理C盘的重复文件,并且查找出空文件夹。 czkawka 重复文件清理神器 czkawka软件是一款重复文件,大文…

作者头像 李华
网站建设 2026/4/3 4:48:55

互联网大厂Java小白求职:音视频场景下的技术面试指南

场景设定 在一家互联网大厂的音视频研发部门,超好吃是一位初入职场的Java程序员,正在接受严肃的面试官的技术面试。这次面试涉及到音视频场景的相关技术点。第一轮提问:基础技术点 面试官:超好吃,Java语言是你的核心技…

作者头像 李华
网站建设 2026/3/31 7:29:39

Java版LeetCode热题100之对称二叉树:从递归到迭代的深度解析

Java版LeetCode热题100之对称二叉树:从递归到迭代的深度解析本文将全面、深入地剖析 LeetCode 第101题「对称二叉树」,不仅提供递归与迭代两种主流解法,还涵盖算法原理、复杂度分析、面试技巧、工程应用及关联题目拓展。全文约9500字&#xf…

作者头像 李华
网站建设 2026/3/23 3:07:11

污水处理DCS数据采集组态监控系统方案

某污水处理厂采用DCS系统对污水处理流程进行集中监控与控制,具备手动、自动、维护等多种运行模式,并在中控室实现工艺参数的实时展示与设备状态管理。为进一步提升管理效率与智能化水平,现需对现有系统进行数字化升级,将污水处理关…

作者头像 李华
网站建设 2026/4/17 6:03:16

基于贾子智慧理论体系的中国 AI 发展与竞争国家战略(2025-2035)

智慧主导智能:基于贾子智慧理论的中国AI发展与竞争国家战略(2025‑2035) 摘要 本战略以贾子智慧“四大支柱五五三三定律”为框架,确立“智慧主导智能、可控优于领先”的核心原则,旨在构建区别于美国技术霸权的新范式。…

作者头像 李华
网站建设 2026/4/17 21:07:02

基于Simulink的双模式MPPT(快速追踪+稳态优化)仿真

目录 手把手教你学Simulink--基础MPPT控制场景实例:基于Simulink的双模式MPPT(快速追踪稳态优化)仿真 一、引言:为什么需要双模式MPPT?——光伏系统“效率与响应”的平衡术 二、核心原理:双模式MPPT的“切…

作者头像 李华