Oracle PL/SQL开发基础(第六弹:简单查询)

查询表数据

查询特定的列数据

如:

SELECT ename, empno, job, hiredate
  FROM scott.emp;

查询所有列数据

如:

SELECT * FROM emp;

使用DISTINCT查询唯一列数据

可以使用DISTINCT关键字获取列中的唯一值,即去除重复数据,如:

SELECT DISTINCT job FROM emp;

要注意,DISTINCT会导致索引失效,在大型数据集查询中应该尽量避免DISTINCT查询。

在查询中使用表达式

如:

SELECT empno, ename, sal * (1 + 0.12) FROM emp;

在进行算术运算时,如果列包含NULL值,那么结果也为NULL。

使用列别名

如:

SELECT empno 员工名称, ename "员工姓名_NAME", sal * (1 + 0.12) raised_sal, sal AS 薪水 FROM emp;

AS关键字可选。
如果列别名中包含空格、特殊字符或者大小写敏感字符,则要用双引号把别名引起来。

字符串连接

使用||符号,如:

SELECT ename || '的薪资为:' || sal 员工薪水 FROM emp;

指定查询条件

简单WHERE子句

如:

SELECT * FROM emp WHERE deptno = 20;

SELECT empno, ename, job FROM emp WHERE sal >= 1500 AND sal <= 2500;

使用范围操作符

可以使用BETWEEN AND,IN,LIKE。

BETWEEN AND

如:

SELECT empno, ename, job FROM emp WHERE sal BETWEEN 1500 AND 2500;

实际上在使用BETWEEN AND操作符时,Oracle会将该语句转换为一对AND条件,因此,上面的语句会被Oracle翻译成:

SELECT empno, ename, job FROM emp WHERE sal >= 1500 AND sal <= 2500;

因此使用BETWEEN AND并没有提高性能,只是逻辑上给了用户一种更接近自然语言的表达方式。

IN

如:

SELECT empno, ename, job, mgr, hiredate, sal
  FROM emp
 WHERE job IN ('SALESMAN', 'CLERK', 'ANALYST');

对于IN查询条件,Oracle会将其转换为一组OR条件,因此对于上面的语句,Oracle会将其转换为如下语句:

SELECT empno, ename, job, mgr, hiredate, sal
  FROM emp
 WHERE job = SALESMAN OR job = CLERK OR job = ANALYST;

LIKE

LIKE查询也成为模糊查询,%通配符表示零个或多个字符,_通配符表示一个字符,如“”

SELECT empno, ename, job, mgr, hiredate, sal
  FROM emp
 WHERE ename LIKE 'J%';

SELECT empno, ename, job, mgr, hiredate, sal
  FROM emp
 WHERE hiredate LIKE '%81';

SELECT empno, ename, job, mgr, hiredate, sal
  FROM emp
 WHERE ename LIKE '__A%';

判断NULL值

如:

SELECT empno, ename, job, mgr, hiredate
  FROM emp
 WHERE mgr IS NULL;

SELECT empno, ename, job, mgr, hiredate
  FROM emp
 WHERE mgr IS NOT NULL;

使用逻辑组合

如:

SELECT empno, ename, job, mgr, hiredate, sal, deptno
  FROM emp
 WHERE deptno = 20 AND hiredate LIKE '%82';

SELECT empno, ename, job, mgr, hiredate, sal, deptno
  FROM emp
 WHERE deptno = 20 OR hiredate LIKE '%82';

SELECT empno, ename, job, mgr, hiredate, sal, deptno
  FROM emp
 WHERE job NOT IN ('CLERK', 'MANAGER', 'SALESMAN');

SELECT empno, ename, job, mgr, hiredate, sal, deptno
  FROM emp
 WHERE sal NOT BETWEEN 1000 AND 2500;

SELECT empno, ename, job, mgr, hiredate, sal, deptno
  FROM emp
 WHERE ename NOT LIKE '%A%';

排序

ORDER BY指定要对结果集进行排序,可选择ASC表示升序,DESC表示降序。默认为ASC。
ORDER BY子句必须是SELECT语句的最后一个子句。
如:

SELECT   empno, ename, job, mgr, hiredate, sal, deptno
    FROM emp
   WHERE deptno = 20
ORDER BY empno;

SELECT   empno, ename, job, mgr, hiredate, sal, deptno
    FROM emp
   WHERE deptno = 20
ORDER BY empno, ename DESC;

