前言

在之前已经大概了解过Mysql数据库和学过相关的Oracle知识点,但是太久没用过Oracle了,就基本忘了…印象中就只有基本的SQL语句和相关一些概念….写下本博文的原因就是记载着Oracle一些以前没注意到的知识点…以后或许会有用…

实例与数据库概念

Oracle数据库服务器由两部分组成:

  • 实例:理解为对象,看不见的
  • 数据库:理解为类,看得见的

我们在安装Oracle的时候,已经填写过自己数据库的名称了,一般实例与数据库的名称是一致的…

如果还没有安装Oracle数据库的,可以看一下我其他的博文….

那么我们自带的sqlplus黑色窗口与实例,数据库之间的关系又是什么的呢???我们可以看下图:

Oracle数据库把表、视图等都看成是对象:


Oracle中的null值

Oracle中如果存在字段是null值的话,那么在sqlplus中它是不会显示出来的….如果我们使用null值的数据与其他数据进行运算…那么最终得出的结果都是null值

因此,Oracle提供了NVL(表达式1,表达式2)函数供我们使用,如果表达式1的值为null值,那么就取表达式2的值…当然了,如果表达式1不是null,取的就是表达式1的值

还有值得注意的是:null值不能参数=号运算,null能参数number/date/varchar2类型运算

Oracle提供了 is null关键字来代替=号运算的问题

Oracle中的别名

我们知道在Mysql中如果要用别名的话,需要使用as关键字 ,后面跟着别名就行了….Oracle可以省略as关键字…

并且,一般地,我们使用别名都是用双引号”“把别名括起来,Oracle也支持我们直接写别名,但是呢,如果我们不写双引号,那么我们的别名是不能有空格的

还有一点的是:Oracle的别名是不能使用单引号来括起来的,Oracle默认认为单引号是字符串类型和日期类型的。

IO输入输出SQL语句

我们可以在sqlplus中使用spool命令把SQL语句保存在硬盘中,具体的例子:


spool e:/oracle-day01.sql;

使用spool off命令,保存SQL语句到硬盘文件e:/oracle-day01.sql,并创建sql文件,结束语句

spool off;

当然了,我们也可以把硬盘中的SQL文件在sqlplus中执行,只要以下的命令就行了:


@ e:/crm.sql;

转义字符

有的时候,我们可能会模糊查询一些数据,但是呢,在名称中又有一些特殊的字符。那么我们就要经过转义….当然了,如果按照Java的来,就十分简单了,就写一个”\”就可以了。

那在Oracle中是怎么样转义的呢??我们来看下面的例子:


查询员工姓名中含有'_'的员工,使用\转义符,让其后的字符回归本来意思【like '%\_%' escape '\'】 select * from emp where ename like '%\_%' escape '\';

如果名称是’单引号呢???那么两个单引号代表着一个引号


插入一个姓名叫''的员工
insert into emp(empno,ename) values(2222,'''''');

单行函数与多行函数

首先,我们要明确一个概念:

  • 单行函数:输入一个参数,返回一个结果
  • 多行函数:扫描多个参数,返回一个结果….一般地,多行函数和分组函数的概念是差不多的…

Oracle**提供了关于字符串函数、日期函数供我们对数据进行对应的操作**,这里就不一一赘述了,我们到时候有需要的时候查文档就行了。

单引号出现的地方如下:

  • 1)字符串,例如:’hello’
  • 2)日期型,例如:’17-12月-80’
  • 3)to_char/to_date(日期,’YYYY-MM-DD HH24:MI:SS’)

双引号出现的地方如下:

  • 1)列别名,例如:select ename “姓 名” from emp
  • 2)to_char/to_date(日期,’YYYY”年”MM”月”DD”日” HH24:MI:SS’)

GROUP BY 细节

group by 子句的细节:

  • 1)在select子句中出现的非多行函数的所有列,【必须】出现在group by子句中
  • 2)在group by子句中出现的所有列,【可出现可不现】在select子句中

举例子:下面这段代码是错误的!!!


select max(avg(sal)) "部门平均工资的最大值",deptno "部门编号"
from emp
group by deptno;

为啥是错误的呢???分组中我们已经有了deptno字段了,而我们select 后面跟着也就是多行函数和该字段而已,为啥就错了呢?????我们如果在分组查询的时候,使用了多行函数嵌套的话,那么我们select字段后面只能跟随着它这么一个列,而不能再多了。max(avg(sal)) 相当于又分组了一次

当然了,如果我们仅仅是求出每个部门的平均工资,也就是下面这段代码,是完全没有问题的:

    select avg(sal) "部门平均工资的最大值",deptno "部门编号"
from emp
group by deptno;


多表查询、子查询

