Oracle入门笔记(五)——Oracle表间关系、SQL语句、基本函数

2023-11-09

1.引言

    可能你也发现了,这些文章讲的不是很细致,因为我尝试过多种数据库的开发,虽然使用的不是很深,但是对于这些数据库有一些了解,所以不会以数据库本身重要的知识点作为重点,而是把忘掉或者不了解的知识点作为核心。看完之后应该能够弥补在MySQL中学习的不足,因为同为市场占比比较高的数据库,二者在功能上必定存在较大的相似之处,可以弥补对MySQL了解上的不足。

2.数据库的收费问题

    Oracle软件本身是免费的,所以任何人都可以从Oracle官方网站下载并安装Oracle的数据库软件,收费的是License,即软件授权,如果数据库用于商业用途,就需要购买相应Oracle产品的License。如果只是学习或教育用途那么是免费的。MySQL 的版本相对要多很多,分社区版和商业版。社区版是免费的,商业版要收费:
1、MySQL Community Server 社区版本,开源免费,但不提供官方技术支持(咱一般使用的就是这个)。
2、 MySQL Enterprise Edition 企业版本,需付费,可以试用30天。
3、 MySQL Cluster 集群版,开源免费。可将几个MySQL Server封装成一个Server。
4、 MySQL Cluster CGE 高级集群版,需付费。

3.数据库对SQL标准的兼容性

    SQL其实是SQL 是一门 ANSI 的标准计算机语言,用来访问和操作数据库系统,SQL也像javascript一样有语言版本的迭代(这里主要是想说es6语法),最新的SQL为SQL99,比较有名的是SQL86、SQL92和SQL99。Oracle数据库的兼容性由于带有较为浓厚的商业色彩,兼容性相对于MySQL要好一些。Oracle支持SQL99标准,MySQL从5.7开始支持SQL99。SQL语言本身向下兼容,即高版本兼容低版本。另外SQL92版在MySQL中的支持效果相对差一些,比如虽然支持左关联、右关联,但是不支持全关联。
    其次,需要明白一点,除了IOS推出的SQL标准外,某些数据库厂商可能会对SQL的功能进行一波私有扩展,但这会产生一些兼容性问题。

4.SQL语言的种类

    整体上,SQL语言包含查询增加修改删除,事务处理(commitrollbacksavepoint等)、数据控制(或者称为权限管理,grantrevoke管理权限)。

5.Oracle中的HR用户

    首先,明确一点HR用户不同于用于联系和测试的scott用户。HR用户默认是锁定状态,并且密码单次有效。需要通过system级别用户(sysdba或者system)来解除锁定,设置密码才能够使用。scott是演示用户,hr是示例用户,是在创建数据库的时候选中“示例数据库产生的”,实际就是模拟了一个人力资源部的数据库。本质上二者区别不是很大,都是为了学习使用。使用举例如下:
在这里插入图片描述

6.Oracle中基本的SQL语句的使用

    接下主要是一些Oracle的HR靶场中使用操作数据库的方式,主要是为了复习数据库的操作方式,同时使自己更加数据Oracle数据库(被操作的数据均都是来自于HR靶场)。
