Oracle Database-基础及查询部分
Oracle Database-基础及查询部分
基本概念
一个Oracle服务器
- 是一个数据管理系统(RDBMS),提供开放的,全面的,近乎完整的信息管理
- 由一个Oracle数据库和多个Oracle实例组成
- 数据库对应物理上的文件存在,将数据库文件读取到内存中就成为了实例
- 操作Oracle数据库即通过操作实例来完成
- 数据库与实例可以为一对一或一对多,若为一对多,即称集群(cluster)
- 集群的优点:负载均衡,失败迁移
Oracle的体系结构
Database 数据库
- Oracle数据库是数据的物理存储,包括数据文件ORA或DBF、控制文件(CTL)、联机日志和参数文件
- Oracle数据库的概念与MySQL有所不同,一个操作系统只能由一个库
Instance 实例
- 一个Oracle实例(Oracle Instance)又一系列的后台进程和内存结构组成,一个数据库可以有多个实例
数据文件(dbf)
- 数据文件是数据库的物理存储单位,数据库的数据是表面上存储在表空间中的,实际上是在某一个或多个数据文件中存放
- 一个表空间可以由一个或多个数据文件组成
- 一个数据文件只能属于一个表空间
- 一旦数据文件被加入到某个表空间后,就不可以删除这个文件,如果要上出这个文件必须先删除其所属表空间
表空间
- 表空间是Oracle对物理数据库上的相关数据文件(ORA或DBF文件)的逻辑映射,一个数据库在逻辑上被划分为一到若干个表空间,每个表空间包含了在逻辑上相关联的一组结构
- 每个数据库至少有一个表空间
- 每个表空间由同一磁盘上的一个或多个文件组成,这些文件称数据文件(datafile)
- 一个数据文件只能属于一个表空间
- 表空间为逻辑概念,数据文件为物理概念
用户
- 用户实在实例下建立的,不同的实例中可以创建相同名称的用户
- 表中的数据是由用户放入某一个表空间的,而这个表空间会随机把这些表数据放到一个或者多个数据文件中
- Oracle数据库不是普通的概念,Oracle是由用户和表空间对数据进行管理和存放的,但表不是由表空间去查询二十由用户来查询的,故不同用户可以在同一个表空间建立同一个名字的表,这个表就是由建表用户来区分了
SCOTT用户和HR用户
基本查询
更改某行SQL语句
- 使用【c】命令
- 使用【edit/ed】命令,将自动用编辑器打开上一条执行的sql语句
SQL中的空值(null)问题
- 包含null的表达式都为null
- null永远不等于null,所以判断一个值是否等于null应该使用is null语句而非x = null 这样的语句
- 如果集合中含有空值,不能使用not in关键字,但可以使用in,具体见下文提及in关键字的部分
- nvl(a,b):当a为null时返回b
- nvl2(a,b)
查询结果显示格式
关于别名
DISTINCT关键字
伪表和伪列
连接符||和concat函数
数据库中的字符串
- 字符串可以是SELECT列表中的一个字符,数字,日期
- 日期和字符只能在单引号中出现,双引号表示列的别名
- 每当返回一行时,字符串被输出一次
spool语句
SQL和SQL*Plus
SQL
- 一种语言
- ANSI 标准
- 关键字不能缩写
- 使用语句控制数据库中的表的定义信息和表中的数据
SQL*Plus
- 一种环境
- Oracle 的特性之一
- 关键字可以缩写
- 命令不能改变数据库中的数据的值
- 集中运行
iSQL*Plus
使用iSQL*Plus可以:
- 描述表结构。
- 编辑SQL语句。
- 执行SQL语句。
- 将SQL保存在文件中并将SQL语句执行结果保存在文件中。
- 在保存的文件中执行语句。
- 将文本文件装入SQL*Plus编辑窗口。
- Oracle在本机:http://localhost:5560/isqlplus/
- 若Oracle在虚拟机,本机为例http://169.254.35.157:5560/isqlplus/
条件查询和排序
条件查询(过滤)
字符和日期
- 字符和日期要包含在单引号中
- 字符大小写敏感(而MySQL不区分大小写),日期格式敏感
- 默认的日期格式时DD-MON-RR
可以修改日期的格式:
比较运算
BETWEEN AND
IN
LIKE
逻辑运算
运算符的优先级
ORDER BY子句
- ASC(ascend):升序
- DESC(descend):降序
多个列排序
- 可以按照select语句中的列名排序
- 可以按照别名列名排序
- 可以按照select语句中的列名的顺序值排序
- 如果要按照多列进行排序,则规则是先按照第一列排序,如果相同,则按照第二列排序;以此类推
考虑空值null的排序
函数
SQL函数的概念
两种SQL函数
单行函数
- 操作数据对象
- 接受参数返回一个结果
- 只对一行进行变换
- 每行返回一个结果
- 可以转换数据类型
- 可以嵌套
- 参数可以是一列或一个值
- 使用函数时函数名对大小写不敏感
单行函数分为五大类型(另外可以说条件表达式是第六种单行函数)
字符函数
大小写控制函数
字符控制函数
数值函数
日期函数
- Oracle中的日期型数据类型(date类型)实际含有两个值(而MySql有date-日期和datetime-日期时间两种表示日期的数据类型): 日期和时间
- date=日期+时间
- 使用select sysdate from dual来查看当前时间
- 默认的日期格式是DD-MON-RR
- 在日期上加上或减去一个数字结果仍为日期,直接加减单位是天
- 两个日期相减返回日期之间相差的天数,两个日期之间不可以相加
- 可以用数字除24来向日期中加上或减去小时
转换函数(数据类型转换)
隐式转换
显式转换
- 必须包含在单引号中而且大小写敏感。
- 可以包含任意的有效的日期格式。
- 日期之间用逗号隔开。
通用函数
- NVL(expr1, expr2)
- NVL2(expr1,expr2,expr3):是NVL函数的增强
- NULLIF(expr1,expr2)
- COALESCE(expr1,expr2, ... ,exprn):可变参数
条件表达式
- CASE表达式:SQL99的语法,类似Basic,比较繁琐
- DECODE函数:Oracle自己的语法,类似Java,比较简洁
CASE表达式
DECODE函数
函数可以嵌套使用
多行函数(或称组函数、分组函数)
多行函数语法
常用的多行函数
- AVG:平均值
- COUNT:计数
- MAX:最大值
- MIN:最小值
- SUM:求和
COUNT(计数)函数
多行函数与空值
分组数据(GROUP BY)
使用GRUOP BY子句的基本要求
多个列分组
过滤分组数据
HAVING子句
- 行已经被分组。
- 使用了组函数。
- 满足HAVING 子句中条件的分组将被显示
使用注意
- 不能在WHERE子句中使用多行函数
- 可以在HAVING子句中使用多行函数
GROUP BY语句的增强
多表查询
笛卡尔积
Oracle中连接条件的类型
- 等值连接
- 不等值连接
- 外连接
- 自连接
- Cross joins
- Natural joins
- Using clause
- Full or two sided outer joins
不同类型的连接条件多表查询的基本语法和作用
等值连接
不等值连接
外连接
- 使用外连接可以查询不满足连接条件的数据。
- 外连接的符号是"(+)"
右外连接语法
左外连接语法
自连接
自连接查询多表的缺陷
*层次查询
SQL99标准中的连接类型
多表查询的注意事项
- 在WHERE字句中写入连接条件。
- 在表中有相同列时,在列名之前加上表名前缀
- 在不同表中具有相同列名的列可以用表的别名加以区分
使用表的别名
子查询
- 子查询(内查询) 在主查询之前一次执行完成
- 有例外,见下文注意事项
- 子查询的结果被主查询使用(外查询)
- 更多详细示例见附件pdf(day02)
子查询语法
子查询使用细节
注意事项
- 子查询要包含在括号内
- 将子查询放在比较条件的右侧
- 单行操作符对应单行子查询,多行操作符对应多行子查询
- 有一定的SQL语句格式便于阅读
- 不可以在GROUP BY子句后使用子查询
- 主查询和子查询可以是分别查询两(多)张不同的表
- 需要满足子查询返回的结果主查询可以使用即可
- 一般不在子查询中排序
- 在top-n分析问题中必须在子查询中排序,关于top-n问题,见下文拓展内容
- 通常先执行子查询,在执行主查询
- 特殊情况:在相关子查询中有可能先执行主查询再执行子查询
- 子查询的空值问题
- 当子查询和多表查询可以得到相同的结果时,尽量使用多表查询
子查询可以用于
- where关键字后
- select关键字后
- 需要子查询返回一行数据,即子查询应该是一个单行子查询,若返回多行数据则报错
- 需要子查询返回一行数据,即子查询应该是一个单行子查询,若返回多行数据则报错
- having关键字后
- from关键字后(特殊)
▲在FROM关键字后使用子查询
子查询类型
单行子查询
- 只返回一行记录
- 使用单行比较操作符
在子查询中使用组函数
在HAVING子句后使用子查询中
- 首先执行子查询。
- 向主查询中的HAVING子句返回结果
在SELECT关键字后使用单行子查询
非法使用单行子查询
单行子查询中的空值问题
多行子查询
- 返回多行记录
- 使用多行比较操作符
- 若使用NOT IN操作符,则表中不能有空值,若有空值,则查询将返回空值
- 若一定要使用NOT IN操作符,需要手动使用is not null来过滤掉空值记录
- 若使用NOT IN操作符,则表中不能有空值,若有空值,则查询将返回空值
在多行子查询中使用ANY操作符
在多行子查询中使用ALL操作符
多行子查询中的空值问题
集合运算
集合运算符
并集
UNION
交集
差集
集合运算中的注意事项
- select语句中参数类型和个数(即列的个数)要一致
- 若不一致,一般可以按需要补上类型一样的空值来符合这个语法
- 可以使用括号改变集合执行的顺序
- 如果有order by子句,必须放到最后一句查询语句后
- 集合运算采用第一个语句的表头作为表头
- 若要给列定义别名,在第一个表的查询语句中定义
SQL语句的优化要点
- 尽量使用列名来查询(用select 列名1,列名2,... 来代替select *)
- where 条件1 and 条件2,应该把经常返回假的条件放在右边
- 因为where解析顺序是从右到左,若有一个为假则全为假(相当与Java的&&)
- 同理,where 条件1 or 条件2,应该把经常返回真的条件放在右边
- 当使用where子句或having子句都可以得到结果时,尽量使用where子句来完成查询
- 因为where是先筛选后分组,having是先分组后筛选(对不必要的数据进行了分组)
- 当子查询和多表查询可以得到相同的结果时,尽量使用多表查询
- 因为子查询会访问两(多)次数据库
- 实际上Oracle中使用子查询语句很多时候会被Oracle自动转换成多表查询
- 尽量不要使用集合运算,参与集合的查询越多,耗费性能越严重
关于空值
- 如果null参与算术运算,则该算术表达式的值为null(例如:+,-,*,/ 加减乘除)
- 如果null参与比较运算,则结果无论如何将为false(例如:>=,<=,<> 大于,小于,不等于)
- 如果null参与聚集运算,则聚集函数都置为null。除count(*)之外
- 如果在not in子查询中有null值的时候,则不会返回数据
SQL执行计划
例题
TOP-N问题
关于ROWNUM行号的要点
- 行号永远按照默认的顺序生成
- 关于行号的默认排序
- Oracle中有三种表:标准表、索引表和临时表
- 临时表可以被手动创建,也可以被Oracle自动创建
- 当查询语句中有排序操作时,会创建临时表作为排序后的表来显示,故(子)查询其实相当于创建了一张新的表
- 当事务或会话结束的时候,表和表中的数据自动删除
- 关于行号的默认排序
- 关于行号的过滤条件只能使用"<"、"<=",不可以使用">"、">="
- 那么分页就需要在外面嵌套一个外查询并在其中中定义分页条件了
- 如:需要查询行号为5到8的数据
- 此时r不再是行号伪列,而是子查询中的”真列“,故不需要在意不可以使用大于条件这条规则了、
- 如:需要查询行号为5到8的数据
- 那么分页就需要在外面嵌套一个外查询并在其中中定义分页条件了
相关子查询
- 将主查询的值作为参数传递给子查询
行转列
转载于:https://www.cnblogs.com/zella1996/p/9550633.html
Oracle Database-基础及查询部分相关推荐
- Oracle Database基础
2019独角兽企业重金招聘Python工程师标准>>> 一.安装与连接 1.下载Oracle Database express edition 可用Oracle账号 24258597 ...
- oracle查询表nextval,Oracle Database 建立与查询 Sequence
相关的 Oracle Database Sequence 资讯如下: 建立 Sequence 语法 create sequence ._s increment by 1 start with 1 ma ...
- oracle数据库怎么分组查询,oracle数据库之分组查询
本章内容和大家分享的是数据当中的分组查询.分组查询复杂一点的是建立在多张表的查询的基础之上,(我们在上一节课的学习中已经给大家分享了多表查询的使用技巧,大家可以自行访问:多表查询1 多表查询2)而在 ...
- 查看oracle数据库启动状态,Oracle数据库的状态查询
1 状态查询 启动状态 SQL语句 结果 nomount select status from v$instance; STARTED select open_mode from v$database ...
- oracle 游标查询数据库,Oracle数据库使用游标查询结果集所有数据
--Oracle使用游标查询结果集所有数据 DECLARE myTabelName NVARCHAR2(200):=''; --表名 myTableRowComment NVARCHAR2(200): ...
- Oracle Database 11g : ocp之SQL 基础
Oracle Database 11g : SQL 基础 第一章:使用SQL SELECT 语句检索数据 使用的表 1.空值 2:列别名 1:定义列别名 2:使用列别名 select FIRST_NA ...
- 《OCA认证考试指南(1Z0-061):Oracle Database 12c SQL基础》
2019独角兽企业重金招聘Python工程师标准>>> <OCA认证考试指南(1Z0-061):Oracle Database 12c SQL基础> 旨在帮助读者备战Or ...
- oracle 11g circuits 参数,递归:在 Oracle Database 11g 第 2 版中查询层次结构数据
开发人员:SQL 递归: 在 Oracle Database 11g 第 2 版中查询层次结构数据的快速入门 作者:Tim Hartley 2010 年 2 月发表 递归数据库处理,也称为材料清单 或 ...
- Oracle Database 9i, 10g闪回版本查询
不需要设置,立即识别对行的所有更改 在 Oracle9i Database 中,我们看到它推出了以闪回查询形式表示的"时间机器".该特性允许 DBA 看到特定时间的列值,只要在还原 ...
- oracle 数据库怎么查询,Oracle 数据库基础查询
1.1文件存储 对数据的存储需求一直存在.数据保存的方式,经历了手工管理.文件管理,数据库管理阶段. 文件存储方式保存数据的弊端: 1.缺乏对数据的整体管理,数据不便修改: 2.不利于数据分析和共享; ...
最新文章
- mybatis的typeAliases别名
- 【BZOJ 2744 】[HEOI2012]朋友圈
- ajax get请求_python测试开发django50.jquery发送Ajax请求(get)
- 前端学习(1036):bootstrap-js插件2
- 公司间交易学习笔记---概述
- redis的hyperloglog用法
- in use 大学英语4word_(word)大学英语考试样题四.doc
- Android深入四大组件(五)Android8.0 根Activity启动过程(后篇)
- 语音识别准确率终于提升了 以后可以随时和机器人聊天
- 快速开发项目的前端框架主要针对后台界面
- GBASE 8s UDR内存管理_05_mi_free
- 【5G】NAS安全密钥衍生算法详解
- svg中marker元素的理解
- ChucK初步(1)
- 【react】---Hooks的基本使用---【巷子】
- python——计时器,走马灯
- fd leak问题查找(Android)
- 【WINDOWS / DOS 批处理】for命令详解(八)
- uni-app的父与子页面传递参数之属性Props字段类型解析
- break在java语言中什么意思_在Java语言的控制结构中,break语句是经常用到的语句。在switch语句中break语句的作用是( )_学小易找答案...
热门文章
- 进击高手【第五期】思维题
- 冯诺依曼体系结构(现代计算机的原型)+cpu的两个核心指标
- uboot源码阅读(二)什么是江湖,链接文件u-boot.lds
- 阿里云国际站:云端实时渲染 阿里云用算力让三星堆“活过来”
- keil startup_stm32f10x_hd.s编译报错
- 可扩展标记语言XML(淅淅沥沥的小雨)
- App逆向-安卓环境搭建-LineageOS刷机指南
- 爷回青——小米5s Plus刷入LineageOS
- 【实战经验分享】如何对SSD固态硬盘下发SCSI command?
- Windows重装系统+虚拟机virtuabox安装+ubuntu系统安装+linux环境下安装fsl 一条龙(步步亲测有效)