在以前已经大概了解过Mysql数据库和学过相关的Oracle知识点,可是过久没用过Oracle了,就基本忘了...印象中就只有基本的SQL语句和相关一些概念....写下本博文的缘由就是记载着Oracle一些之前没注意到的知识点...之后或许会有用...面试
Oracle数据库服务器由两部分组成:算法
咱们在安装Oracle的时候,已经填写过本身数据库的名称了,通常实例与数据库的名称是一致的...sql
若是尚未安装Oracle数据库的,能够看一下我其余的博文....数据库
那么咱们自带的sqlplus黑色窗口与实例,数据库之间的关系又是什么的呢???咱们能够看下图:服务器
Oracle数据库把表、视图等都当作是对象:微信
Oracle中若是存在字段是null值的话,那么在sqlplus中它是不会显示出来的....若是咱们使用null值的数据与其余数据进行运算...那么最终得出的结果都是null值oracle
所以,Oracle提供了NVL(表达式1,表达式2)函数供咱们使用,若是表达式1的值为null值,那么就取表达式2的值...固然了,若是表达式1不是null,取的就是表达式1的值函数
还有值得注意的是:null值不能参数=号运算,null能参数number/date/varchar2类型运算性能
Oracle提供了 is null关键字来代替=号运算的问题spa
咱们知道在Mysql中若是要用别名的话,须要使用as关键字 ,后面跟着别名就好了....Oracle能够省略as关键字...
而且,通常地,咱们使用别名都是用双引号""把别名括起来,Oracle也支持咱们直接写别名,可是呢,若是咱们不写双引号,那么咱们的别名是不能有空格的
还有一点的是:Oracle的别名是不能使用单引号来括起来的,Oracle默认认为单引号是字符串类型和日期类型的。
咱们能够在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提供了关于字符串函数、日期函数供咱们对数据进行对应的操做,这里就不一一赘述了,咱们到时候有须要的时候查文档就好了。
单引号出现的地方以下:
双引号出现的地方以下:
group by 子句的细节:
举例子:下面这段代码是错误的!!!
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字句将笛卡尔积表筛选成有用的数据表
通常地,咱们有几种链接:
内链接
那如今问题来了,在Oracle中有的功能咱们可使用多表查询来完成,有的时候咱们又可使用子查询来完成,那么咱们通常选择哪个呢????
咱们看下图来比较一下他们的优劣:
对于索引就是一个以空间换时间的概念..在数据量很大的时候,Oracle会为咱们的数据建立索引,当扫描数据的时候,就能够根据索引来直接获取值....索引的算法也有几种【二叉树、稀疏索引、位图索引....等等】
综上所述:在Oracle中使用多表查询性能可能比子查询好一些
在讲解JDBC的时候,咱们就已经讲过Oracle与Mysql的分页问题了....详情能够看个人博文:http://blog.csdn.net/hon_3y/article/details/53790092
咱们在这里仍是加深一下印象:
Oracle中的分页是依靠着rownum这个伪列来实现的,因为rownum只能使用的是<=或者<来获取数据。。。由于rownum的值可能会常常变【加入一条数据,那么rownum就+1,讲道理rownum能够是无穷大的,所以不能使用>来进行操做】....
那么Oracle分页的思路是这样子的:
公式:
笔试题:有【1000亿】条会员记录,如何用最高效的方式将薪水字段清零,其它字段内容不变?
第一:从emp表中删除sal字段
第二:向emp表中添加sal字段,且内容默认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):
number(6,2):
varchar2(8):
值得注意的是:修改表的时候,是不能回滚的!
Oracle中的级联操做:
若是文章有错的地方欢迎指正,你们互相交流。习惯在微信看技术文章,想要获取更多的Java资源的同窗,能够 关注微信公众号:Java3y