(1)别名的使用,需要明确别名加不加as都可以,别名默认直接会被转化成大写,如果在别名中需要区分大小写或者是存在空格等非法字符,可以使用引号包裹:
在这里插入图片描述
(2)连字符||的使用,用于拼接两个字符串:
在这里插入图片描述
(3)distinct去重的使用:
在这里插入图片描述
说明:需要注意的是distinct需要紧跟在select后面,并且distinct影响的是后面的所有字段,也就是说如果是select distinct job_id,first_name,表示的是(job_id,first_name)合起来不一致:
在这里插入图片描述
(4)desc显示某张表的表结构:
在这里插入图片描述
(5)小tips,在书写SQL语句的时候,可以先写需要查询的表,这样SQL查询就能够提供相应的数据字段提示,方便我们更快速的书写SQL语句。
(6)在Oracle中,字符串和日期的值通常放在单引号中(但是表名还是使用双引号,只要不冲突,一般二者都行),字符值区分大小写,日期格式被固定为DD-MON-RR(日-月-年,并且年份采用两位计数的),中文版的Oracle和英文版的Oracle在日期的表示上有区别,中文版月份为:“1月”,英文本对应的就是英文的拼写:“Jan”,举例如下(查询08年的雇员信息):
在这里插入图片描述
(7)developer修改字体的方式:
在这里插入图片描述
(8)Oracle不等于的表达方式有三种:!=<>^=(特别注意最后一种),例如查询工资不为2200的职员部分信息:
在这里插入图片描述
(9)between ... and...表示介于两者之间,in表示的是在什么范围之内,like表示模糊查询,需要注意like中的%(匹配的时候需要使用单引号定义规则,表示任意0个或多个字符,前面使用的'%08'匹配年份是没有问题的,因为多出字符没有使用%也算为不匹配和_(匹配单个字符):
在这里插入图片描述
(10)ESCAPE指定转义符号,因为前面提到了like语法中的匹配规则有%_,但是可能有些需要被匹配的字符里面本来就是要匹配这两个符号,也就是需要转义。ESCAPSE就能够实现这个目的,指定like模板中使用到的转义符号,eg:like 'SA\_%'ESCAPE'\'(这里表示的是指定\为转义符,ESCAPElike模板之间的空格可加可不加):
在这里插入图片描述
(11)为空判断is NULL或者is NOT NULL
在这里插入图片描述
(12)使用NOT逆转查询:
在这里插入图片描述
(13)优先级问题:算数运算>连字操作>比较操作>NULL判断和like in>between判断>NOT逻辑>and逻辑>or逻辑,感觉容易模糊或者必要时可以使用()来调整优先级。
(14)order by排序:
在这里插入图片描述

7.Oracle中基本函数的使用

    下面重头戏来了,主要介绍Oracle中的函数的使用,能够较大弥补自己在Mysql的学习中的不足(可能你像我一样,只知道嵌套查询,不知道MySQL中还有很多函数呢):
(1)大小写函数:

函数 结果 描述
lower(‘hello WORLD’) hello world 全部转成小写
upper(‘hello WORLD’) HELLO WORLD 全部转成大写
initcap(‘hello WORLD’) Hello World 首字母大写

使用如下:
在这里插入图片描述

(2)字符串相关函数:

函数 结果 描述
concat(‘hello’,‘world’) hello world 字符串拼接
substr(‘helloworld’,1,5) hello 字符串提取(下标(从1开始),长度)
length(‘hello world’) 11 返回字符串的长度
instr(‘helloworld’,‘w’) 6 返回字符下标(从1开始)
lpad(salary(假设这个值2400),10,‘*’) ******2400 指定字符左补偿函数
rpad(salary(假设这个值2400),10,‘*’) 2400****** 指定字符右补偿函数
trim(‘H’ from ‘Hello world’) ello world 剔除首尾指定字符函数

举个例子:
在这里插入图片描述
(3)数字相关函数:

函数 结果 描述
round(45.962,2) 45.96 指定小数位四舍五入
trunc(45.962) 45 截断小数部分,等价于[x]
mod(1600,300) 100 取模函数

(4)日期相关函数:

运算 结果 描述
sysdate 日期 获取当前日期
date+number 日期 加上天数到达另外一个日期
date-number 日期 减去天数到另外一个日期
date-date 天数 获取两个日期的时间差
date-number/24 日期 减去小时得到日期

在这里插入图片描述

函数 结果 描述
months_between(date1,date2) 数字 获取两个日期之间的月份差
add_months 日期 加上月份到达另外一个日期
next_day 日期 指定日期的下一天日期
last_day 日期 指定日期的上一天日期
round 日期 四舍五入,第二个参数(‘mm’,‘yy’(‘rr’),‘dd’)
trunc 日期 截断日期,参数和上面的round一样

eg:
获取员工的工作周数
在这里插入图片描述
(5)隐式数据类型转换:

起始数据类型 隐式转换之后的类型
varchar2 or char number
varchar2 or char date
number varchar2
date varchar2

在这里插入图片描述
需要明确的是,隐式转换有一定的缺陷:
a.隐式转换会导致索引失效(索引其实就是数据库自己包含的提高速度的对象),索引失效之后需要进行全表扫描,当数据量比较大的时候势必导致性能问题;
b.隐式转换不便于阅读,DBA很难明白到底发生了怎样的类型转换,特别是出错的时候,不容易轻易找出错误原因。
(6)显式类型转换:
a.日期到字符串的转换to_char(date,'format')format参数如下:

format参数 结果
YYYY 四位全年
year 年的英文拼写
mm 月份的两位数表示
month 月份的全名(中文就是汉字,eg:3月)
mon 月份的缩写(中文和month一样,eg:Jan)
dy 周中天的三个字母(中文和day一样,eg:Mon)
day 周中天的全名(中文即为:星期几)
dd 月的数字天数(两位)
下面的不是常用 了解即可
scc或者cc 返回世纪,带-服务器前缀B.C日期
SYYYY,SYEAR 年,带-服务器前缀B.C日期
YYYY,YYY,YY,Y 年的最后4,3,2,1个数字
Y,YYY eg:2,022
AD,BC 公元前缀,和S的功能差不多
RM 罗马数字月数(即罗马文字)
WW,W 年,月中的周数
DDD,DD,D 年,月,周中的天
说明:这里的服务器前缀估计是下面这样的,但是这个其实就是TIMESTAMP WITH TIME ZONE,没用过,由于这里使用的oracle其实是桌面类不是服务器,不能体现这个功能。

在这里插入图片描述
b.数字到字符串的转换to_char(date,'format')(一般是不需要的,但是有些时候我们需要转换并格式化),format参数如下:

format参数 结果
9 表示一个数,比如对178.88,使用模板999.9格式化就是保留一位小数,注意:模板表示的数据不能小于原始的数据
0 强制显示一个0
$ 放置一个$符号
L 使用浮动本地货币符号
. 打印一个小数点
打印一个千分指示位
fm 去除前面多余的空格

举例如下:
在这里插入图片描述
c.字符串到数字的转换to_number(str,'format')format参数和上面char转化数字一样:

format参数 结果
9 表示一个数,比如对178.88,使用模板999.9格式化就是保留一位小数,注意:模板表示的数据不能小于原始的数据
$ 放置一个$符号
L 使用浮动本地货币符号
. 打印一个小数点
注意:number由于类型特点是不支持,fm的,因为这些属于字符串范畴。同样数据还是需要被转化数据小于模板表示的数据,并且由于转数字,这里模板的小数位>=字符串数字。其次,对于货币的转换,$是不能直接转化成的。字符串中的货币符号需要与本地符号一致才能够使用L格式化。
d.字符串到日期的转换to_number(str,'format')format参数和上面char

转化日期一样:
在这里插入图片描述
(7)其他通用函数:

函数 描述
NVL NVL(exp1,exp2),即:exp1==NULL ? return exp2
NVL2 NVL2(exp1,exp2,exp3),即:exp1!=NULL ? exp2:exp3
NULLIF NULLIF(exp1,exp2),即:exp1==exp2 ? NULL:exp1
COALESCE COALESCE(exp1,exp2,…,expm),返回表达式中的第一个非空表达式

在这里插入图片描述

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Oracle入门笔记(五)——Oracle表间关系、SQL语句、基本函数 的相关文章

  • 如何终止正在运行的 SELECT 语句

    如何通过终止会话来停止正在运行的 SELECT 语句 该命令不断根据 SELECT 语句向我提供输出 我想在其间停止它 As you keep getting pages of results I m assuming you starte
  • 将游标中的数据合并为一个

    我有一个存储过程 它多次执行另一个存储过程 我需要联合并返回数据 这是在执行第二个过程后得到的 我可以以某种方式将多个游标中的数据合并到另一个游标中吗 没有临时表或类表数据类型是否可能 编辑 联合的游标计数实际上是 n 其中 n 是 1 2
  • 在 Oracle 中创建数据库链接时出错

    我有两个数据库 需要编写跨数据库查询 所以我试图创建一个数据库链接 CREATE PUBLIC DATABASE LINK DBLink CONNECT TO SchemaName IDENTIFIED BY 123 using DBNam
  • 用C++连接oracle数据库

    我正在寻找一种方法来连接到远程 Oracle 数据库并从 C 控制台应用程序中的表中读取一些数据 有人可以给我一些提示吗 谢谢 soci http soci sourceforge net http soci sourceforge net
  • 如何在可能为空值的字段上创建唯一索引(Oracle 11g)?

    这是包含 3 列的示例表 ID UNIQUE VALUE UNIQUE GROUP ID 我希望可以允许以下记录 1 NULL NULL 2 NULL NULL or 3 NULL 7 4 123 7 or 注意 此条件不允许unique
  • 如何列出表中的所有列?

    对于各种流行的数据库系统 如何列出表中的所有列 对于 MySQL 请使用 DESCRIBE name of table 只要您使用 SQL Plus 或 Oracle 的 SQL Developer 这也适用于 Oracle
  • 安装 OCI8:如何纠正“使用未定义常量 OCI_COMMIT_ON_SUCCESS”错误?

    我正在尝试在 RedHat 服务器 RHEL7 上为我的 Apache 服务器安装 OCI8 此时 当我尝试使用 Symphony 连接到我的服务器时 出现以下错误 异常 ErrorException 使用未定义的常量 OCI COMMIT
  • ORACLE:未找到数据——但数据存在

    调试包过程 当实际上有数据时却找不到数据 仅测试 SELECT SELECT trim trailing from GL SECURITY as DUMMY FROM b2k user b2k WHERE sms username FUCH
  • Oracle - 获取星期几

    今天是星期二 为什么当我运行这个 SQL 语句时 它说今天不是星期二 SELECT CASE WHEN TO CHAR sysdate Day Tuesday THEN Its Tuesday ELSE Its Not Tuesday EN
  • Oracle 删除约束级联等效于 Sql Server

    在Oracle中 删除约束PK SAI我使用语法 ALTER TABLE SAISIE DROP CONSTRAINT PK SAI CASCADE SQL Server 中与此等效的是什么 您正在考虑与实际 DELETE 语句相关的 FO
  • ORA-00933 与内部联接和“as”混淆

    我有一个使用以下命令从两个表中获取数据的查询inner join 但我收到错误SQL command not properly ended as 下面有一个星号 select P carrier id O order id O aircra
  • PLSql 返回值

    我再次使用一些 PLSql 我想知道 是否有任何方法可以像选择一样使用以下函数 而不必将其转换为函数或过程 这样我就可以从包含它的脚本中看到代码 代码如下 DECLARE outpt VARCHAR2 1000 flow rI VARCHA
  • Oracle Text:如何清理用户输入

    如果有人有使用 Oracle 文本的经验 CTXSYS CONTEXT 我想知道当用户想要搜索可能包含撇号的名称时如何处理用户输入 在某些情况下 转义 似乎有效 但对于单词末尾的 s 则不起作用 s 在停用词列表中 因此似乎已被删除 目前
  • 没有提示指令的直连接中表的顺序是否会影响性能?

    所有基于 SQL 的 RDBMS 10 年前的版本 直接连接查询 没有提示指令 中的表顺序是否会对最佳性能和内存管理产生影响 听说最后一个join应该是最大的表 您的数据库的查询优化器如何处理这种情况 回答你的问题 是的 表的顺序在连接中有
  • 存储过程错误 PLS-00201:必须声明标识符“UTL_HTTP”

    我正在尝试创建一个从服务请求一些 XML 数据的存储过程 我在网上找到了几个示例 它们都指向使用这个 UTL HTTP 包 但是 每次我尝试用它来编译我的存储过程时 我都会收到错误 PLS 00201 identifier UTL HTTP
  • 是否可以从子查询中获取多个值?

    有没有办法让子查询在oracle db中返回多列 我知道这个特定的sql会导致错误 但它很好地总结了我想要的 select a x select b y b z from b where b v a v from a 我想要这样的结果 a
  • 如何在oracle中将日期转换为时间戳(DD-MON-YYYY HH24:MI:SS.FF格式)?

    我尝试了下面的查询 但它不起作用 select TO TIMESTAMP ColumnName Data type Date DD MON YYYYHH24 MI SS FF from TableName where Changedate
  • 清除 Oracle 假脱机中的标题

    在运行下面的命令之前我已经假脱机了一个文件并得到了这样的输出 我已出发 反馈已关闭 SET HEADING OFF SET FEEDBACK OFF SPOOL D TEST TXT SELECT SYSDATE FROM DUAL SPO
  • Oracle - 将字符串与 utl_raw.cast_to_varchar2 函数的结果连接起来

    我正在尝试将字符串连接到结果utl raw cast to varchar2函数 也是一个字符串 它应该是透明的 但我无法将任何内容附加到结果中utl raw cast to varchar2 这是一个例子 select utl raw c
  • 根据最大值连接表

    这是我正在谈论的内容的一个简化示例 Table students exam results id name id student id score date 1 Jim 1 1 73 8 1 09 2 Joe 2 1 67 9 2 09 3

随机推荐

  • 交换a,b, 不使用中间变量

    第一种方法 a a b b a b a a b printf a d b d n a b 第二种方法 swap69 a b a b printf a d b d n a b void swap69 int a int b int pa in
  • 黑盒测试与白盒测试各自的优缺点

    黑盒测试的优点 1 比较简单 不需要了解程序内部的代码及实现 2 与软件的内部实现无关 3 从用户角度出发 能很容易的知道用户会用到哪些功能 会遇到哪些问题 4 基于软件开发文档 所以也能知道软件实现了文档中的哪些功能 5 在做软件自动化测
  • 使用 husky 进行Git提交前的代码校验和 commit msg检查

    husky 是一个 Git Hooks 工具 借助 husky 我们可以在 git 流程的不同生命周期进行一些自动化操作 本文主要介绍提交前 eslint 校验和提交时 commit 信息的规范校验 什么是 Git Hooks Git Ho
  • c调用python库_c中嵌入的python代码 – 导入python库时出错

    我试图使用嵌入在C程序中的 Python 3 5解释器从C接收图像 并将其用作我训练的张量流模型的输入 首先 我将我的图像转换为numpy数组 然后将其发送到python 这是我的简化代码 工作正常 从 here采用的代码 Python代码
  • web测试,App测试,小程序测试区别

    最近项目真的太忙了 不过 今天无论如何我都要更文章了 谢谢大家的支持 不断努力进步 这篇文章 我就是要梳理一下 web测试 app测试 和小程序的区别 话不多说 上主题 web测试 App测试 小程序测试 一 web测试 1 1 什么是we
  • JS时间戳转换方式

    前言 在js中将时间戳转换为常用的时间格式 有三种主要的方式 1 使用JS中已有的函数 例如getFullYear getMonth 等 将时间戳直接转换成对应的年月 2 创建时间过滤器 在其他的页面中直接调用该过滤器 转换时间戳 3 使用
  • 使用trtexec工具多batch推理tensorrt模型(trt模型)

    文章目录 零 pt转onnx模型 一 onnx转trt模型 二 推理trt模型 零 pt转onnx模型 参考 https github com ultralytics yolov5 用根目录下的export py可以转pt为onnx模型 命
  • Gem5模拟器,详解官网教程的statistics and output(三)

    gem5是一个计算机模拟器 它可以用来模拟不同类型的计算机系统 以帮助计算机科学家和工程师更好地理解和优化计算机系统的性能 gem5提供了许多统计信息和输出功能 可以帮助用户更好地了解模拟的计算机系统的性能情况 gem5的统计信息可以通过访
  • Ubuntu20.04配置ESP32-IDFV5.1环境及Component工程样例

    更新Ubuntu20 04下载源 cd etc apt 更新sources list为如下下载源 并保存 添加阿里源 deb http mirrors aliyun com ubuntu focal main restricted univ
  • 【Mac】mac安装go

    1 安装 安装 brew install go 这里采用界面安装 http c biancheng net view 3994 html 验证 go version base lcc lcc go version go version go
  • QT creator同时打开多个运行窗口(客户端窗口)

    一 最近在做TCP多连接server的问题 但是发现qt不能同时打开多个客户端窗口 解决办法 可以使用windows下的cmd命令窗口 用命令的方式运行多个客户端 我的客户端的名字是wbclient exe step1 首先通过cmd进入到
  • tomcat 开放远程调试端口

    1 开启远程调试端口 WIN系统 在catalina bat里 SET CATALINA OPTS server Xdebug Xnoagent Djava compiler NONE Xrunjdwp transport dt socke
  • perl脚本的简单调试方法

    初学perl语言 最先接触的不是它的语法 而是它的调试方法 当时是由于一个perl script生成的html页面无法正常显示 让我找出问题的原因 然后修复 当时是第一次接触perl 完全没有任何了解 就凭着学了几句在Teriminal中可
  • rtt下的adbd使用

    RTT 下的ADBD使用 1 引言 调试柿饼时 需要文件传输 由于智龙平台的RTT环境下USB还没有调试好 这里就使用ADB进行文件传输 找到了何元杰的帖子 并参考 rdb 建立 RTT与PC 的文件传输通道 2 使用环境 2 1 硬件平台
  • 5万条药品数据库下载数据,带图片

    链接 https pan baidu com s 1zBytf7BGty I3FCBPF2PxA 提取码 fshp
  • C#,入门教程(02)—— Visual Studio 2022开发环境搭建图文教程

    如果这是您阅读的本专栏的第一篇博文 建议先阅读如何安装Visual Studio 2022 C 入门教程 01 Visual Studio 2022 免费安装的详细图文与动画教程https blog csdn net beijinghorn
  • 富爸爸穷爸爸

    有意思的观点 1 贫穷和破产的区别 破产是暂时的 而贫穷是永久的 2 我们听说过穷人买彩票中奖的故事 他们一下子暴富起来 但不久又变穷了 还有关于职业运动员的故事 有一个运动员在24岁的时候 一年就挣了几百万美元 但到了34岁的时候却露宿桥
  • java中反射机制的主要作用

    C 自身并没有提供像Java这样完备的反射机制 只是提供了非常简单的动态类型信息 如type info和typeid 然而在一些C 的第三方框架类库中提供了类似的功能 如MFC QT 其中MFC是通过宏的方式实现 QT是通过自己的预编译实现
  • verilog中include的用法

    Verilog 的 include和C语言的include用法是一样一样的 要说区别可能就在于那个点吧 include一般就是包含一个文件 对于Verilog这个文件里的内容无非是一些参数定义 所以 这里再提几个关键字 ifdef defi
  • Oracle入门笔记(五)——Oracle表间关系、SQL语句、基本函数

    Oracle表间关系 SQL语句 基本函数 1 引言 2 数据库的收费问题 3 数据库对SQL标准的兼容性 4 SQL语言的种类 5 Oracle中的HR用户 6 Oracle中基本的SQL语句的使用 7 Oracle中基本函数的使用 1