SQL with NUll处理,Join系列,between,in对比exists以及少量题目

1.一些题目:

选择在每一组B值相同的数据中对应的a最大的记录的所有信息,(用于论坛每月排行榜)

Selecta,b,c from tableta  wherea=(select max(a) from tabletb where tableb.b= tableta.b )

随机抽取出10条数据

Select top 10 * from tablename order bynewid()

删除重复的记录

Delete from tablename where id notin(select max(id) from tablename group by col1,col2…..)

选择从10到15的记录

Select top 5 * from (select top 15* fromtable order by id asc) table_别名 order by id desc

oracle order by 处理NULL 值

适用情况: 
oracle 对查询结果进行排序时,被排序的栏位存在null值,且要指定NULL值排在最前面或者最后面 

关键字:Nulls First;Nulls Last 

默认情况:null 默认为最大值(即:asc 升序<小-->大>,null值排在最后;desc 降序<大-->小>,null值排在最前面) 

指定: 
1. Oracle Order by支持的语法 
2. 指定Nulls first 则表示null值的记录将排在最前(不管是asc 还是desc) 
3. 指定Nulls last 则表示null值的记录将排在最后(不管是asc 还是desc) 
语法举例:(Table:Tab_A 有部分空值的栏位Col_A) 
select * from Tab_A order by Tab_A. Col_A (asc/desc) nulls first ------>null 值排在最前面 
select * from Tab_A order by Tab_A. Col_A (asc/desc) nulls last ------>null 值排在最后面 

其他方法: 
在order by 的时候,用Nvl、NVL2 、Decode、case .....when....end;等函数对栏位的null值进行处理 
例如:select * from Tab_A order by NVL(Tab_A. Col_A,'abc' ) (asc/desc) ;


SQL JOIN类型的查询语句:


INNER JOIN//JOIN:如果表中有至少一个匹配,则返回行.(INNER JOIN 与 JOIN 是相同的.)
LEFT JOIN: 即使右表中没有匹配,也从左表返回所有的行
RIGHT JOIN: 即使左表中没有匹配,也从右表返回所有的行
FULL JOIN: 只要其中一个表中存在匹配,就返回行.在某些数据库中, FULL JOIN 称为 FULL OUTER JOIN。

1.INNER JOIN(join)
select u.realname,r.num,r.roles from userinfo as u INNER JOIN roles as r ON u.id=r.uid  
查询出符合条件的信息.

2.left join
select u.realname,r.num,r.roles from userinfo as u LEFT JOIN roles as r ON u.id=r.uid 
查询出符合条件的信息后,左表不匹配的也会从左表返回所有的行,并且显示右边的数据为空(但是已查出的某行数据<适合的可能是多条>,不会在最后不匹配队列中返回.)

3.right join
和left join反过来,不解释了.

4.full jion(FULL OUTER JOIN)
MySql貌似不支持,其实就是left jion,right jion,两个查询的 UNION 合集.

5.默认地,UNION 操作符选取不同的值。如果允许重复的值,请使用 UNION ALL。
UNION 操作符用于合并两个或多个 SELECT 语句的结果集。
请注意,UNION 内部的 SELECT 语句必须拥有相同数量的列。列也必须拥有相似的数据类型。同时,每条 SELECT 语句中的列的顺序必须相同。
补充2个SQLSERVER下的高级查询:

B: except 运算符[1有但2没有的数据]

EXCEPT运算符通过包括所有在 TABLE1 中但不在 TABLE2 中的行并消除所有重复行而派生出一个结果表。当 ALL 随EXCEPT 一起使用时(EXCEPTALL),不消除重复行。

C:intersect 运算符[1,2都有的数据]

INTERSECT运算符通过只包括 TABLE1 和 TABLE2 中都有的行并消除所有重复行而派生出一个结果表。当 ALL 随INTERSECT 一起使用时(INTERSECTALL),不消除重复行。 注:使用运算词的几个查询结果行必须是一致的。


3.between的用法

between限制查询数据范围时包括了边界值,not between不包括
select* from table1 where time between time1 and time2
selecta,b,c, from table1 where a not between 数值1and 数值2

4.使用in效率和exists效率

in适用于小数据量,如果大数据量使用exists.更详细的测试如下,不过我觉得前面的话就很适用了.

转载于:https://my.oschina.net/zhaoqian/blog/73276

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值