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

本文介绍了一系列实用的SQL查询技巧,包括获取特定条件下的最大值记录、随机抽取数据、删除重复记录、选择特定范围内的记录、处理NULL值排序、使用JOIN进行表连接、利用between和in与exists的区别等。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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

### SQL 中 `NOT EXISTS` 的用法 `NOT EXISTS` 是一种用于子查询的关键字,通常用来测试是否存在满足特定条件的结果集。如果子查询返回空结果,则整个表达式的布尔值为真;否则为假。 #### 使用场景 当需要查找某些记录不存在于另一张表中的情况时,可以使用 `NOT EXISTS` 来实现这一逻辑[^1]。它常被应用于复杂的多表关联查询中,尤其是涉及否定条件的情况下。 以下是具体的语法和示例: --- #### 语法结构 ```sql SELECT column_list FROM table_name AS outer_query WHERE NOT EXISTS ( SELECT * FROM another_table AS inner_query WHERE condition_between_outer_and_inner_queries); ``` - **outer_query**: 外层查询所操作的主要表格。 - **inner_query**: 子查询部分,在这里定义与外层查询的关系以及过滤条件。 - **condition_between_outer_and_inner_queries**: 连接内外两层查询的条件语句。 --- #### 示例代码 假设我们有两个表:`employees` 和 `departments`。现在希望找到那些没有任何部门分配给他们的员工名单。 ```sql -- 主表 employees 包含所有雇员的信息 -- 辅助表 departments 记录各部门及其对应的负责人信息 SELECT e.name, e.id FROM employees AS e WHERE NOT EXISTS ( SELECT d.employee_id FROM departments AS d WHERE d.employee_id = e.id); -- 判断是否有对应关系存在 ``` 上述例子通过嵌套的方式实现了只选取未加入任何部门管理下的个人资料列表的功能[^2]。 另外需要注意的是,虽然也可以采用左连接加 NULL 检查的方法来完成相同任务 (`LEFT JOIN ... IS NULL`) ,但在性能表现上可能因具体数据库引擎而异,因此推荐根据实际情况选用最合适的方案[^3]。 --- #### 性能考量 对于大规模数据集合而言,合理设计索引能够显著提升带有 `EXISTS/NOT EXISTS` 查询的速度。特别是针对内部子查询涉及到频繁访问字段建立适当索引尤为重要[^4]。 --- ### 结论 综上所述,掌握了如何正确运用 `NOT EXISTS` 后可以帮助开发者更高效地处理复杂业务需求下关于排除型筛选的问题解决方案。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值