Oracle学习日记——单表查询(oracle 查询表)
mhr18 2024-09-14 05:34 27 浏览 0 评论
Oracle学习同样是从单表查询开始,本篇内容主要是Oracle单表查询,主要包括全表查询、模糊查询、返回固定条数、以及返回随机数据。
1.查询表中所有的行和列
select * from 表名 * 表示所有的列
2.从表中检索部分行
select * from 表名 where 条件
eg:查询工资高于3000的员工信息
select * from emp where salary > 3000
3.查找空值
错误示例:查询工资为空的员工信息 select * from emp where salary = null;
错误原因:null 不能用 = 运算符,要用is null
正确写法:select * from emp where salary is null
同理,判断工资不为空: select * from emp where salary is not null;
注:null不支持加、减、乘、除、大小比较、相等比较,否则只能为空;
4.把空值转换为实际值
4.1:coalesce()查询第一个不是空值的值,括号里参数可以有多个
测试用例:
(1)在数据库中创建视图v,创建视图语句如下:
create or replace view v as
select null as c1,null as c2,1 as c3,null as c4,2 as c5,null as c6 from dual
union all
select null as c1,null as c2,null as c3,3 as c4,2 as c5,null as c6 from dual ;
(2)查询视图v
select * from v;
(3)用coalesce()函数查询
select coalesce(c1,c2,c3,c4,c5,c6) as c from v;
比较2和3的查询结果理解coalesce;
4.2:nvl(要转换的列,要转换的值)
nvl()用法举例:把工资是空值的值在查询结果中用0代替
select nvl(salary,0) from emp;
5.查询满足多个条件的行
and 和 or 连接
eg: (1)查询部门编码为10且工资高于3000的员工信息
select * from emp where salary > 3000 and deptno = 10
(2)查询部门编码为10或工资高于3000的员工信息
select * from emp where salary > 3000 or deptno = 10
注意:对于多个条件的组合,要使用括号,这样在更改维护语句是可以不必再考虑优先级问题,而且可以很容易的借助各种
工具找到各组合条件的起止位置。
6.从表中检索部分列
select 列名1,列名2,列名3 from 表名
eg:select name,borndate,salary from emp;
7.为列取有意义的名称
select 列名1 别名1,列名2 别名2,列名3 别名3 from 表名
eg:select name 员工姓名,sex 性别,borndate 生日 from emp;
8.在where子句中引用取别名的列
注意:在where条件中引用取别名的列需要嵌套一层,因为这个别名是在select以后才生效的;
select * from
(select salary 工资,name 姓名 from emp
) x
where 工资 > 3000;
9.拼接列
(1)希望返回的数据是特定格式,比如“张三的工资是3000元”
select name || '的工资是' ||salary || '元' from emp;
|| 把查询的内容拼接起来, 自己手动加的内容是字符串,要用单引号''框起来。
(2)进行批处理的时候可以生成批处理的语句 //不同语句的拼接。
10.在select语句中使用条件逻辑
case when 语句的用法
select name,salary,
case
when salary <=2000 then '过低'
when salary >=4000 then '过高'
else 'OK'
END AS STATUS
from emp;
eg:查询报表统计各个工资段的总人数
select 档次,count(*) as 人数
from (
select (
case
when salary <= 1000 then '0000-1000'
when salary <= 2000 then '1000-2000'
else '工资好高'
end
) as 档次,
name,salary from emp
) group by 档次
order by 1;
11.限制返回的行数
在查询的时候,并不是每次都需要查询所有的数据,比如,在抽查的时候只要求返回两条数据
可以用伪列rownum来过滤,rownum会对返回的每一条数据做一个标识
eg:select * from emp where rownum <= 2;
但是,如果直接用select * from emp where rownum = 2 查询是没有结果返回的
因为,rownum是对返回的数据做标记的,所以,需要把需要的数据返回来,才能进行取值,
select * from
(select rownum as sn,emp.* from emp) where sn = 2;
12.从表中随机返回n条数据
为了防止作假,需要对数据进行随机排序
使用dbms_random来进行随机排序
eg:select name
from (
select empno,name from emp order by dbms_random.value()
) where rownum <=3;
这里为什么要使用嵌套查询?
因为执行顺序的原因,在这个语句里面对数据库有三个操作:查询,生成序号,排序
因为是随机取数,所以我们应该先生成序号,再进行排序,最后取出数据;
如果不进行嵌套,会先取出数据,再进行嵌套,每次取出的结果都一样,达不到随机的效果。
验证方法(该写法错误):
select rownum 排序后,排序前,name 姓名 ran 随机数 from
(
select rownum 排序前,name,dbms_random.value ran
from emp
where rownum <=3
order by ran
);
13.模糊查询
测试用例:
建立视图v
CREATE OR REPLACE VIEW V AS
select 'ABCDEF' as vname FROM DUAL
UNION ALL
SELECT '_BDEFG' as vname FROM DUAL
UNION ALL
SELECT '_BCEDF' as vname FROM DUAL
UNION ALL
SELECT '_\BCEDF' as vname FROM DUAL;
查询包含BCD的信息
select * from v where vname like '%BCD%'
%被称为通配符(替代一个或多个字符)
数据库查询中有两个通配符,% 和 _
二者意思完全相同,
考虑一种情况,查询字符串中包含'_dfgh'的字符串
select * from v where vname like '_dfgh%'
如果正好有字符串为'asdfgh',也会做为查询结果被查询出来,因为系统把'_'作为通配符进行处理
解决方法:使用转义字符
select * from v where vname like '_\dfgh%' escape '\';
使用\对_ 进行了转义,使其不是本来的意思;
对于模糊查询条件中有“%”的处理方法和上面相同;
相关推荐
- 如何检查 Linux 服务器是物理服务器还是虚拟服务器?
-
在企业级运维、故障排查和性能调优过程中,准确了解服务器的运行环境至关重要。无论是物理机还是虚拟机,都存在各自的优势与限制。在很多场景下,尤其是当你继承一台服务器而不清楚底层硬件细节时,如何快速辨识它是...
- 第四节 Windows 系统 Docker 安装全指南
-
一、Docker在Windows上的运行原理(一)架构限制说明Docker本质上依赖Linux内核特性(如Namespaces、Cgroups等),因此在Windows系统上无法直...
- C++ std:shared_ptr自定义allocator引入内存池
-
当C++项目里做了大量的动态内存分配与释放,可能会导致内存碎片,使系统性能降低。当动态内存分配的开销变得不容忽视时,一种解决办法是一次从操作系统分配一块大的静态内存作为内存池进行手动管理,堆对象内存分...
- Activiti 8.0.0 发布,业务流程管理与工作流系统
-
Activiti8.0.0现已发布。Activiti是一个业务流程管理(BPM)和工作流系统,适用于开发人员和系统管理员。其核心是超快速、稳定的BPMN2流程引擎。Activiti可以...
- MyBatis动态SQL的5种高级玩法,90%的人只用过3种
-
MyBatis动态SQL在日常开发中频繁使用,但大多数开发者仅掌握基础标签。本文将介绍五种高阶技巧,助你解锁更灵活的SQL控制能力。一、智能修剪(Trim标签)应用场景:动态处理字段更新,替代<...
- Springboot数据访问(整合Mybatis Plus)
-
Springboot整合MybatisPlus1、创建数据表2、引入maven依赖mybatis-plus-boot-starter主要引入这个依赖,其他相关的依赖在这里就不写了。3、项目结构目录h...
- 盘点金州勇士在奥克兰13年的13大球星 满满的全是...
-
见证了两个月前勇士与猛龙那个史诗般的系列赛后,甲骨文球馆正式成为了历史。那个大大的红色标志被一个字母一个字母地移除,在周四,一切都成为了过去式。然而这座,别名为“Roaracle”(译注:Roar怒吼...
- Mybatis入门看这一篇就够了(mybatis快速入门)
-
什么是MyBatisMyBatis本是apache的一个开源项目iBatis,2010年这个项目由apachesoftwarefoundation迁移到了googlecode,并且改名为M...
- Springboot数据访问(整合druid数据源)
-
Springboot整合druid数据源基本概念SpringBoot默认的数据源是:2.0之前:org.apache.tomcat.jdbc.pool.DataSource2.0及之后:com.z...
- Linux 中的 "/etc/profile.d" 目录有什么作用 ?
-
什么是/etc/profile.d/目录?/etc/profile.d/目录是Linux系统不可或缺的一部分保留配置脚本。它与/etc/profile文件相关联,这是一个启动脚本,该脚...
- 企业数据库安全管理规范(企业数据库安全管理规范最新版)
-
1.目的为规范数据库系统安全使用活动,降低因使用不当而带来的安全风险,保障数据库系统及相关应用系统的安全,特制定本数据库安全管理规范。2.适用范围本规范中所定义的数据管理内容,特指存放在信息系统数据库...
- Oracle 伪列!这些隐藏用法你都知道吗?
-
在Oracle数据库中,有几位特殊的“成员”——伪列,它们虽然不是表中真实存在的物理列,但却能在数据查询、处理过程中发挥出意想不到的强大作用。今天给大家分享Oracle伪列的使用技巧,无论...
- Oracle 高效处理数据的隐藏神器:临时表妙用
-
各位数据库搬砖人,在Oracle的代码世界里闯荡,处理复杂业务时,是不是总被数据“搅得头大”?今天给大家安利一个超实用的隐藏神器——临时表!当你需要临时存储中间计算结果,又不想污染正式数据表...
- Oracle 数据库查询:多表查询(oracle多表关联查询)
-
一、多表查询基础1.JOIN操作-INNERJOIN:返回两个表中满足连接条件的匹配行,不保留未匹配数据。SELECTa.emp_id,b.dept_nameFROMempl...
- 一文掌握怎么利用Shell+Python实现多数据源的异地备份程序
-
简介:在信息化时代,数据安全和业务连续性已成为企业和个人用户关注的焦点。无论是网站数据、数据库、日志文件,还是用户上传的文档、图片等,数据一旦丢失,损失难以估量。尤其是当数据分布在多个不同的目录、服务...
你 发表评论:
欢迎- 一周热门
- 最近发表
-
- 如何检查 Linux 服务器是物理服务器还是虚拟服务器?
- 第四节 Windows 系统 Docker 安装全指南
- C++ std:shared_ptr自定义allocator引入内存池
- Activiti 8.0.0 发布,业务流程管理与工作流系统
- MyBatis动态SQL的5种高级玩法,90%的人只用过3种
- Springboot数据访问(整合Mybatis Plus)
- 盘点金州勇士在奥克兰13年的13大球星 满满的全是...
- Mybatis入门看这一篇就够了(mybatis快速入门)
- Springboot数据访问(整合druid数据源)
- Linux 中的 "/etc/profile.d" 目录有什么作用 ?
- 标签列表
-
- oracle位图索引 (74)
- oracle基目录 (50)
- oracle批量插入数据 (65)
- oracle事务隔离级别 (53)
- oracle主从同步 (55)
- oracle 乐观锁 (51)
- redis 命令 (78)
- php redis (88)
- redis 存储 (66)
- redis 锁 (69)
- 启动 redis (66)
- redis 时间 (56)
- redis 删除 (67)
- redis内存 (57)
- redis并发 (52)
- redis 主从 (69)
- redis 订阅 (51)
- redis 登录 (54)
- redis 面试 (58)
- 阿里 redis (59)
- redis 搭建 (53)
- redis的缓存 (55)
- lua redis (58)
- redis 连接池 (61)
- redis 限流 (51)