Oracle数据库基本操作

1.概述

Oracle数据库客户端一般需要安装在服务器上,可以在服务器端操作,一般我们可以用sql developer工具远程连接到数据库,先行建立数据库,然后对表进行增删改查。也可以使用MyEclispse的DB Broswer工具进行连接数据库并进行简单的增删改查。

2.SQL语句

Data Definition LanguageDDL):

主要用于建立、修改、删除数据库对象(表),不需要事务的参与

CREATE:创建表

CREATE TABLE emp(

id NUMBER(),

name VARCHAR2(),

gender CHAR(),

birth DATE,

salary NUMBER(,),

);

DESC :查询表结构

DESC emp;

RENAME:重命名表名

RENAME emp TO employee;

DROP:删除表

DROP TABLE emp;

ALTER:列(字段)操作

ADD:增加字段

ALTER TABLE employee ADD (birth DATE DEFAULT sysdate);

MODITY:修改字段

ALTER TABLE employee MODIFY (name VARCHAR2(40) DEFAULT 'CLERK' );

DROP:删除字段

ALTER TABLE employee DROP (birth);

Data Manipulation LanguageDML

用于对数据记录进行操作,包括插入,删除,修改。需要commit才能真正确认操作,如果需要撤销则rollback。

INSERT INTO:插入数据

INSERT INTO employee(id, name, salary) VALUES(1001, 'rose', 5500);

UPDATE…SET..:更新数据

UPDATE employee SET salary = 8500 WHERE name = 'ROSE';

DELETE FROM:删除记录

DELETE FROM employee WHERE job is null;

Transaction Control LanguageTCL

事务控制语言,包括commit提交,rollback回滚,savepoint保存点(可以回退到指定保存点)。在sql developer中为图标。

Data Query LanguageDQL

SQL基础查询:

查询语句的执行顺序

FROM 子句:执行顺序为从后往前、从右到左。数据量较少的表尽量放在后面。

WHERE子句:执行顺序为自下而上、从右到左。将能过滤掉最大数量记录的条件写在WHERE 子句的最右。

GROUP BY执行顺序从左往右分组,最好在GROUP BY前使用WHERE将不需要的记录在GROUP BY之前过滤掉。

HAVING 子句:消耗资源。尽量避免使用,HAVING 会在检索出所有记录之后才对结果集进行过滤,需要排序等操作。

SELECT子句:少用*号,尽量取字段名称。ORACLE 在解析的过程中, 通过查询数据字典将*号依次转换成所有的列名, 消耗时间。

ORDER BY子句:执行顺序为从左到右排序,消耗资源。

也就是从哪张表中以什么样的限制条件确定数据内容,再通过分组与进一步限制分组条件得到一个处理过的数据,最后选择出来,如有需要,则对最后选择的数据进行排序。

FROM子句:

From后接表名,from前可以可以是*,但是不建议(查询效率低),一般接要查询的字段名。分组函数,字段和表名都可以使用别名,不加引号数据库中为大写,加引号别名可以用空格小写等。

WHERE子句:

当查询条件中和数字比较,可以使用单引号引起,也可以不用,当和字符及日期类型的数据比较,则必须用单引号引起。

使用条件判断:>,<,<=,<=,!=,<>,=。

SELECT ename, sal FROM emp WHERE sal< 2000;

SELECT ename, sal, job FROM emp WHERE job = 'SALESMAN';

SELECT ename, sal, hiredate FROM emp

WHERE hiredate>todate('2002-1-1','YYYY-MM-DD');

使用AND/OR关键字

如果希望返回的结果必须满足多个条件,应该使用AND逻辑操作符连接这些条件

如果希望返回的结果满足多个条件之一即可,应该使用OR逻辑操作符连接这些条件

使用LIKE条件

SELECT ename, job FROM emp WHERE ename LIKE '_A%';(第二个字母为A)

‘_A%’_表示占位一个字符,%表示0到多个字符。

使用IN/NOT  IN

在WHERE子句中可以用比较操作符IN(list)来取出符合列表范围中的数据。其中的参数list表示值列表,当列或表达式匹配于列表中的任何一个值时,条件为TRUE,该条记录则被显示出来。

SELECT ename, job FROM emp WHERE job IN ('MANAGER', 'CLERK');

使用BETWEEN 1 AND 2

