您的位置:首页 > 数据库 > Oracle

oracle子查询

2016-07-20 11:56 483 查看

子查询:

查询子查询

查询子查询就是将查询出来的结果当成一张表来查询。

1:Select *From (

selectdeptid,usersex,count(1) from T_userinfo

groupby deptid,usersex

) t

wheret.deptid not in (5,6)

2:oracle的分页语句。

Select*

From (Select rownum rn, t.*

From (Select * From T_userinfo order byuserid asc) t

where rownum <= 10) temp

where temp.rn > 0;

Select*

From (Select rownum rn, t.*

From (Select * From T_userinfo order byuserid asc) t

where rownum <= 20) temp

where temp.rn > 10;

分析:

Select* From T_userinfo order by userid asc

先将查询出来的所有数据当成一张表t

Selectrownum rn, t.*

From (Select * From T_userinfo order byuserid asc) t

where rownum <= 20

然后再加上伪列,查询出前20条数据,再将其当做一张表temp

Select *

From (Select rownum rn, t.*

From (Select * From T_userinfo order byuserid asc) t

where rownum <= 20) temp

where temp.rn > 10;

最后再查询出最后的结果,即第10行到第20行

那么为什么不直接用伪列查询出第10行到第20行呢?

原来伪列只能从1开始,即只能小于不能大于。如果直接查询第10行到 第20行的话伪列是0到10的。是查询不出来的。oracle数据库就会报错。

更新/删除子查询

--重复的数据1:

Select*

From T_Userinfo

where username in

(Select username

from (Select username, password, truename,usersex, count(1)

From T_Userinfo

group by username, password, truename, usersex

havingcount(1) > 1

order by count(1) desc) t)

orderby username asc,userid asc

先根据重复条件查找数量大于一的数据(重复数据)

然后查找这些数据的用户名

最后根据用户名查找整条数据

--重复的数据2:

Select*

From T_userinfo a

inner join T_userinfo b

on a.username = b.username

and a.password = b.password

and a.truename = b.truename

and a.usersex = b.usersex

and a.userid != b.userid

order by a.username asc, a.userid asc

内连接

--删除重复的数据,留一条。

DeleteFrom T_userinfo a

wherea.userid != (

Select min(userid) From T_userinfo b

where a.username = b.username

and a.password = b.password

and a.truename = b.truename

and a.usersex = b.usersex

)
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: