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.更详细的测试如下,不过我觉得前面的话就很适用了.