用来查询符合(1,2)值域范围之内的数据,通常查询数字和日期类型的数据范围。

SELECT ename, sal FROM emp

WHERE sal BETWEEN  AND ;

使用IS NULL和IS NOT NULL

条件筛选值为空的记录,空值不能用‘=’来判断。

使用ANY和ALL条件

在比较运算符中,可以出现ALL和ANY,表示“全部”和“任一”,

> ANY : 大于最小< ANY:小于最大> ALL:大于最大< ALL:小于最小

SELECT empno, ename, job, sal, deptno

FROM emp WHERE

sal> ANY (SELECT sal FROM emp WHERE job = 'SALESMAN');

查询条件中使用算术表达式

当查询需要对选出的字段进行进一步计算,可以在数字列上使用算术表达式(+、-、*、/)。表达式符合四则运算的默认优先级,如果要改变优先级可以使用括号。

SELECT ename, sal, job FROMempWHERE ename = UPPER('rose');

SELECT ename, sal, job FROM empWHERE sal *  >;

使用DISTINCT过滤重复

DISTINCT必须紧跟SELECT,后面可以有多个字段,表示过滤掉多个字段都重复的选项,第二例中不显示重复的deptno和job相同的记录。

SELECT DISTINCT deptno FROM emp;

SELECT DISTINCT deptno, job FROM emp;

使用ORDER BY子句

对查询数据按照一定的规则排序,则使用order by子句,order by子句必须为select子句的最后一个子句。默认升序排列,从小到大,ASC表示升序。DESC表示降序,从大到小。

SELECT ename, sal FROM emp

ORDER BY sal DESC;

Order by多个列,每个列需要单独指定排序规则,先按照第一个字段排序,当第一个字段的值相同时,再按照第二个字段的值排序。

聚合函数分组函数

当需要统计的数据并不能在表里直观列出,而是需要根据现有的数据计算得到结果,这种功能可以使用聚合函数来实现。

因为是多行数据参与运算返回一行结果,也称作分组函数、多行函数、集合函数。用到的关键字:GOURP BY 按什么分组,HAVING进一步限制分组结果

MAX和MIN

用来取得列或者表达式的最大最小值,包括数字,字符和日期。

SELECT MAX(sal) max_sal, MIN(sal) min_sal FROM emp;

AVG和SUM

用来统计列或者表达式的平均值和求和,只能处理数字类,并且平均值忽略NULL。

SELECT AVG(sal) avg_sal, SUM(sal)  sum_sal  FROM emp;

COUNT

用来计算表中的记录条数,同样忽略NULL。

SELECT COUNT(job) total_num  FROM emp;

空值的操作

NVL(expr1, expr2):将NULL转变为非NULL值。如果expr1为NULL,则取值expr2, expr2是非空值。

NVL2(expr1, expr2, expr3):和NVL函数功能类似,都是将NULL转变为非空值。NVL2用来判断expr1是否为NULL,如果不是NULL,返回expr2,如果是NULL,返回expr3。

GROUP BY子句

Group by是表示对表中某个字段进行分组,值相同为一组,而分组函数的意思则是对这每一个组进行计算,平均值或是最大最小值。

HAVING子句

是对分组后的结果进行进一步的限制,HAVING子句必须紧跟在GROUP BY子句后,不能单独存在。限制分组条件不能放在WHERE子句中。

SELECT deptno, MAX(sal) max_sal FROM emp

GROUP BY deptno HAVING MAX(sal) >;

SQL关联查询:

概述,在实际应用中,往往我们所需要的数据是分布在不同的表上的,我们想要获取数据必须跨表格查询。

关联有两种方式:

SELECT table1.column, table2.column

FROM table1, table2

WHERE table1.column1 = table2.column2;

SELECT table1.column, table2.column

FROM table1JOIN table2

ON(table1.column1 = table2.column2);

关联查询有三种连接方式

内连接返回关联表中所有满足条件的记录(也称等值连接)

外连接返回一些不满足条件的记录,外连接有左外连接,右外连接和全外连接三种形式

其中左外连接返回左边所有记录而不必管右边是否匹配,如不匹配则为NULL值,

右外连接返回右边所有记录而不必管左边的记录是否匹配,如不匹配则默认NULL,

全外连接返回左边和右边所有的数据,左右边不匹配的数据,对应的其他字段值为NULL,