当我们一张表不能把数据查询出来的时候,就需要连接其他的表一起查询….

当我们的查询条件还没知道的时候,我们就可以使用子查询….

一般地,子查询和多表查询的功能都是差不多的….

子查询出来的数据是单行单列的时候,一般我们都是用等于、大于等于、小于等操作符去限制查询条件…

如果是单列多行的时候,我们一般都是用IN、ANY、ALL操作符去筛选条件…

如果是多行多列,我们就看成该返回查询结果是一张表【Oracle分页就是这个原理】


值得注意的是多表查询的数学基础是笛卡尔积,也就是说:如果两张实体表进行连接,那么它会构成一张笛卡尔积表…也就是说:最终就只有一张笛卡尔积表

连接

在多表查询的时候,我们由于会产生笛卡尔积,于是在笛卡尔积表中会存在很多无关的数据…为了剔除这些数据,我们将用到where字句将笛卡尔积表筛选成有用的数据表

一般地,我们有几种连接:

  • 内连接

    • 等值连接【使用=号把条件筛选出来】
    • 非等值连接【使用between and等手段把条件筛选】
  • 外连接
  • 自连接

那现在问题来了,在Oracle中有的功能我们可以使用多表查询来完成,有的时候我们又可以使用子查询来完成,那么我们一般选择哪一个呢????

我们看下图来比较一下他们的优劣:

对于索引就是一个以空间换时间的概念..在数据量很大的时候,Oracle会为我们的数据创建索引,当扫描数据的时候,就可以根据索引来直接获取值….索引的算法也有几种【二叉树、稀疏索引、位图索引….等等】

综上所述:在Oracle中使用多表查询性能可能比子查询好一些


Oracle分页

在讲解JDBC的时候,我们就已经讲过Oracle与Mysql的分页问题了….详情可以看我的博文:http://blog.csdn.net/hon_3y/article/details/53790092

我们在这里还是加深一下印象:

Oracle中的分页是依靠着rownum这个伪列来实现的,由于rownum只能使用的是<=或者<来获取数据。。。因为rownum的值可能会经常变【加入一条数据,那么rownum就+1,讲道理rownum可以是无穷大的,因此不能使用>来进行操作】….

那么Oracle分页的思路是这样子的:

  • 先在子查询中获取前n条记录
  • 由于返回的是多行多列,因此我们可以看做成一张表
  • 那么将查询出来的数据放在from字句的后边
  • 外套的查询可以通过where字句来对子查询出来的数据进行过滤
  • 那么我们就可以查询出想要的数据了…

公式:

  • Mysql从(currentPage-1)*lineSize开始取数据,取lineSize条数据
  • Oracle先获取currentPage*lineSize条数据,从(currentPage-1)*lineSize开始取数据

小面试题

笔试题:有【1000亿】条会员记录,如何用最高效的方式将薪水字段清零,其它字段内容不变?

第一:从emp表中删除sal字段

  • alter table emp
  • drop column sal;

第二:向emp表中添加sal字段,且内容默认0

  • alter table emp
  • add sal number(6) default 0;

操作表细节

进入回收站
drop table users; 查询回收站中的对象
show recyclebin; 闪回,即将回收站还原
flashback table 表名 to before drop;
flashback table 表名 to before drop rename to 新表名; 彻底删除users表
drop table users purge; 清空回收站
purge recyclebin; 为emp表增加image列,alter table 表名 add 列名 类型(宽度)
alter table emp
add image blob; 修改ename列的长度为20个字节,alter table 表名 modify 列名 类型(宽度)
alter table emp
modify ename varchar2(20); 删除image列,alter table 表名 drop column 列名
alter table emp
drop column image; 重名列名ename为username,alter table 表名 rename column 原列名 to 新列名
alter table emp
rename column ename to username; 将emp表重命名emps,rename 原表名 to 新表名
rename emp to emps;
  • number(5):

    • 最多5位数字
  • number(6,2):
    • 其中2表示最多显示2位小数,采用四舍五入,不足位数补0,同时要设置col … for …
    • 其中6表示小数+整数不多于6位
    • 其中整数位数不得多于4位,可以等于4位
  • varchar2(8):
    • 8表示字节

值得注意的是:修改表的时候,是不能回滚的!

Oracle中的级联操作:

  • 【on delete cascade】级联删除
  • 【on delete set null】将外键一方设置为null