除了直接指定列名之外,还可以根据SELECT语句的字段列表的索引顺序指定排序,如根据SELECT语句中的第4个字段mgr进行排序:

SELECT   empno, ename, job, mgr, hiredate, sal, deptno
    FROM emp
   WHERE deptno = 20
ORDER BY 4 DESC;

如果指定一个不存在的SELECT语句中的索引号,Oracle会提示异常,如:

SELECT   empno, ename, job, mgr, hiredate, sal, deptno
    FROM emp
   WHERE deptno = 20
ORDER BY 8 DESC;

异常为:

ORA-01785:ORDER BY项必须是SELECT-list表达式的数目

统计函数

记录统计

如:

SELECT COUNT(*) 记录条数 FROM emp WHERE deptno=20;

COUNT(*)返回SELECT语句标准的行数,包括重复行和有空值列的行。
如果要统计某个字段的非空值得个数,可以这么写:

SELECT COUNT(comm) 提成员工数 FROM emp;

COUNT默认使用ALL参数,表示提取所有包括重复的记录,因此上面的语句等同于:

SELECT COUNT(ALL comm) 提成员工数 FROM emp;

如果要获得唯一记录数,则可以:

SELECT COUNT(DISTINCT job) 职位个数 FROM emp;

汇总和平均值计算

SUM函数可以用来汇总,如:

SELECT SUM(sal) 薪水总计, SUM(comm) 提成总计 FROM emp;

AVG函数可以用来计算平均值,如:

SELECT AVG(sal) 平均薪资,AVG(comm) 平均提成 FROM emp;

最小值和最大值

如:

SELECT MIN(sal) 最低薪资,MAX(sal) 最高薪资 FROM emp;
SELECT MIN(hiredate) 最早雇佣日期,MAX(hiredate) 最晚雇佣日期 FROM emp;

统计函数的NULL值处理

可以使用NVL函数将NULL替换成别的值,如:

SELECT MIN(NVL(comm,0)) 最低提成,MAX(NVL(comm,0)) 最高提成 FROM emp;

分组统计

使用GROUP BY来分组,如:

SELECT   deptno, SUM (sal) 部门薪资小计
    FROM emp
GROUP BY deptno
ORDER BY SUM (sal);

分组对于初学者来说比较难于掌握,这里就简单地说一下。
在使用GROUP BY子句时,除了作为分组函数(如:SUM,AVG,COUNT等)参数的列不用包含在GROUP BY子句中之外,任何在SELECT列表中的其他列都必须出现在GROUP BY子句中。不过在GROUP BY子句中的列不必一定出现在SELECT列表中。
分组结果通过分组列隐式排序,也可以用ORDER BY指定不同的排序顺序,但也只能用分组函数或分组列进行排序。

HAVING子句

例如如果只是想对部门编号为20和30的员工进行分组统计,使用WHERE子句即可,如:

SELECT   deptno, job, SUM (sal) 薪资小计
    FROM emp
   WHERE deptno IN (20, 30)
GROUP BY deptno, job

如果要对分组的结果进行进一步的过滤,比如要显示分组后薪资小计大于2000的分组结果,那么可以:

SELECT   deptno, job, SUM (sal) 薪资小计
    FROM emp
   WHERE deptno IN (20, 30)
GROUP BY deptno, job
  HAVING SUM (sal) > 2000;

HAVING子句只能用在GROUP BY子句的后面,不能使用WHERE子句来取代HAVING子句,否则将会产生异常。

使用DUAL表

DUAL表是Oracle系统中对所有用户可用的一个实际存在的表,是一个1行1列的表,这个表不能实际存储信息,也不具有任何其他的 意义,在实际应用中仅用来执行SELECT语句,如:

-- 查询当前系统日期
SELECT TO_CHAR (SYSDATE, 'yyyy-mm-dd hh24:mi:ss') FROM DUAL;
-- 查询当前系统用户
SELECT USER FROM DUAL;
-- 输出静态文本
SELECT 'hello' FROM DUAL;
-- 计算表达式
SELECT 500 * 60 FROM DUAL;
  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
