sqlor和in
Ⅰ sql中 in的语句好慢,有什么好方法可取代
1、对于索引列来最好使用union all,因复杂的查询【包含运算等】将使or、in放弃索引而全表扫描,除非你能确定or、in会使用索引。
2、对于只有非索引字段来说你就老老实实的用or 或者in,因为 非索引字段本来要全表扫描而union all 只成倍增加表扫描的次数。
3、对于及有索引字段【索引字段有效】又包含非索引字段来时,按理你也使用or 、in或者union all 都可以,但是我推荐使用or、in。
Ⅱ SQL语句中 in和or的区别
SQL语句中 in和or的区别为:操作不同、适合不同、执行效率不同。
一、操作不同
1、in:in是把父查询表和子查询表作hash连接。
2、or:or是对父查询表作loop循环,每次loop循环再对子查询表进行查询。
二、适合不同
1、in:in适合用于子查询表数据比父查询表数据多的情况。
2、or:or适合用于子查询表数据比父查询表数据少的情况。
三、执行效率不同
1、in:在没有索引的情况下,随着in后面的数据量越多,in的执行效率不会有太大的下降。
2、or:在没有索引的情况下,随着or后面的数据量越多,or的执行效率会有明显的下降。
Ⅲ 在sql语句中 为什么where 字段=‘’or 字段=‘’与where 字段in(‘’,‘’)查询结果不同
sqlserver里and的优先级是大于or的,可以用括号来改变顺序,所以第一种写法改成这样 (仓库号='AB0002' or 仓库号='AB0003') and 工资<5000
Ⅳ 求优化sql,or in 速度太慢了,就查出来一条数据10秒 ,急求。。
--你的SQL有问题吧?C.ResourceNTAccount='user1'or'user1'in应该改成C.ResourceNTAccount='user1'orC.ResourceNTAccountin
建议:子查询SELECT
distinctB.ResourceNTAccount
FROM[ZhongJian].[dbo].[View_User_Group]A
leftjoinProjectServer_Reporting.dbo.MSP_EpmResource_UserViewBon
A.UserAccount=B.ResourceNTAccount
whereGroupName=N'项目副经理工作组'ANDB.资源所属项目like'%'+C.项目所属机构+'%'
中可不可以把最大化模糊匹配改成最右匹配或者直接改造成=,
方案一:
我观察你的SQL,首先selectdistinctC.[项目所属机构]AsProjectName,MIN(C.TaskBaseline0StartDate)asProjectStartDat中的distinct没有必要写,这样会消耗一部分时间
selectC.[项目所属机构]AsProjectName,MIN(C.TaskBaseline0StartDate)asProjectStartDate
fromView_TaskAllInfoCwhere(C.ResourceNTAccount='user1'orC.ResourceNTAccountin(
SELECT
distinctB.ResourceNTAccount
FROM[ZhongJian].[dbo].[View_User_Group]A
leftjoinProjectServer_Reporting.dbo.MSP_EpmResource_UserViewBon
A.UserAccount=B.ResourceNTAccount
whereGroupName=N'项目副经理工作组'ANDB.资源所属项目like'%'+C.项目所属机构+'%'
))
groupbyC.[项目所属机构]
--方案一:
--若效果不佳,可以把整个SQL拆分两个部分
selectselectdistinctC.[项目所属机构]AsProjectName,MIN(C.TaskBaseline0StartDate)asProjectStartDate
from
(
selectdistinctC.[项目所属机构]AsProjectName,MIN(C.TaskBaseline0StartDate)asProjectStartDate
fromView_TaskAllInfoCwhereC.ResourceNTAccount='user1'
unionall
selectdistinctC.[项目所属机构]AsProjectName,MIN(C.TaskBaseline0StartDate)asProjectStartDate
fromView_TaskAllInfoCwhereC.ResourceNTAccountin
SELECT
distinctB.ResourceNTAccount
FROM[ZhongJian].[dbo].[View_User_Group]A
leftjoinProjectServer_Reporting.dbo.MSP_EpmResource_UserViewBon
A.UserAccount=B.ResourceNTAccount
whereGroupName=N'项目副经理工作组'ANDB.资源所属项目like'%'+C.项目所属机构+'%'
)ast
Ⅳ SQL IN 的效率高还是 or的效率高
执行的效率是一样的。
两极化的plan
hash
value一模一样,说明他们内部执行是一模一样的
Ⅵ SQL语句中的OR,IN 关键字
因为 and 的优先级比 or 大。所以楼上的就用括号括起来了。
Ⅶ SQL中,in与or作用相当,我就弄不明白,不就是字母不同吗咋就in牛逼点,字母这东西还不是唯心
使用场景不太一样。
(1)or 可能是多个字段的 或条件,例如 找一个学生 班级是一班 或者 学习会计专业的也行。
class ='1班' or major='会计'
(2)in 一般是 一个字段多值的情况,例如 找一个学生 班级是一班 或者 二班,或者三班
class in ('1班','2班','3班')
PS:还有就是当结果非常多事你不可能都写出来,in可以使用在别的查询条件中,例如找一个参加了数学考试的学生信息。
select * from students where Sno in (select Sno from Exam where class='数学')
Ⅷ 操作符的SQL里的操作符
相等:相等操作符在SQL语句里比较一个值与另一个值,等号(=)表示相等。在进行相等比较时,被比较的值必须完全匹配,否则就不会返回数据。如果在相等比较过程中两个值相等,那么这个比较的返回值就是true,否则就是false。这个布尔值(true或false)用于决定是否返回数据。
不相等:在SQL里表示不相等的操作符是<>(一个小于号和一个大于号)。如果两个值不相等,条件就返回true,否则就返回false。另一种表示不相等的方式是!=,而且很多主要的SQL实现采用这种方式。
小于:<
大于:>
比较操作符的组合:等号可以与小于号和大于号联合使用。 用户对SQL关键字而不是符号进行比较。
is null:这个操作符用于与null值进行比较。
between:操作符between用于寻找位于一个给定最大值和最小值之间的值,这个最大值和最小值是包含在内的。between是包含边界值的,所以查询结果里会包含指定的最大值和最小值。
in:操作符in用于把一个值与一个指定列表进行比较,当被比较的值至少与列表中一个值相匹配时,它会返回true。使用操作符in可以得到操作符or一样的结果,但它的速度更快。
like:操作符like利用通配符把一个值与类似的值进行比较,通配符有两个:百分号(%);下划线(_)。百分号代表零个、一个或多个字符;下划线( _ )代表一个数字或字符。
exists:这个操作符用于搜索指定表里是否存在满足特定条件的记录。
all:操作符all用于把一个值与另一个集合里全部值进行比较。
any/some:操作符any用于把一个值与另一个列表里任意值进行比较。some是any的别名,它们可以互换使用。 如果想在SQL语句里利用多个条件来缩小数据范围,我们就需要组合多个条件。这正是连接操作符的功能。
and:操作符and让我们可以在一条SQL语句的where子句里使用多个条件。在使用and时,无论SQL语句是事务操作还是查询,所有由and连接的条件都必须为true,SQL语句才会实际执行。
or:操作符or可以在SQL语句的where子句中连接多个条件,这时无论SQL语句是事务操作还是查询,只要or连接的条件里有至少一个是true,SQl语句就会执行。
注意:比较操作符和逻辑操作符都可以单独或彼此复合使用。
提示:当SQL语句里包含多个条件和操作符时,利用圆括号把语句按照逻辑关系进行划分可以提高语句的可读性。当然,不恰当地使用圆括号也会影响输出结果。 操作符not可以颠倒逻辑操作符的含义,它可以与其他操作符构成以下几种形式:
not equal:不相等
not between:操作符between的求反
not in:操作符in的求反
not like:操作符like的求反
is not null:操作符is null的求反
not exists:操作符exists的求反
not unique:操作符distinct的求反 加法(+)
减法(-)
乘法(*)
除法(/)
算术操作符可以彼此组合使用,并且遵循基本算数运算中的优先级:首先执行乘法和除法,然后是加法和减法。用户控制算术运算次序的唯一方式是使用圆括号,圆括号里包含的表达式会被当作一个整体进行优先求值。
Ⅸ sql语句中条件查询里in、like、及=三个的效率怎么样
1、如果条件字段都是非索引字段,那么效率都差不多,就看结果大小。
2、有差别的在于条件字段是索引字段时:
=在所以的情况下都会进行索引扫描,所以效率总是高的。
like 当模糊查询为右模糊,比如'abc%'时,扫描索引,高效。
当模糊查询含左模糊时,比如'%abc',进行全表扫描,低效。
in的作用等同于or ,也是进行索引扫描,高效。
另外,in还可以连接查询结果集,这时往往会和exists做比较。
a、 select * from t1 where f1 in (select f1 from t2 where t2.fx='x'),
其中子查询的where里的条件不受外层查询的影响,这类查询一般情况下,自动优化会转成exist语句,也就是效率和exist一样。
b、 select * from t1 where f1 in (select f1 from t2 where t2.fx=t1.fx),
其中子查询的where里的条件受外层查询的影响,这类查询的效率要看相关条件涉及的字段的索引情况和数据量多少,一般效率不如exists,数据量大时,效果就更加明显。
Ⅹ sql in好还是or好,我的条件有五六个以上,但用or的话感觉太长了,不知道哪个效率高点
自己没测试过,这两篇文章看着比较靠谱:
网页链接作者结论:如果in和or所在列有索引或者主键的话,or和in没啥差别,执行计划和执行时间都几乎一样。在没有索引的情况下,随着in或者or后面的数据量越多,in的效率不会有太大的下降,但是or会随着记录越多的话性能下降非常厉害
网页链接作者结论:总体来说,In的效率更高一些。