Oracle 学习(2)

过滤和排序数据

where条件过滤 

日期格式

查询10号部门的员工信息:SQL> select * from emp where deptno=10  

查询”KING”的信息:SQL> select * from emp where ename= 'KiNg '   未选定行。

注意:字符串大小写敏感

  SQL> select * from emp where ENAME='KING'; 则正确

查询入职日期为1981年11月17日的员工:

SQL> select * from emp where hiredate= '1981-11-17 '   可以吗?

参看:SQL> select sysdate from dual   查看系统当前的日期 (注意其格式)。

SQL> select * from emp where hiredate= '17-11月-81 '  

获取系统当前日期格式: SQL> select * from v$nls_parameters (数据字典,类似于tab)

设置列宽度:SQL> col parameter for a30  

修改日期格式:SQL> alter session set NLS_DATE_FORMAT = 'yyyy-mm-dd '  

再次查询:SQL> select * from emp where hiredate= '1981-11-17 '  

SQL> alter session set NLS_DATE_FORMAT = 'yyyy-mm-dd hh24:mi:ss' 显示带有时间的日期

SQL> select sysdate from dual 再次查看系统时间

改回系统默认格式:SQL> alter session set NLS_DATE_FORMAT = 'DD-MON-RR';

  1. 字符和日期要包含在单引号中
  2. 字符大小写敏感,日期格式敏感
  3. 默认的日期格式是 DD-MON-RR

比较运算

普通比较运算符:

=  等于(不是==) > 大于

>= 大于等于 < 小于

<= 小于等于 <> 不等于(也可以是!=)

查询薪水不等于1250的员工信息:SQL> select * from emp where sal <> 1250;

BETWEEN…AND: 介于两值之间。

查询工资在1000-2000之间的员工:

使用比较运算符:SQL> select * from emp where sal >=1000 and sal<2000  (注意第二个sal不能省)

用between and:SQL> select * from emp where sal between 1000 and 2000  

注意1.包含边界  2. 小值在前,大值在后。 (对于日期也是如此)

查询81年2月至82年2月入职的员工信息:

SQL> select * from emp where hiredate between '1-2月-81' and '30-1月-82' 

IN:在集合中。(not in 不在集合中)

查询部门号为10和20的员工信息:

(1)SQL> select * from emp where deptno=10 or deptno=20

(2)SQL> select * from emp where deptno in (10, 20)  

SQL> select * from emp where deptno not in (10, 20)   (30号部门的员工信息)

使用比较运算符该怎么写呢?

但是:如果是 ….. not in (10, 20, NULL) 可不可以呢?

☆NULL空值如果结果中含有NULL不能使用not in 操作符, 但可以使用in操作符。

课后思考为什么???

like:模糊查询‘%’匹配任意多个字符。‘_’匹配一个字符。

查询名字以S开头的员工:SQL> select * from emp where ename like 'S% '    (注意:S小写、大写不同)

查询名字是4个字的员工:SQL> select * from emp where ename like '_ _ _ _'  

增加测试例子:向表中插入员工:

SQL> insert into emp(empno, ename, sal, deptno) values(1001, ' TOM_ABC ', 3000, 10)  

SQL> delete from emp where empno=8888;

查询名字中包含_的员工:

SQL> select * from emp where ename like '% _ % ' 正确吗?

转义字符:

SQL> select * from emp where ename like '%\_% ' escape '\'  

转义单引号本身:

SQL> select 'hello '' world' from dual   使用两个单引号来完成转义

逻辑运算

AND   逻辑并

OR 逻辑或

NOT   逻辑非

如果…..where 表达式1 and 表达式2;

…..where 表达式2 and 表达式1; 这两句SQL语句功能一样吗?效率一样吗?

※SQL优化

SQL在解析where的时候是从右至左解析的。 所以: and时应该将易假的值放在右侧

or时应该将易真的值放在右侧

order by 排序

  1. 使用 ORDER BY 子句排序
    • ASC(ascend): 升序。默认采用升序方式。
    • DESC(descend): 降序
  2. ORDER BY 子句在SELECT语句的结尾。

SELECT   last_name, job_id, department_id, hire_date

FROM     employees

ORDER BY hire_date ;

查询员工信息,按月薪排序:SQL>  select * from emp order by sal   结尾加desc (descending)降序

order by 之后可以跟那些内容呢?

   order by + 列名表达式别名序号。 注意:语法要求order by 子句应放在select的结尾。

SQL> select  ename, sal, sal*12  from emp order by sal * 12 desc  

序号:默认:ename→1, sal→2,sal*12→3

