可以使用表集合 *** 作的相减运算 *** 作符 minus ,意思是返回在第一个查询中存在但是在第二个查询中不存在的行,也就是 数学中的 2个集合的 差集运算, 例如
select from text1minus
select from text2;
Oracle数据库基本 *** 作
1概述
Oracle数据库客户端一般需要安装在服务器上,可以在服务器端 *** 作,一般我们可以用sql developer工具远程连接到数据库,先行建立数据库,然后对表进行增删改查。也可以使用MyEclispse的DB Broswer工具进行连接数据库并进行简单的增删改查。
2.SQL语句
Data Definition Language(DDL):
主要用于建立、修改、删除数据库对象(表),不需要事务的参与CREATE:创建表
CREATE TABLE emp(
id NUMBER(10),
name VARCHAR2(20),
gender CHAR(1),
birth DATE,
salary NUMBER(6,2),
);
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 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逻辑 *** 作符连接这些条件SELECT ename, sal, job FROM emp
WHERE sal> 1000 AND job = 'CLERK';
使用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 table1column, table2column
FROM table1, table2
WHERE table1column1 = table2column2;
SELECT table1column, table2column
FROM table1JOIN table2
ON(table1column1 = table2column2);
关联查询有三种连接方式
内连接返回关联表中所有满足条件的记录(也称等值连接)外连接返回一些不满足条件的记录,外连接有左外连接,右外连接和全外连接三种形式其中左外连接返回左边所有记录而不必管右边是否匹配,如不匹配则为NULL值,右外连接返回右边所有记录而不必管左边的记录是否匹配,如不匹配则默认NULL,全外连接返回左边和右边所有的数据,左右边不匹配的数据,对应的其他字段值为NULL,格式如下
JOIN ON式
SELECT table1column, table2column
FROM table1 [LEFT | RIGHT | FULL] JOIN table2ON table1column1 = table2column2;
WHERE式
Select from dave a,bl b where aid=bid(+);+号的位置和意义
‘+’号加在哪个表,哪个表就是关联表,另一张表就是基表。基表全部显示,关联表匹配显示。+在左边就是右外连接,+在右边就是左外连接。
自连接:
表示数据的来源是同一张表的内容,即将一张表中的不同列进行连接,可以是等值或者不等值。实现方式是利用别名将一张表看作两张表。
SELECT workerempnow_empno,workerenamew_ename, managerempnom_empno, managerenamem_enameFROM emp worker join emp manager
ON workermgr = managerempno;
SQL高级查询:
子查询:
子查询用在WHERE里
在SELECT中,往往WHERE的限制条件并不是一个确定的值,而是来源于另一个查询结果,即需要在另一个查询结果的基础上进行查询,这个时候为另一个查询提供数据的查询就叫做子查询。
SELECT eename, ejob FROM emp e
WHERE ejob = (SELECT job FROM emp WHERE ename = 'SCOTT');可以与多行/单行比较 *** 作符混合使用。
子查询用在HAVING子句
SELECT deptno, MIN(sal) min_sal FROM emp GROUP BY deptnoHAVING 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 12,
'ANALYST', sal 11,
'SALESMAN', sal 105,
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 empWHERE 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
一:
如果有exp备份,可以把表import恢复到另一个用户下,然后通过原表和新表比对出删除的数据,然后在插入回原表;
例如:
误删除user1用户下tab1表一部分数据
可以通过exp备份将tab1导入到user2内,然后比对user1tab1和user2tab1数据差集
insert into user1tab1
select from user2tab1
minus
select from user1tab1;
二:如果没有exp备份
可以通过闪回查询得出几分钟之前的数据,生成一个新表,然后插回到原表
例如:
select from tab1 as of timestamp (systimestamp - interval '5' minute);
查询是数据的一个重要 *** 作。用户发送查询请求,经编译软件变异成二进制文件供服务器查询,后返回查询结果集给用户,查询会产生一个虚拟表,看到的是表形式显示的结果,但结果并不真正的存储,每次执行查询只是从数据表中提取数据,并按照表的形式显示出来。
SELECT <列名>
FGROM <表名>
[WHERE <查询条件表达式>]
[GROUP BY <分组表达式>]
[HAVING <分组查询表达式>]
[ORDER BY <排序的列名> [ASC或DESC]]
group by 用于对查询的结果分组统计,通过对group by后面的名字进行分组后输出结果。
group by后面还可以跟多列表示 多列分组 ,在多列分组时放前面的优先分组。
group by 列名,列名
having 子句用于限制分组显示结果,其只能和group by一起连用。在where中没有办法直接使用聚合函数,即sum avg等无法使用,所以引用了having,在having中可以使用这些函数。
order by 表示排序,后跟列名和排序方式。如果什么都不加默认为升序。ASC表示升序,DESC表示降序。
在Oracle中还可以设置多列排序
order by 列名1 升降,列名2 升降;
前面的为主要排序,后面的为次一级排序。
注:碰到自己与自己比较的情况下,不能用having,可以创建一个新列。
注:如果select语句同时包含group by,having,order by,按group by,having,order by排序
分组和聚合一起使用,目的是为了统计信息。
where是为了from服务的,只能跟 真实的字段 ,用来筛选from子句中指定的 *** 作所产生的行
group by 用来分组where子句的输出
having 用来从分组的结果中筛选行
order by用来对筛选的结果进行排序
(1)分组函数:max min avg sum count
max表示该列的最大值,min表示该列的最小值,avg表示该列的平均值,sum表示该列的和,count表示该列的行数。
注:分组函数(max、min、avg、count、sum)只能出现在选择列表中having子句、order by子句、不能出现在where子句和group by子句中。
(2)多表查询
多表查询是指两个和两个以上的表或者是视图的查询,在实际应用中,当查询单个表不能满足需求时,一般使用多表查询。如:显示sales部门位置和其员工的姓名,这种情况下需要使用到(dept表和emp表)。
多表查询的连接一般可以分为:内连接、左外连接、右外连接、全连接。
注:在使用多表查询的时候每个表可以设置别名,如果表指定了别名,那么语句中所有语句必须使用别名,而不能再使用实际表名。且在写属性的时候如果属性为其中一个表特有的属性则不需要写别名,如果是两个表都有则必须指定是哪一个表的哪个属性格式为:表名属性名。
select 列名 from 表1 别名,表2 别名
注:e是emp的别名,d是dept的别名。
但如果对表进行了 *** 作则需要设置别名,如:查询每个部门中工资高于该部门平均工资的员工人数。在其中有一个avg表,这个表必须设置别名(提醒:如果仅有一个被修改的表,则可以不设置别名,但如果有多个表则必须设置别名)。
内连接
内连接通过使用比较运算符来使每个表的通用列中的值匹配来组成一个新表,即:把两个表中间共有的那些行拿出来进行连接,如果某些行不是两个表共有的,则不进行连接。
select
from 表1
inner join 表2
on 匹配条件
或
select
from 表1 表2
where匹配条件
左外连接
左外连接与内连接的区别是:设置左外连接的时候设置了主表和附表,主表在前,附表在后。内连接是将两个表匹配的地方输出出来,而左外连接则是主表全写,附表一一对应,附表有则加上,没有不写。
select
from 表1
left join 表2
on 匹配条件
右外连接
右外连接和左外连接基本相同只是右外连接的主表写在后边。
select
from 表1
right join 表2
on 匹配条件
全连接
全连接是在等值连接的基础上将左表和右表的未匹配数据都加上,使用的关键字为full outer join或者full join。
select
from 表1
full join 表2
on 匹配条件
自连接
还有一种特殊情况即自连接,在Oracle中一个表无法与自己进行比较,所以当需要自己表的两个信息做比较的时候也需要使用连接来连接,即同一张表的连结查询。
(3)子查询
子查询是指嵌套在其他sql语句中的select语句,也叫嵌套查询。sql语句执行顺序为从右到左执行,所以在执行查询时会先执行左侧的子查询后进行主查询。
子查询分为单行子查询和多行子查询,单行子查询是指返回一行数据的子查询语句,多行子查询是指返回多行数据的查询语句。子查询还可以分为多列子查询、多行子查询、多列多行子查询。
在进行子查询时如果内部查询不返回任何记录,则外部条件中字段DEPTNO与NULL比较永远为假,也就是说外部查询不返回任何结果。
总结为:
单行子查询是指子查询只返回单列、单行数据
多行子查询是指返回单列多行数据,都是针对单列而言的
多列子查询则是指查询返回多个列数据的子查询语句
单行子查询
where deptno = (单行数值)
多行子查询
where deptno in ( 多行数值 )
多列子查询:
where (job,deptno)=(select job,deptno from emp where ename='KING')
多列多行子查询
where (job,deptno) in (select job,deptno from emp where ename='KING')
单行子查询
在单行子查询的外部查询中可以使用=、>、<、>=、<=、<>等比较运算符。
内部查询返回的结果必须与外部查询条件中字段(DEPTNO)相匹配。
多行子查询
在WHERE子句中使用多行子查询时,可以使用多行比较运算符(IN,ALL,ANY)。
IN:等于任何一个。
ALL:和子查询返回的所有值比较。例如:sal>ALL(1,2,3)等价于sal>3,即大于所有。
ANY:和子查询返回的任意一个值比较。例如:sal>ANY(1,2,3)等价于sal>1,即大于任意一个就可以。
注:ANY运算符必须与单行比较运算符结合使用,并且返回行只要匹配子查询的任何一个结果即可。
多列子查询
多列子查询和多行子查询相同,只是使用多列子查询的时候会有多列进行匹配。
(4)集合运算
为了合并多个select语句的结果,可以使用集合 *** 作符号union,union all,intersect,minus。
union:该 *** 作符用于取得两个结果集的并集。当使用该 *** 作符时,会自动去掉结果集中重复行
union all:该 *** 作与union相似,但是它不会取消重复行,而且不会排序
intersect:使用该 *** 作符用于取得两个结果集的交集
minus:使用该 *** 作符用于取得两个结果集的差集,它只会显示存在第一个集合中,而不存在第二个集合中的数据
总结为集合运算就是将两个或者多个结果集组合成一个结果集。
intersect 交集 返回两个查询共有的记录
union all 并集 返回各个查询的所有记录,包括重复的记录
union 交集 返回各个查询的所有记录,不包括重复的记录
MINUS 补集 返回第一个查询检查出的记录减去第二个查询检索出来的记录之后剩余的记录
注意:当使用集合 *** 作的时候,查询所返回的列数以及列的类型必须匹配,列名可以不同。
(1)Distinct关键字
在Oracle中,可能出现若干相同的情况,那么可以用Distinct消除重复行
(2)多表查询与单行子查询可以实现相同的功能
查询出销售部(sales)下面的员工姓名,工作,工资
(3)显示高于自己部门平均工资的员工信息
分析:
1找到所有部门的平均工资
select deptno,avg(sal) from emp group by deptno;
2找到所有人的工资信息
select ename,sal,deptno from emp;
3把两个结果集使用多表连接组合组合起来
select from emp,(select deptno,avg(sal) avgsal from emp group by deptno) damao where empdeptno=damaodeptno;
4去掉低于平均工资的那些数据即可:
select from emp,(select deptno,avg(sal) avgsal from emp group by deptno) damao where empdeptno=damaodeptno and sal>avgsal;
(4)emp表介绍
字段 类型 描述
empno NUMBER(4) 表示雇员编号,是唯一编号
ename VAECHAR2(10) 表示雇员姓名
job VARCHAR2(9) 表示工作职位
mgr NUMBER(4) 表示一个雇员的领导编号
hiredate DATE 表示雇佣日期
sal NUMBER(7,2) 表示月薪,工资
comm NUMBER(7,2) 表示奖金,或者称为佣金
deptno NUMBER(2) 部门编号
许多人愁不会Oracle 10g的高级查询,其实也是比较简单的。在查询数据时,为了获取完整的信息就要将多个表连接起来,这也是关系数据库的一个重要特性---表之间存在的关系。这种关系可以将表的数据联系起来。多表查询就是根据这种关系,实现从多个表中获取数据还原信息。下面这个图就是我将要 *** 作的表结构。
工具/材料电脑
Oracle 10g
01基本连接查询
在简单查询中我们一般只使用了from字句的一个表,然而在关系数据库中,表与表之间往往是存在关系的,这就是要求从多个表中检索数据,以输出更有意义的结果。最简单的连接方式就是在select语句中,通过from子句使用多个表,并用逗号将不同的基本表隔开。下面语句将商品信息表和供应商信息表连接起来,查询其中的商品名称,产地,供应商名称。
02但此时结果显示该查询语句共显示了200行记录,这显然是错误的。因为仅仅通过select和from子句连接那么查询结果将是一个通过笛卡儿积生成的表,包含大量无意义的信息。而where语句可以有效避免笛卡儿积的出现。只有当两个表具有相同匹配的列时才返回结果集。例如下面语句通过在where子句中使用连接条件,实现了每件商品名称,产地,供应商名称信息。
03但也要注意一个问题如果想要查询“供应商编号”应该怎么处理,因为两个表中都有“供应商编号”,所以应该查询的时候限定一下,说明究竟是哪一个表中的。
04join连接查询
join用于连接两个不同的表,on用于给出这两个表之间的连接条件。如果进一步限制查询范围,可以在后面添加where语句,下面示例使用从商品信息表和供应商信息表查询单价大于1200元的商品信息。
05并且join连接也可以实现两个以上的表查询,写语句的时候一个join对应一个on,看下面的例子。
06自然连接查询
其实自然连接查询(natural join)就是更加方便的join连接查询,自然连接不必指定任何同等连接条件,系统将自动判断出具有相同名称的列然后形成匹配,但注意自然连接是根据两个表中同名的列而进行连接的,当列不同名时,自然连接将失去意义。
07集合 *** 作查询
集合 *** 作就是将两个或多个SQL查询结合构成符合查询,集合 *** 作符有union(并集)、intersect(交集)、minus(差集),现在以union为例,union查询必须从每个表中读取相同的列。
08子查询
子查询和连接查询一样提供了使用单个查询访问多个表中的数据的方法,使用in关键字,意思是在in后面的集合中查询我们需要的,即in后面是限定条件。
特别提示注意在Oracle 10g中的标点符号是英文状态下的
intersect就是交集minus就是差集交集就是两个结果集中都有的元素比如selectuidfromtb1intersectselectuidfromtb2那么既存在tb1又存在tb2中相同的UID就会查出来差集:selectuidfromtb1minusselectuidfromtb2存在于tb1但不存在与tb2中的uid会被查出
以上就是关于ORACLE行相减怎么处理全部的内容,包括:ORACLE行相减怎么处理、oracle里面更新 *** 作能带有四则运算吗、oracle 中删除了部分数据 需要还原备份数据 并且把那部分的数据放进去 怎么整 求大神等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)