格式如下

JOIN ON式

SELECT table1.column, table2.column

FROM table1 [LEFT | RIGHT | FULL] JOIN table2

ON table1.column1 = table2.column2;

WHERE式

Select * from dave a,bl b where a.id=b.id(+);

+号的位置和意义

‘+’号加在哪个表,哪个表就是关联表,另一张表就是基表。基表全部显示,关联表匹配显示。+在左边就是右外连接,+在右边就是左外连接。

自连接:

表示数据的来源是同一张表的内容,即将一张表中的不同列进行连接,可以是等值或者不等值。实现方式是利用别名将一张表看作两张表。

SELECT     worker.empnow_empno,worker.enamew_ename, manager.empnom_empno, manager.enamem_ename

FROM emp worker join emp manager

ON worker.mgr = manager.empno;

SQL高级查询:

子查询:

子查询用在WHERE

在SELECT中,往往WHERE的限制条件并不是一个确定的值,而是来源于另一个查询结果,即需要在另一个查询结果的基础上进行查询,这个时候为另一个查询提供数据的查询就叫做子查询。

SELECT e.ename, e.job FROM emp e

WHERE e.job = (SELECT job FROM emp WHERE ename = 'SCOTT');

可以与多行/单行比较操作符混合使用。

子查询用在HAVING子句

SELECT deptno, MIN(sal) min_sal FROM emp GROUP BY deptno

HAVING MIN(sal) > (SELECT MIN(sal) FROM emp WHERE deptno = 30);

表示分组条件需要满足的条件。可以把子查询当成一个结果。

子查询用在FROM部分

子查询用在FROM子句中,子查询可称为行内视图或者匿名试图,可以把它当成一张单独的表,用别名进行标识。

子查询用在SELECT子句中

可以认为是外连接的一张表现

分页查询:

ROWNUM

伪列,返回标识行数据顺序的数字,伪列并不是真正的列数据,只是用来显示行数,并不能单独作为一列进行分组操作。

ROWNUM的结果从第一行数据之上开始,每查询到一条数据则指针下移一个,所以只有查询到数据后才能够出现伪列数字,因此不能直接用在where里,如果要利用ROWNUM截取结果集的部分数据,可以将含有ROWNUM伪列的SELECT子句放在FROM内,作为视图,供外部的SELECT语句使用,此时的伪列已形成顺序数据,可以进行分组函数操作。

也就是将ROWNUM先作为行内视图的一个列,在主查询中就可以使用这个列值作为条件。

SELECT  * FROM  (SELECT  ROWNUMrn , e.* FROM emp e ) 

 WHERE rn BETWEEN  AND ;

使用子查询和ROWNUM进行分页

分页操作需要有一个作为分页标准的数据,该数据线进行排序,排序的结果作为视图被父查询用伪列标识顺序数字,然后在最外面的爷爷查询对伪列进行分页。

如:

SELECT  * FROM

  (SELECT  ROWNUMrn , t.* FROM

    (SELECT empno,ename,sal FROM emp

     ORDER BY sal DESC)  t

  ) 

 WHERE rn BETWEEN  AND ;

DECODE函数

DECODE (expr, search1, result1[, search2, result2…][, default])

它用于比较参数expr的值,如果匹配到哪一个search条件,就返回对应的result结果,可以有多组search和result的对应关系,如果任何一个search条件都没有匹配到,则返回最后default的值。default参数是可选的,如果没有提供default参数值,当没有匹配到时,将返回NULL。

SELECT ename, job, sal,

DECODE(job, 'MANAGER', sal * 1.2,

               'ANALYST', sal * 1.1,

              'SALESMAN', sal * 1.05,

sal) bonus

FROM emp;

SELECT deptno, dname, loc

FROM dept

ORDER BY

DECODE(dname, '研发部',,'市场部',,'销售部',), loc;

分组函数

ROW_NUMBER

ROW_NUMBER()

OVER (PARTITION BY deptno ORDER BY empno)

根据deptno分组,在分组内根据empno内排序,比ROWNUM功能更强。可以直接从结果集中取出子集

RANK

RANK() OVER( PARTITION BY col1 ORDER BY col2)

功能与上相同,不同在于存在并列,并列第二跳过第三直接第四的规则。

DENSE_RANK