编辑推荐 近15年来,成千上万的PL/SQL程序员──无论是初学者还是经验丰富的开发者──都同样需要依赖《Oracle PL/SQL程序设计》来帮助他们充分掌握和应用这门功能强大的语言。 第5版是基于Oracle数据库11g的R1、R2两个版本的最新版,包含了语法、建议、大量实例和许多新的信息。 ?了解新特征,包括基于版本的重定义功能、函数结果缓存功能、CONTINUE语句、复合触发器和针对大对象的SecureFiles。 ? 使用工具和技巧来优化PL/SQL性能,例如PL/Scope和PL/SQL中的层次化profiler。 ? 探讨了数据类型、条件控制语句和顺序控制语句、循环、异常处理、安全特性、全球化和本地化问题, 以及PL/SQL架构。 ? 通过使用过程、函数、触发器和包,建立模块化的PL/SQL应用。 内容推荐 《Oracle PL/SQL程序设计(第5版)》基于Oracle数据库11g,从PL/SQL编程、PL/SQL程序结构、PL/SQL程序数据、PL/SQL中的SQLPL/SQL应用构建、高级PL/SQL主题这6个方面详细系统地讨论了PL/SQL以及如何有效地使用它。本书能够帮助你充分利用PL/SQL来解决数据库开发中遇到的各种问题,引导你掌握各种构建应用的技巧和技术,以便使你编写出高效、可维护的代码。《Oracle PL/SQL程序设计(第5版)》不但介绍了大量的Oracle 11g的PL/SQL新性能,还提供了许多优化PL/SQL性能的新方法。   《Oracle PL/SQL程序设计(第5版)》结构清晰,示例丰富,实践性强,适用于Oracle数据库开发人员、Oracle数据库管理员等相关数据库从业人员,也可以作为各大、中专院校相关专业师生的参考用书和相关培训机构的培训教材。 目录: 目 录(上册) 第1部分 PL/SQL编程 第1章 PL/SQL概述 3 第2章 创建并运行PL/SQL代码 21 第3章 语言基础 50 第2部分 PL/SQL程序结构 第4章 条件和顺序控制 77 第5章 用循环进行迭代处理 96 第6章 异常处理 118 第3部分 PL/SQL数据 第7章 使用数据 159 第8章 字符串 182 第9章 数字 221 第10章 日期和时间戳 255 第11章 记录类型 297 第12章 集合 313 第13章 其他数据类型 381 第4部分 PL/SQL中的SQL 第14章 DML和事务管理 423 第15章 数据提取 444 第16章 动态SQL和动态PL/SQL 492 目 录(下册) 第5部分 构造PL/SQL应用程序 第17章 过程、函数与参数 543 第18章 包 593 第19章 触发器 626 第20章 管理PL/SQL代码 685 第21章 PL/SQL的性能优化 753 第22章 I/O操作和PL/SQL 843 第6部分 高级PL/SQL主题 第23章 应用安全与PL/SQL 887 第24章 PL/SQL架构 947 第25章 PL/SQL的全球化和本地化 993 第26章 PL/SQL的面向对象特性 1034 附录A 正则表达式的元字符和函数参数 1093 A.1 元字符 1093 A.2 函数和参数 1096 A.2.1 正则表达式函数 1096 A.2.2 正则表达式参数 1097 附录B 数字格式模型 1099 附录C 日期格式模型 1102
Oracle PL/SQLOracle数据库的编程语言,它允许开发人员编写存储过程、触发器、函数和包等数据库对象,以实现更高效、安全和可靠的应用程序。以下是一些Oracle PL/SQL必知必会的知识点: 1. PL/SQL基础语法:包括变量定义、控制结构、循环语句、异常处理等。 2. 存储过程:存储过程是一组SQL语句的集合,可以在其中定义变量、使用控制结构、调用其他存储过程等。 3. 触发器:触发器是一种特殊的存储过程,它会在数据库表上的特定事件发生时自动执行一些操作。 4. 函数:函数是一种可以接受输入参数并返回结果的代码块,它可以用于处理数据、计算等操作。 5. 包:包是一种可以封装存储过程、函数和变量的方式,它可以提供更好的代码管理和组织。 6. 游标:游标是一种可以遍历查询结果集的机制,它可以用于在PL/SQL中处理大量数据。 7. 动态SQL:动态SQL是一种可以在运行时构建和执行SQL语句的机制,它可以提供更大的灵活性和自由度。 8. 性能优化:在编写PL/SQL代码时需要注意性能问题,如尽量避免使用循环、减少数据库访问次数等。 9. 安全性:在编写PL/SQL代码时需要注意安全问题,如避免SQL注入攻击、对敏感数据进行加密等。 以上是Oracle PL/SQL必知必会的一些知识点,掌握它们可以帮助开发人员更好地使用Oracle数据库进行应用程序开发

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值