Oracle总结第一篇【基本SQL操作】的更多相关文章

  1. Mysql优化(出自官方文档) - 第一篇(SQL优化系列)

    Mysql优化(出自官方文档) - 第一篇 目录 Mysql优化(出自官方文档) - 第一篇 1 WHERE Clause Optimization 2 Range Optimization Skip ...

  2. oracle系列--第一篇 数据库基础

    第一章 数据库基础 1.1 数据管理概述 1.1.1 什么是数据管理 与我们人类相比,计算机的最大优势就是能够高速.精准地运行,其运行的过程就是执行程序代码和操作指令.处理数据的过程.可以说,数据处理 ...

  3. 第一篇:Mysql操作初级

    Mysql操作初级   Mysql操作初级 本节内容 数据库概述 数据库安装 数据库操作 数据表操作 表内容操作 1.数据库概述 数据库管理系统叫做DBMS 1.什么是数据库 ? 答:数据的仓库,如: ...

  4. oracle查询第一篇

    第一个小知识点: clear 在oracle中也可以用以清除屏幕上的内容 第二个小知识点: 在一个表中插入自身的查询结果 insert into my_table (id,name,age) sele ...

  5. Oracle学习第一篇—安装和简单语句

    一 安装  10G ----不适合Win7 Visual Machine-++++Visual Hard Disk 先安装介质(VM)---便于删除 11G-----适合Win7 1 把win64_1 ...

  6. 第一篇:Git操作详解

    最近由于项目的需要,我需要负责整个项目的托管,其中涉及到很多Git相关的命令,所以就将之前用到的git相关的命令做了一个总结和归纳.由于开发环境是Linux,所以我接下来的操作命令均针对Linux环境 ...

  7. oracle只要第一条数据SQL

    select * from ( select * from COMMON_BIZREL_WF where sponsor is not null order by serialid ) where r ...

  8. Hadoop环境搭建|第一篇:linux操作系统安装

    一.安装工具及文件 优盘:8G(非kingston优盘) 制作启动盘工具:Universal_USB_Installer 操作系统:CentOs操作系统 二.注意事项 安装过程的详细步骤,这里就不再赘 ...

  9. Oracle知识梳理(三)操作篇:SQL基础操作汇总

    Oracle知识梳理(三)操作篇:SQL基础操作汇总 一.表操作 1.表的创建(CREATE TABLE): 基本语句格式:       CREATE TABLE  table_name ( col_ ...

随机推荐

  1. web workers工作线程

    web worker工作线程是Html5里面提出来的一个新api,对于JavaScript我们的印象是单线程执行,如果运行复杂运算的时候,页面可能就会失去响应,是运行在后台的javascript,独立 ...

  2. java核心技术之流与文件

    InputStream和OutputStream构成了输入/输出类层次结构的基础.用于按字节进行读写.而与之处在同一等级的Reader/Writer同样作为抽象类定义了用于对字符进行读取的类层次结构, ...

  3. HTML进阶

    HTML表单 form标签 <form> 标签代表一个表单,表单用于向服务器传输数据. 标签能够包含 <input> ,可以是文本字段,复选框,单选框或提交按钮等.还可以包含& ...

  4. python测试框架nose

    据说nose是一个比较牛逼的单元测试框架,今天打算来学习学习. nose不是python自带模块,这里我才用pip的方式安装 pip install nose 这样就完成了安装,然后再确认下是否安装成 ...

  5. 【Ubuntu 16】安装net-snmp

    使用tar.gz压缩包安装mongodb时报错,没有库文件 libnetsnmpmibs.so.3o cannot open file or directory 在网上找了一篇文章 需要安装net-s ...

  6. 震惊!WIN2003存在后门大全,提权成功率高

     从某种意义上说,服务器被攻击是不可避免的,甚至被控制也情有可原.但绝对不能容忍的是,服务器被植入后门,攻击者如入无人之境,而管理者去浑然不觉.本文将对当前比较流行的后门技术进行解析,知己知彼方能杜绝 ...

  7. postman 第1节 安装启动(转)

    安装: 1.mac app安装 浏览器访问https://www.getpostman.com/apps,选择Get the Mac App,下载安装即可 2.chrome app安装 浏览器访问ht ...

  8. TTL转MIPI DSI芯片方案TC358778XBG

    型号:TC358778XBG功能:TTL转MIPI DSI通信方式:IIC分辨率:1920*1080电源:3.3/1.8/1.2封装形式:BGA80深圳长期现货 ,提供技术支持,样品申请及规格书请联系 ...

  9. 原创: rsync软件服务利用ansible实现一键化部署

    ---恢复内容开始--- 首先创建一个脚本文件 /server/tools/peizhi.sh cat  /server/tools/peizhi.sh cat >>/etc/rsyncd ...

  10. Centos 7 PXE一键安装

    author:JevonWei 版权声明:原创作品 192.168.198.134作为安装服务器,由httpd服务共享安装程序 192.168.198.134作为dhcp服务器,客户机获取IP 一.安 ...