如果有并列第二,下一个排序将是三。

高级分组函数

ROLLUP

如果对两个字段rollup,那么第一个字段相同的值会当成一组,如果有分组函数求和,就会对第一字段所有的数据求和,单独成行。此时第二字段值为空。可以用于统计年度销售(工资)和。

CUBE

CUBE函数对字段进行排列统计,比如三个字段的CUBE运算,将三个字段排列成6种情况具体需要使用的时候再参考百度。

GROUPING()

GROUPING只能在使用ROLLUP或CUBE的查询中使用。当需要在返回空值的地方显示某个值时,GROUPING()就非常有用。案例情况复杂,具体使用时再说。

集合操作

UNION、UNION ALL、INTERSECT、MINUS

Union表示取多次SELECT结果的并集,如果去掉重复的数据。

Union All与union功能一样,只是它不会去掉重复的数据,会全部显示。

Intersect表示相交,多次查询后去相同的数据,即同时满足两个查询条件的数据

Minus表示差集,即将第一个结果集中的数据,减去第二个结果集的数据。即满足第一个查询条件,而不满足第二查询条件的数据。

Data Control LanguageDCL:

用于执行权限的授予和收回操作、创建用户等,包括授予(GRANT)语句,收回(REVOKE)语句,CREATE USER语句,其中GRANT用于给用户或角色授予权限, REVOKE用于收回用户或角色已有的权限。DCL语句也不需要事务的参与,是自动提交的。

GRANT CREATE VIEW TO tarena;

3.视图、索引、序列、约束

视图

视图本质上是一条SELECT语句,当SELECT子查询在from子句中,可以把SELECT子句的结果当作一个视图。视图本身只是基表的映射,只是把基表中的数据显示出来,可以把视图当成表看待,所有操作都与表操作极其相似。

视图有三种,简单视图不包括函数,复杂视图包含了分组函数等附加的内容,连接视图是基于多个表的。

视图的优劣点:

如果需要经常执行某项复杂查询,可以基于这个复杂查询建立视图,此后查询此视图即可,简化复杂查询;视图本质上就是一条SELECT语句,所以当访问视图时,只能访问到所对应的SELECT语句中涉及到的列,对基表中的其它列起到安全和保密的作用,可以限制数据访问。

同时因为视图本质是基表的数据,所以对视图的操作会影响到基表从而不安全。这里可以使用WITH READ ONLY来限制对视图的DML语言。

CREATE OR REPLACE VIEW v_emp_10

AS

SELECT empno, ename, sal, deptno FROM emp

WHERE deptno = 

WITH READ ONLY;

使用DCL语句可以授权用户创建视图的权限

GRANT CREATE VIEW  TO tarena;

创建简单视图

CREATE VIEW v_emp_10

AS

SELECT empno, ename, sal, deptno

FROM emp

WHERE deptno = ;

查询视图

SELECT id, name, salary FROM v_emp_10;

对视图的DML操作

简单视图可以进行DML操作,但是操作的对象必须是基表里视图包含的字段,即对视图可见。而且简单视图的DML操作会对影响基表数据。

WITH CHECK OPTION短语表示,通过视图所做的修改,必须在视图的可见范围内,无论是INSERT UPDATE DELETE操作都必须在视图范围内,超过视图范围不可用。

CREATE [OR REPLACE] VIEW view_name[(alias[, alias…])]

AS subquery

[WITH CHECK OPTION];

删除视图

DROP VIEW v_emp_10;

对视图的删除不会导致基表数据的丢失,不会影响基表数据。

序列

序列(SEQUENCE)是一种用来生成唯一数字值的数据库对象。序列的值由Oracle程序按递增或递减顺序自动生成,通常用来自动产生表的主键值,是一种高效率获得唯一键值的途径。

序列是独立的数据库对象,和表是独立的对象,序列并不依附于表。

通常情况下,一个序列为一个表提供主键值,但一个序列也可以为多个表提供主键值。

CREATE SEQUENCE [schema.]sequence_name

    [ START WITH i ] [ INCREMENT BY j ]

    [ MAXVALUE m | NOMAXVALUE ]

    [ MINVALUE n | NOMINVALUE ]

[ CYCLE | NOCYCLE ][ CACHE p | NOCACHE ]

创建一个序列,起始数据是100,步进是10:

CREATE SEQUENCE emp_seq

START WITH 100

INCREMENT BY 10;

NEXTVAL:获取序列的下个值

CURRVAL:获取序列的当前值

当序列创建以后,必须先执行一次NEXTVAL,之后才能使用CURRVAL

获取序列的第一个值,并且使用序列值为EMP表插入新的记录:

删除序列

DROP SEQUENCE emp_seq;

索引

创建索引

CREATE [UNIQUE] INDEX index_name

        ON table(column[, column…]);

index_name表示索引名称

table表示表名

column表示列名,可以建立单列索引或复合索引

UNIQUE表示唯一索引

CREATE INDEX idx_emp_job_sal ON emp(job, sal);

可以增加函数

CREATE INDEX emp_ename_upper_idx

ON emp(UPPER(ename));

重建索引,提高索引空间利用率

ALTER INDEX index_name REBUILD;

删除索引

DROP INDEX idx_emp_ename;

为提升查询效率,创建和使用索引的原则:

1.为经常出现在WHERE子句中的列创建索引

2.为经常出现在ORDER BY、DISTINCT后面的字段建立索引。如果建立的是复合索引,索引的字段顺序要和这些关键字后面的字段顺序一致

3.为经常作为表的连接条件的列上创建索引

4.不要在经常做DML操作的表上建立索引

5.不要在小表上建立索引

6.限制表上的索引数目,索引并不是越多越好

7.删除很少被使用的、不合理的索引

约束

CONSTRAINT

非空约束(Not Null),简称NN

创建表时添加约束

CONSTRAINT employees_hiredate_nn NOT NULL

修改表时增加非空约束

ALTER TABLE employees

MODIFY (eid NUMBER(6) NOT NULL);

修改表时取消非空约束

ALTER TABLE employees

MODIFY (eid NUMBER(6));

唯一性约束(Unique),简称UK

CONSTRAINT employees_email_uk UNIQUE(email)

ALTER TABLE employees

ADD CONSTRAINT employees_name_uk UNIQUE(name);

主键约束(Primary Key),简称PK

在主键约束下的单字段或者多字段组合上不允许有空值,也不允许有重复值。

主键应是对系统无意义的数据

永远也不要更新主键,让主键除了唯一标识一行之外,再无其他的用途

主键不应包含动态变化的数据,如时间戳

主键应自动生成,不要人为干预,以免使它带有除了唯一标识一行以外的意义

主键尽量建立在单列上

ALTER TABLE employees3

ADD CONSTRAINT

employees3_eid_pk PRIMARY KEY (eid);

外键约束(Foreign Key),简称FK

ALTER TABLE employees4

ADD CONSTRAINT employees4_deptno_fk

FOREIGN KEY (deptno) REFERENCES dept(deptno);

检查约束(Check),简称CK

检查(Check)约束条件用来强制在字段上的每个值都要满足Check中定义的条件。当定义了Check约束的列新增或修改数据时,数据必须符合Check约束中定义的条件。

ALTER TABLE employees4

ADD CONSTRAINT employees4_salary_check

CHECK (salary > 2000);

其他

DEFAULT指定字段默认值

NOT NULL 指定字段值非空,相当于非空约束