SQL> select  ename, sal, sal*12, from emp order by 2 desc   按月薪进行排序。

如果:SQL> select * from emp order by deptno, sal 会怎么样排序呢?

order by后有多列时,列名之间用逗号隔分,order by会同时作用于多列。上例的运行结果会在同一部门内升序,部门间再升序。

SQL> select * from emp order by deptno, sal desc 逆序呢?

desc 只作用于最近的一列两列都要降序排则需要两个desc。即:

SQL> select * from emp order by deptno desc, sal desc   

查询员工信息, 按奖金由高到低排序:

SQL> select * from emp order by comm desc

结果前面的值为NULL, 数据在后面,如果是一个100页的报表,这样显示肯定不正确。较为人性化的显示应该将空值放在最后, 即:

SQL> select * from emp order by comm desc nulls last (注意:是nulls 而不是null)

  1. 排序的规则
    • 可以按照select语句中的列名排序
    • 可以按照别名列名排序
    • 可以按照select语句中的列名的顺序值排序
    • 如果要按照多列进行排序,则规则是先按照第一列排序,如果相同,则按照第二列排序;以此类推

单行函数

单行函数:只对一行进行变换,产生一个结果。函数可以没有参数,但必须要有返回值。如:concat、nvl

  1. 操作数据对象
  2. 接受参数返回一个结果
  3. 只对一行进行变换
  4. 每行返回一个结果
  5. 可以转换数据类型
  6. 可以嵌套
  7. 参数可以是一列或一个值

字符函数

操作对象是字符串。

大致可分为两大类:一类是大小写控制函数,主要有lower、upper、initcap:

SQL> select lower('HeLlo, WORld') 转小写, upper('HellO, woRld') 转大写, initcap('hello, world') 首字母大写   from dual    

另一类是字符控制函数:有CONCAT、SUBSTR、LENGTH/LENGTHB、INSTR、LPAD | RPAD、TRIM、REPLACE

substr(a, b):从a中,第b位开始取(计数从1开始),取到结尾

SQL> select substr('helloworld', 3) from dual     

substr(a, b, c):从a中,第b位开始,向右取c位。   

SQL> select substr('hello world', 3, 5) from dual   

length:字符数, lengthb:字节数:

SQL> select length('hello world') 字符数, lengthb('hello world') 字节数 from dual;

select length('hello world') "字符数", lengthb('hello world') "字节数" from dual;

注意中英文差异。

instr:在母串中查找子串, 找到返回下标,计数从1开始。没有返回0

SQL> select instr('hello world', 'llo') from dual   

lpad:左填充,参1:待填充的字符串,参2:填充后字符串的总长度(字节), 参3:填充什么  rpad:右填充。

SQL> select lpad('abcd', 10, '*') 左, rpad('abcd', 10, '#') 右 from dual  

SQL> select lpad('abcd', 15, '你')左填充, rpad('abcd', 16, '我') 右填充 from dual    

trim:去掉前后指定的字符

SQL> select trim('H' from 'Hello worldH') from dual  

注意语法期间含有from关键字

replace:替换

SQL> select replace('hello world', 'l', '*') from dual  

删除字符串'hello world'中的字符'l':

SQL> select replace('hello world', 'l', '') from dual   

数值函数

  1. ROUND: 四舍五入

ROUND(45.926, 2) 45.93

  1. TRUNC:  截断

TRUNC(45.926, 2) 45.92

  1. MOD: 求余

MOD(1600, 300) 100

round(45.926, 2)  2表达的含义是保留两位小数,第二个参数如果是0可以省略不写。

SQL> select round(45.926, 2) 一, round(45.926, 1) 二, round(45.926, 0) 三,  round(45.926, -1) 四, round(45.926, -2) 五 from dual     

将上例中的所有round  替换为 trunc

正、负表示小数点之后,或小数点以前的位数。

SQL> select mod(1600, 600) from dual   

时间函数

在Oracle中日期型的数据,既有日期部分,也有时间部分。

SQL> select sysdate from dual; (这里没有时间部分,因为系统默认的格式中不显示时间)

SQL> select to_char(sysdate, 'yyyy-mm-dd hh24:mi:ss') from dual  

SQL> select to_char(sysdate, 'day') from dual  可以显示当前日期星期几

日期加减数字得到的结果仍为日期单位

显示 昨天、今天、明天:

SQL> select (sysdate-1) 昨天, (sysdate) 今天, (sysdate + 1) 明天 from dual  

SQL> select to_char(sysdate-1, 'yyyy-mm-dd') 昨天, to_char(sysdate, 'yyyy-mm-dd') 今天, to_char(sysdate+1, 'yyyy-mm-dd') 明天 from dual    

