2026/6/20 5:32:29
网站建设
项目流程
网站解析后怎么做,可以做投票的网站,德州市建设街小学网站,帝国cms官方网站SQL语言基础详解#xff1a;语法、使用方法与综合案例
SQL#xff08;Structured Query Language#xff09;是用于管理关系型数据库的标准语言。本章系统讲解 SQL 语言的基础知识#xff0c;包括其分类、编写规则、数据查询、函数使用、子查询、DML 操作等#xff0c;并结…SQL语言基础详解语法、使用方法与综合案例SQLStructured 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, DROPDMLData Manipulation Language操作表中数据SELECT, INSERT, UPDATE, DELETEDCLData Control Language控制权限与事务GRANT, REVOKE, COMMIT, ROLLBACKTCLTransaction Control Language事务控制COMMIT, ROLLBACK, SAVEPOINT本章重点讲解DML尤其是 SELECT和部分 DDL/DCL。三、SQL语言编写规则Oracle大小写不敏感SELECT与select等效但字符串值区分大小写。语句以分号;或/结束在 SQL*Plus 中。关键字建议大写提高可读性。对象名表、列默认大写若用小写需加双引号不推荐。注释方式-- 单行注释/* 多行注释 */四、用户模式Schema与模式对象1. 什么是模式Schema模式是数据库对象表、视图、索引等的集合属于一个数据库用户。用户名 模式名如SCOTT用户拥有SCOTT模式。2. 模式对象示例对象类型说明表Table存储数据的基本单位视图View虚拟表基于 SQL 查询索引Index加速查询序列Sequence生成唯一数字同义词Synonym对象别名3. 示例模式SCOTTOracle 自带的经典教学模式包含以下表表名说明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,salFROMempWHEREsal2000;-- 多条件筛选SELECTename,job,hiredateFROMempWHEREdeptno20ANDjobANALYST;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.deptnod.deptno;-- 左外连接显示所有部门即使没有员工SELECTd.dname,e.enameFROMdept dLEFTJOINemp eONd.deptnoe.deptno;-- Oracle 旧式写法不推荐SELECTe.ename,d.dnameFROMemp e,dept dWHEREe.deptnod.deptno;六、Oracle常用系统函数1. 字符类函数函数说明示例UPPER(str)转大写UPPER(scott) → SCOTTLOWER(str)转小写LOWER(KING) → kingSUBSTR(str, pos, len)截取子串SUBSTR(ORACLE, 2, 3) → RACLENGTH(str)字符长度LENGTH(Hello) → 5TRIM(str)去除空格TRIM( abc ) → abc-- 示例格式化员工姓名为大写SELECTUPPER(ename)ASEmployee NameFROMemp;2. 数字类函数函数说明ROUND(n, d)四舍五入d 为小数位TRUNC(n, d)截断不四舍五入MOD(m, n)取余ABS(n)绝对值-- 计算每人奖金假设佣金为 10%SELECTename,sal,NVL(comm,0)AScommission,ROUND(sal*0.1NVL(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)/1240;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;七、子查询Subquery1. 什么是子查询在一个 SQL 语句中嵌套另一个SELECT语句。子查询先执行结果作为外层查询的条件。2. 单行子查询返回一行一列-- 查询工资高于平均工资的员工SELECTename,salFROMempWHEREsal(SELECTAVG(sal)FROMemp);3. 多行子查询返回多行-- 查询在 SALES 或 RESEARCH 部门工作的员工SELECTename,jobFROMempWHEREdeptnoIN(SELECTdeptnoFROMdeptWHEREdnameIN(SALES,RESEARCH));-- 使用 ANY / ALLSELECTename,salFROMempWHEREsalANY(SELECTsalFROMempWHEREdeptno30);-- 高于销售部任一员工4. 关联子查询Correlated Subquery子查询引用外层查询的列。-- 查询每个部门中工资最高的员工SELECTe1.ename,e1.deptno,e1.salFROMemp e1WHEREe1.sal(SELECTMAX(e2.sal)FROMemp e2WHEREe2.deptnoe1.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%UPDATEempSETsalsal*1.1WHEREjobANALYST;-- 更新多个字段UPDATEempSETsal6000,comm500WHEREempno8000;3. 删除数据DELETE可回滚触发器生效-- 删除奖金为 NULL 的员工DELETEFROMempWHEREcommISNULL;TRUNCATE不可回滚更快不触发触发器-- 清空 bonus 表TRUNCATETABLEbonus;⚠️ 区别DELETE是 DML可ROLLBACKTRUNCATE是 DDL自动COMMIT不能回滚。九、综合性实战案例案例生成“高绩效员工年度报告”需求找出每个部门工资最高的员工显示其姓名、职位、工资、部门名、入职年限工资格式化为货币按部门编号排序输出到 SQL*Plus 报表。-- 设置 SQL*Plus 环境SETPAGESIZE40SETLINESIZE150SETFEEDBACKOFFTTITLE CENTERHigh Performer Annual Report - SYSDATESKIP2BTITLE CENTERConfidential-- 格式化列COLUMNename HEADINGEmployee NameFORMAT A15COLUMNjob HEADINGJob TitleFORMAT A12COLUMNdname HEADINGDepartmentFORMAT A15COLUMNsal_fmt HEADINGSalaryFORMAT A12COLUMNyears HEADINGYears WorkedFORMAT999.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.deptnod.deptnoWHEREe.sal(SELECTMAX(sal)FROMemp e2WHEREe2.deptnoe.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;