oracle(转)的更多相关文章

  1. Oracle分析函数入门

    一.Oracle分析函数入门 分析函数是什么?分析函数是Oracle专门用于解决复杂报表统计需求的功能强大的函数,它可以在数据中进行分组然后计算基于组的某种统计值,并且每一组的每一行都可以返回一个统计 ...

  2. Linux平台 Oracle 10gR2(10.2.0.5)RAC安装 Part3:db安装和升级

    Linux平台 Oracle 10gR2(10.2.0.5)RAC安装 Part3:db安装和升级 环境:OEL 5.7 + Oracle 10.2.0.5 RAC 5.安装Database软件 5. ...

  3. Linux平台 Oracle 10gR2(10.2.0.5)RAC安装 Part1:准备工作

    Linux平台 Oracle 10gR2(10.2.0.5)RAC安装 Part1:准备工作 环境:OEL 5.7 + Oracle 10.2.0.5 RAC 1.实施前准备工作 1.1 服务器安装操 ...

  4. Oracle 的基本操作符

    != 不等于 select empno,ename,job from scott.emp where job!='manager' ^= 不等于 select empno,ename,job from ...

  5. 使用Zabbix监控Oracle数据库

    Orabbix介绍 监控Oracle数据库我们需要安装第三方提供的Zabbix插件,我们先测试比较有名的Orabbix,http://www.smartmarmot.com/product/orabb ...

  6. 基于Oracle安装Zabbix

    软件版本 Oracle Enterprise Linux 7.1 64bit Oracle Enterprise Edition 12.1.0.2 64bit Zabbix 3.2.1 准备工作 上传 ...

  7. Oracle Database 12c Data Redaction介绍

    什么是Data Redaction Data Redaction是Oracle Database 12c的高级安全选项之中的一个新功能,Oracle中国在介绍这个功能的时候,翻译为“数据编纂”,在EM ...

  8. 使用Oracle官方巡检工具ORAchk巡检数据库

    ORAchk概述 ORAchk是Oracle官方出品的Oracle产品健康检查工具,可以从MOS(My Oracle Support)网站上下载,免费使用.这个工具可以检查Oracle数据库,Gold ...

  9. 利用Oracle RUEI+EM12c进行应用的“端到端”性能诊断

    概述 我们知道,影响一个B/S应用性能的因素,粗略地说,有以下几个大的环节: 1. 客户端环节 2. 网络环节(可能包括WAN和LAN) 3. 应用及中间层环节 4. 数据库层环节 能够对各个环节的问 ...

  10. 使用技术手段限制DBA的危险操作—Oracle Database Vault

    概述 众所周知,在业务高峰期,某些针对Oracle数据库的操作具有很高的风险,比如修改表结构.修改实例参数等等,如果没有充分评估和了解这些操作所带来的影响,这些操作很可能会导致故障,轻则导致应用错误, ...

随机推荐

  1. P1004方格取数

    这是提高组得一道动态规划题,也是学习y氏思考法的第一道题. 题意为给定一个矩阵,里面存有一些数,你从左上角开始走到右下角,另一个人从右下角开始走到左上角,使得两个人取数之和最大,当然一个数只可以取走一 ...

  2. JDK 监控和故障处理工具总结 (转)

    出处:  JDK 监控和故障处理工具总结 JDK 监控和故障处理工具总结 JDK 命令行工具 jps:查看所有 Java 进程 jstat: 监视虚拟机各种运行状态信息 jinfo: 实时地查看和调整 ...

  3. 如何用纯 CSS 创作六边形按钮特效

    效果预览 在线演示 按下右侧的"点击预览"按钮可以在当前页面预览,点击链接可以全屏预览. https://codepen.io/comehope/pen/xjoOeM 可交互视频教 ...

  4. 从0开始入门ssm-crm系统实战

    喜欢就点个赞呗! GitHub项目ssm-learn-crm show me the code and take to me,做的出来更要说的明白 1.1 克隆 git clone https://g ...

  5. docker中centos7安装ssh服务

    来源:https://blog.csdn.net/qq_32969313/article/details/64919735 docker安装好后,自己动手做个自己的docker镜像,首先需要从服务器p ...

  6. 跑满带宽的一款百度网盘下载工具 : PanDownload

    下载地址 : 点击进入 官网上面也有介绍使用.在这里,我再说一下 下载之后,解压,运行,登录, 登录好之后,准备进行设置 重要:下载情况分以下三部分 下载内容 < 300M,选择`打包下载`,只 ...

  7. 24、Nginx缓存web服务

    通常情况下缓存是用来减少后端压力, 将压力尽可能的往前推, 减少后端压力,提高网站并发延时 1.缓存常见类型 服务端缓存 代理缓存, 获取服务端内容进行缓存 客户端浏览器缓存 Nginx代理缓存原理 ...

  8. 利用shell脚本做一个用户登录系统

    效果图如下: #!/bin/bash# while truedocat << EOF//======================\\\\| 用户登录系统 |-------------- ...

  9. 解压速度更快, Zstandard 1.4.1 发布

    zstd 1.4.1 发布了,zstd 又叫 Zstandard,它是一种快速无损压缩算法,主要应用于 zlib 级别的实时压缩场景,并且具有更好的压缩比.zstd 还可以以压缩速度为代价提供更强的压 ...

  10. swoole如何在后台运行

    swoole如何在后台运行 nohup php server.php &