既然一个日期型的数据加上或者减去一个数字得到的结果仍为日期,两个日期相减,得到的就是相差的天数。

计算员工的工龄:

SQL> select ename, hiredate, (sysdate - hiredate) 天, (sysdate - hiredate)/7 星期, (sysdate - hiredate)/30 月, (sysdate - hiredate)/365 年 from emp  

注意:日期和日期可以相减,但是不允许相加。  日期只能和数字相加!

SQL> select sysdate+hiredate from emp  

日期函数

上面求取员工工龄的结果不精确,如果想将其算准确,可以使用日期函数来做。  

months_between:两个日期值相差的月数(精确值) 跟between…and无关

SQL> select ename, hiredate, (sysdate-hiredate)/30 一, months_between(sysdate, hiredate) 二 from emp 

add_months:在某个日期值上,加上多少的月,正数向后计算,负数向前计算。

计算95个月以后是哪年、哪月、那天:

SQL> select add_months(sysdate, 95) 哪一天 from dual  

last_day:日期所在月的最后一天。

SQL> select last_day(sysdate) from dual  

next_day:指定日期的下一个日期

SQL> select next_day(sysdate, '星期一') from dual 从当前时间算起,下一个星期一

round、trunc 对日期型数据进行四舍五入和截断

SQL> select round(sysdate, 'month'), round(sysdate, 'year') from dual  

SQL> select trunc (sysdate, 'month'), round(sysdate, 'year') from dual  

转换函数

在不同的数据类型之间完成转换。将“123” 转换为 123。有隐式转换和显示转换之分。

隐式转换:

SQL> select * from emp where hiredate = '17-11月-81'  由Oracle数据库来做

显示转换:

SQL> select to_char(sysdate, 'yyyy-mm-dd hh24:mi:ss') from dual 通过转换函数来完成。

隐式转换,前提条件是:被转换的对象是可以转换的。 (ABC→625 可以吗?)

显示转换:借助to_char(数据,格式)、to_number、to_date函数来完成转换。 

 

如果隐式转换和显示转换都可以使用,应该首选哪个呢?

※SQL优化:如果隐式、显示都可以使用,应该首选显示,这样可以省去Oracle的解析过程。

练习:在屏幕上显示如下字符串:

 2015-05-11 16:17:06 今天是 星期一

SQL> select to_char(sysdate, 'yyyy-mm-dd hh24:mi:ss "今天是" day') from dual  

在固定的格式里加入自定义的格式,是可以的,必须要加“”

反向操作:已知字符串“2015-05-11 15:17:06 今天是 星期一”转化成日期。 to_date函数

SQL> select to_date('2015-05-11 15:17:06 今天是 星期一', 'yyyy-mm-dd hh24:mi:ss "今天是" day') from dual

 

查询员工的薪水:2位小数, 本地货币代码, 千位符

SQL> select to_char(sal, 'L9,999.99') from emp    'L9,999.99'之间没有空格

将¥2,975.00转化成数字:

SQL> select to_number('¥2,975.00', 'L9,999.99') 转成数字 from dual  

通用函数(了解)

这些函数适用于任何数据类型,同时也适用于空值

  1. NVL (expr1, expr2)
  2. NVL2 (expr1, expr2, expr3)
  3. NULLIF (expr1, expr2)
  4. COALESCE (expr1, expr2, ..., exprn)

nvl2: 是nvl函数的增强版。 nvl2(a, b, c)   当a = null 返回 c, 否则返回b

使用nvl2求员工的年收入:

SQL> select empno, ename, sal, sal*12, sal * 12 + nvl2(comm, comm, 0) 年薪 from emp   

nullif: nullif(a, b) 当 a = b 时返回null, 不相等的时候返回a值。

SQL> select nullif('L9,999.99', 'L9,999.99') from dual  

coalesce: coalesce(a, b, c, …, n) 从左向右找参数中第一个不为空的值。

SQL> select comm, sal, coalesce(comm, sal) 结果值 from emp   

条件表达式

例子:老板打算给员工涨工资, 要求:

总裁(PRESIDENT)涨1000,经理(MANAGER)涨800,其他人涨400. 请将涨前,涨后的薪水列出。

select ename, job, sal 涨前薪水, 涨后薪水 from emp 涨后的薪水是根据job来判断的

思路: if 是总裁('PRESIDENT')  then +1000

else if 是经理('MANAGER')  then +800

else +400

但是在SQL中无法实现if else 逻辑。当有这种需求的时候,可以使用case 或者 decode

case 是一个表达式,其语法为:

