-- 此时,只要exists中的查询结果有一条或一条以上的数据时,执行前面的语句。-- exists中的查询结果没有数据时,则不运行前面的语句。
select * from sysuserwhere userName='cqb'and exists(select * from sysuserwhere userPassword="12345678")
(2)exists 与 in、not exists 与 not in的区别:
exists与not exists只关注返回集是否为空,而in与not in更关注于返回集的内容。
(1)from 多表:表示多表的各行相拼接
select * from sysuser s, dept dwhere s.deptId = d.deptId-- 一行对多行,并将两表合并输出;共2行,但有6列
userId | userName | userPassword | deptId | deptId(1) | deptName |
---|---|---|---|---|---|
1 | cqb | 12345678 | 1 | 1 | 研发部 |
2 | ywp | 87654321 | 2 | 2 | 产品部 |
(2)联表查询
from sysuser s where s.deptId in (select deptIdfrom dept dwhere d.deptId=s.deptId)-- where d.deptId=s.deptId 也是一行对多行,但只有单表输出;共3行,并且只有4列
(3)distinct关键字去重
select distinct(userName, userPassword)from sysuser--或者select distinct userName, userPasswordfrom sysuser--上述语句只有当userName与userPassword同时重复时才过滤,单个字段重复不过滤。
(4)oracle的并集(union、union all)、交集(intersect)、差集(minus) 用于两个查询语句之间
(1)并集(union与union all):两者的所有记录行
1)union:相交部分去重并集
java 2)union all:相交部分不去重并集 //一般不使用
(2)交集(intersect):去重的相交记录行,可用于查询区间(小,大) 相当于区间[1,2]
(3)差集(minus):以第一个查询语句为主,先查出第一个查询语句的结果;再看有没有在第二个查询语句结果中的,有则去掉,无则留下。
(5)decode关键字 相当与if条件语句
(6)rownum关键字
即为数据库操作客户端数据表中的行(不包括表头)
(7) onnect by [prior (字段)]关键字 第一次查询的结果可以记录下来
用于存在父子,祖孙,上下级等层级关系的数据表进行层级查询。
connect by进阶
(1)start with:指定起始节点的条件
(2)connect by prior (字段):可以查询使用了connect by后的根节点对应字段
例:表free
id freeId name
1 0 cqb
2 1 ywp
3 1 lyb
4 2 zb
SELECT ID, freeId, name, CONNECT_BY_ROOT(name) rootNameFROM freeSTART WITH freeId = 0 CONNECT BY PRIOR id = freeId;
查询结果为:
id freeId name rootName
1 0 cqb cqb
2 1 ywp cqb
4 2 zb cqb
3 1 lyb cqb
10、dual伪表
详细笔记
dual表是一个虚拟表,用来构成select的语法规则,oracle保证dual里面永远只有一条记录。
(1)查看当前用户,可以在 SQL Plus中执行下面语句 select user from dual;
(2)用来调用系统函数;
(3)得到序列的下一个值或当前值,用下面语句
select your_sequence.nextval from dual; --获得序列your_sequence的下一个值select your_sequence.currval from dual; --获得序列your_sequence的当前值
(4)可以用做计算器 ,如:select 7*9 from dual;
11、ground by 分组
select sno,sum(grade) from cs group by sno