Oracle数据库基本操做sql
1.概述数据库
Oracle数据库客户端通常须要安装在服务器上,能够在服务器端操做,通常咱们能够用sql developer工具远程链接到数据库,先行创建数据库,而后对表进行增删改查。也可使用MyEclispse的DB Broswer工具进行链接数据库并进行简单的增删改查。安全
2.SQL语句服务器
Data Definition Language(DDL):函数
主要用于创建、修改、删除数据库对象(表),不须要事务的参与工具
CREATE:建立表spa
CREATE TABLE emp( id NUMBER(10), name VARCHAR2(20), gender CHAR(1), birth DATE, salary NUMBER(6,2), );
DESC :查询表结构指针
DESC emp;code
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 Language(DML)
用于对数据记录进行操做,包括插入,删除,修改。须要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 Language(TCL)
事务控制语言,包括commit提交,rollback回滚,savepoint保存点(能够回退到指定保存点)。在sql developer中为图标。
Data Query Language(DQL)
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 1500 AND 3000;
使用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 * 12 >100000;
使用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) >4000;
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 8 AND 10;
使用子查询和ROWNUM进行分页
分页操做须要有一个做为分页标准的数据,该数据线进行排序,排序的结果做为视图被父查询用伪列标识顺序数字,而后在最外面的爷爷查询对伪列进行分页。
如:
SELECT * FROM (SELECT ROWNUMrn , t.* FROM (SELECT empno,ename,sal FROM emp ORDER BY sal DESC) t ) WHERE rn BETWEEN 8 AND 10;
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, '研发部',1,'市场部',2,'销售部',3), 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 Language(DCL):
用于执行权限的授予和收回操做、建立用户等,包括授予(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 = 10 WITH READ ONLY;
使用DCL语句能够受权用户建立视图的权限,
GRANT CREATE VIEW TO tarena;
建立简单视图
CREATE VIEW v_emp_10 AS SELECT empno, ename, sal, deptno FROM emp WHERE deptno = 10;
查询视图
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 指定字段值非空,至关于非空约束