CASE expr  WHEN comparison_expr1 THEN return_expr1

            [WHEN comparison_expr2 THEN return_expr2

            WHEN comparison_exprn THEN return_exprn

            ELSE else_expr]

END

SQL> select ename, job, sal 涨前薪水, case job when 'PRESIDENT' then sal+1000

    when 'MANAGER' then sal+800

    else sal + 400

end 涨后薪水 

  from emp  

注意语法:when then 与下一个when then以及end之间没有“,”分割符。

decode:是一个函数,其语法为:

DECODE(col|expression, search1, result1

          [, search2, result2,...,]

          [, default])

除第一个和最后一个参数之外,中间的参数都是成对呈现的 (参1, 条件, 值, 条件, 值, …, 条件, 值, 尾参)

SQL> select ename, job, sal 涨前薪水, decode(job, 'PRESIDENT', sal + 1000,  

    'MANAGER', sal + 800,  

    sal + 400)  as 涨后薪水

  from emp  

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/577954.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Navicat误删除生产环境SQLServer2012单表数据后恢复单表数据

背景&#xff1a; 1-后端更新功能部署到客户生产环境时误将测试环境数据保留&#xff0c;项目负责人发现后告知后端。 2-后端登录客户生产数据库使用navicat删除一张表的单表数据时多删了几条数据&#xff0c;判断弄乱了客户生产环境下自己产生的单表数据。 思路&#xff…

直通车定义、功能以及扣费原则

1.直通车是天猫付费搜索广告&#xff0c;即时需求&#xff0c;是消费者主动来搜索的&#xff0c;cpc扣费原则&#xff0c;一般用来拉新或者收割客户&#xff1b; 2.一般关键词优先&#xff0c;人群溢价是用来更精准投放的&#xff0c;可以不投溢价人群&#xff1b; 3.溢价人群…

什么是数据分析思维

参考 一文学会如何做电商数据分析&#xff08;附运营分析指标框架&#xff09; 电子商务该如何做数据分析&#xff1f;如何数据分析入门&#xff08;从各项指标表象进入&#xff09; https://www.processon.com/outline/6589838c3129f1550cc69950 数据分析步骤 什么是数据分析…

IP 地址归属地查询

IP 地址归属地查询 1. IP 地址归属地查询2. IP 地址归属地查询References 1. IP 地址归属地查询 https://tool.lu/ip/index.html 2. IP 地址归属地查询 https://www.ip.cn/ip/.html References [1] Yongqiang Cheng, https://yongqiang.blog.csdn.net/

【FPGA】分享一些FPGA高速信号处理相关的书籍

在做FPGA工程师的这些年&#xff0c;买过好多书&#xff0c;也看过好多书&#xff0c;分享一下。 后续会慢慢的补充书评。 【FPGA】分享一些FPGA入门学习的书籍【FPGA】分享一些FPGA协同MATLAB开发的书籍 【FPGA】分享一些FPGA视频图像处理相关的书籍 【FPGA】分享一些FPGA高速…

Unity | 渡鸦避难所-4 | 镜头跟随角色移动

1 Cinemachine 简介 在第一人称视角的游戏中&#xff0c;摄像机需要时刻跟随角色移动。除了手动计算摄像机的位置、旋转外&#xff0c;也可以使用 Unity 提供的 Cinemachine 插件来轻松实现摄像机的控制 Cinemachine 是一套用于操作 Unity 相机的模块&#xff0c;解决了跟踪目…

分布式系统架构设计之分布式数据管理

随着互联网时代的不断发展&#xff0c;分布式系统架构成为支撑大规模用户和高并发访问的基础。在构建分布式系统时&#xff0c;分布式系统有着一系列的要求以及对应的核心技术&#xff0c;涉及到数据管理、通信安全性、性能优化、可扩展性设计以及架构演进与版本管理等很多方面…

Shell 脚本基础

Shell脚本 脚本以#!/bin/bash开头 执行方式 直接使用文件名执行&#xff1a;文件需要执行权限 以bash xxx.sh来执行, 本质上是bash解析器去执行, 文件作为一个输入, 因此可以不需要执行权限 变量 系统变量 自定义变量 定义变量 # 定义一个变量username, 注意不能有多余…

实战 9 权限菜单管理

目录 1、权限菜单后端接口 2、查询权限菜单列表 2.1 设计效果图 2.2 menuList.vue 3、 新增权限菜单 3.1 新增权限菜单窗口代码 3.2 选择所属菜单代码 3.3 封装图标选择器 3.4 新增、编辑和删除权限菜单 1、权限菜单后端接口 package com.cizhu.service;import com.ci…

C# WPF上位机开发(子窗口通知父窗口更新进度)

【 声明&#xff1a;版权所有&#xff0c;欢迎转载&#xff0c;请勿用于商业用途。 联系信箱&#xff1a;feixiaoxing 163.com】 这两天在编写代码的时候&#xff0c;正好遇到一个棘手的问题&#xff0c;解决之后感觉挺有意义的&#xff0c;所以先用blog记录一下&#xff0c;后…

基于flask和echarts的新冠疫情实时监控系统源码+数据库,后端基于python的flask框架,前端主要是echarts

介绍 基于flask和echarts的新冠疫情实时监控系统 软件架构 后端基于python的flask框架&#xff0c;前端主要是echarts 安装教程 下载到本地&#xff0c;在python相应环境下运行app.py,flask项目部署请自行完成 使用说明 flaskProject文件夹中 app.py是flask项目主运行文…

Android Studio解决:Connect time out问题

目录 前言 一、错误信息 二、解决方法 三、更多资源 前言 当您尝试建立网络连接时&#xff0c;如果连接的建立时间超过了预设的时间限制&#xff0c;就会出现"Connect time out"的错误提示。这通常是由于网络连接问题、服务器故障或网络延迟等原因导致的。 一、…

ARM Cortex-A学习(1):GIC(通用中断控制器)详解

文章目录 1 Cortex-A核中断1.1 处理器模式1.2 IRQ模式 2 GIC的操作2.1 CPU Interface2.2 Distributor GIC(通用中断控制器, Generic Interrupt Controller)是一种用于处理中断的硬件组件&#xff0c;它的主要功能是协调和管理系统中的中断请求&#xff0c;确保它们被正确地传递…

VD6283TX环境光传感器(1)----获取光强和色温

VD6283TX环境光传感器.1--获取光强和色温 概述视频教学样品申请完整代码下载主要特点硬件准备技术规格系统框图生成STM32CUBEMX串口配置IIC配置X-CUBE-ALS演示结果光强测试表 概述 为了充分利用VD6283TX传感器的特性和功能&#xff0c;本章节重点介绍了如何捕获光强度和相关色…

QT foreach

原型&#xff1a;foreach(variable, container) container&#xff1a;容器&#xff0c;即被遍历的对象 variable&#xff1a;当前元素&#xff0c;即遍历container过程中&#xff0c;当前的那个元素 代码&#xff1a; QStringList container { "1", "2&quo…

JVM 类加载子系统

1. 前言 ​ 虚拟机就是一款用来执行虚拟计算机指令的计算机软件。它相当于一台虚拟计算机。大体上&#xff0c;虚拟机分为系统虚拟机和程序虚拟机。系统虚拟机就相当于一台物理电脑&#xff0c;里面可以安装操作系统&#xff1b;程序虚拟机是为了执行单个计算机程序而设计出来…

Linux文件编程

目录 1、Linux系统提供的文件编程API 1.1打开文件&#xff1a;open 1.2创建文件creat函数 1.3写入文件write函数 1.4读取文件read函数 1.5文件光标位置lseek函数 2、另外一组文件编程API 2.1文件打开函数fopen 2.2读文件函数fread 2.3写文件函数fwrite 2.4文件光标位…

vscode中使用GitHub Copilot Chat

文章目录 一、什么是Github Copilot Chat二、安装使用三、如何使用1. 聊天功能2. 内联功能 一、什么是Github Copilot Chat GitHub Copilot Chat 由 OpenAI 的 GPT-4 大型多模态模型提供支持&#xff0c;能带来更准确的代码建议、解释和指导。GitHub Copilot Chat 的内联功能可…

计算机毕业设计 基于SpringBoot的高校宣讲会管理系统的设计与实现 Java实战项目 附源码+文档+视频讲解

博主介绍&#xff1a;✌从事软件开发10年之余&#xff0c;专注于Java技术领域、Python人工智能及数据挖掘、小程序项目开发和Android项目开发等。CSDN、掘金、华为云、InfoQ、阿里云等平台优质作者✌ &#x1f345;文末获取源码联系&#x1f345; &#x1f447;&#x1f3fb; 精…

关于Python里xlwings库对Excel表格的操作(十九)

这篇小笔记主要记录如何【取消合并单元格】。 前面的小笔记已整理成目录&#xff0c;可点链接去目录寻找所需更方便。 【目录部分内容如下】【点击此处可进入目录】 &#xff08;1&#xff09;如何安装导入xlwings库&#xff1b; &#xff08;2&#xff09;如何在Wps下使用xlwi…