-
2019-10-03 12:20:26
摘要:
SQL的WHERE子句中包含多个AND和OR
示例:
SQL解析器在处理操作时会优先处理and操作:
假如有表product字段如下:id、product_id、product_price、product_name,现在要查找产品号为100或者101,并且价格大于200的商品,程序员可能会这样写:
select * from product where product_id = 100 or product_id = 101 and product_price > 200
上述代码中,SQL解析器首先进行and 的操作,最后就成了这个意思:查找产品号为101且价格大于200或产品号为100 的商品。
添加圆括号即可:
select * from product where (product_id = 100 or product_id = 101) and product_price > 200
sql注入中的万能密码一般都会多加几个or,username' or 1=1 or 1=1 --+
更多相关内容 -
SQL条件查询 where
2021-03-17 17:17:45条件查询 where 语法:select 数据 from 数据源 where 进行过滤条件 select * from emp; select ename,sal,comm,job from emp; 当需要查询的字段不多的时候 建议写出字段名 方便后期操作。 select * from emp where ...条件查询 where
语法:select 数据 from 数据源 where 进行过滤条件
select * from emp; select ename,sal,comm,job from emp; 当需要查询的字段不多的时候 建议写出字段名 方便后期操作。 select * from emp where 1=1 and 条件1 and 条件2 and ...; 建议构面跟 where 1=1 方便以后添加条件
where 后条件符:!=取反
= 等于
<>不等于 <20> 不等于20 的
>= 大于等于
<=小于等于
条件与条件之间的连接符
1). and 与,
且
条件1 and 条件2 既满足条件1 也要满足 条件2
1和2 的交集
**例:**工资在1000~2000之间的员工所有信息
条件 :
员工信息表;工资1000~2000; 员工所有信息
select * from emp where sal>=1000 and sal<=2000;
2). or 或
条件1 or 条件2 满足条件1 或者 条件2
1和2 并集 【and 交集】
**例:**工资小于1000 或者 大于2000 的所有员工信息。 两个条件集的合并
条件:
员工信息表;工资小于1000 工资大于2000
select * from emp where sal>2000 or sal<1000;
3). not 条件取反
not 语法:
例: 1.部门编号不是20的
select * from emp where not deptno=20;
2.没有奖金的所有员工信息
【 null 的判断
1. null没有赋值
2.不能用= 或者 != 判断
3. null 用 is 连接】
select * from emp where not comm is null;
select * from emp where comm is not null;
【注意:不能用中式英语 老外不承认 】
select * from emp where comm not is null; --错误:中式英语, 奖金不是空
4). between(值1)and(值2) 区间
**例:**工资在1000~2000的所有员工信息
select * from emp where sal between 1000 and 2000;
查询语句的执行流程
from–> where–>select
**1.**先从from后表格中拿出数据一条条的
用where 判定
再输出到查询结果select
**2.**where 后面不能使用字段名
例: 查询年薪大于15000的员工信息
分析条件 :员工信息表; 员工年薪; 大于15000:
【查询所得 员工年薪 的结果集
把结果集当做数据源头
,先运算再过滤】
select ename,empno,job,mgr,sal,comm,(sal+nvl(comm,0))*12 年薪 from emp;
select ename, empno, job, mgr, sal, comm, 年薪 from (select ename,empno,job, mgr, sal,comm, (sal + nvl(comm, 0)) * 12 年薪 from emp) where 年薪 > 1500;
some(值列表) all()any()
**1.**some(值1,值2,值3) 3 个值得并集
例:
select * from emp sal>some(1250,5000,3000); 最后显示为大于1250 的所有员工信息
**2. ** any( 值1,值2,值3) 满足任何一个就行 三个值的并集
select * from emp sal>any(1250,5000,3000); 最后显示为大于1250 的所有员工信息
3. all(值1,值2,值3) 满足任何一个 三个值并集
select * from emp sal>all(1250,5000,3000); 最后显示为大于1250 的所有员工信息
集合操作
Union、Union All、Intersect、Minus
Union 并集(去重) 对两个结果集进行并集操作,不包括重复行同时进行默认规则的排序;
Union All 全集(不去重) 对两个结果集进行并集操作,包括重复行,不进行排序 ;
Intersect 交集(找出重复) 对两个结果集进行交集操作,不包括重复行,同时进行默认规则的排序;
Minus 差集(减去重复) 对两个结果集进行差操作,不包括重复行,同时进行默认规则的排序
例
select * from emp where deptno>10; intersect --(union|union all|intersect|minus) select * from emp where sal>1000;
排序 order by (可以给多个)
语法:select 数据 from 数据源 where 行过滤条件 order by(有排序需求写) 字段名 desc(降序)|asc(默认升序);
【执行流程:from–>where–>select–>order by】
例 所有员工信息,工资按降序排列 工资一样的按奖金的降序排名
select * from emp where 1=1 order by sal desc,comm desc;
所有的员工信息,奖金按降序排名,没有奖金的放在前面
select * from emp where 1=1 order by comm desc nulls first; --null放在前面 select * from emp where 1=1 order by comm desc nulls last; --null放在后面
子查询: 查询语句 嵌套 查询语句
例:查询KING同部门员工信息
分析条件
- 查询KING所在的部门
select deptno from emp where name='KING';
- 查询KING所在部门的员工所有信息 嵌套
select * from emp where deptno=(select deptno from emp where name='KING');
-
查询年薪大于15000的员工的所有信息
条件分析-- 查询所有员工的年薪 和所有信息
select empno,ename,job,sal,comm,(sal+nvl(comm,0))*12 年薪 from emp;
**【以上作为一个新的结果集,数据源】**
查询年薪大于15000 的员工所有信息
select empno, ename, job, sal, comm, 年薪 from (select empno, ename, job, sal, comm, (sal + nvl(comm, 0)) * 12 年薪 from emp) where 年薪 > 15000;
in 的便用
例: 查询 10 .20 部门的员工信息
- or.或
select * from emp where deptno=10 or deptno=20;
and 和
select * from emp where deptno=10 and deptno=20;
条件符号,
select * from emp where deptno<=20;
- 集合操作 【上面有详细集合,此处用了一个】
select * from emp where deptno=20 union select * from emp where deptno=10;
-
in ( 值1,值2 ,值3) 条件等于in里的值
select * from emp where deptno in(10,20);
【注意:= 与 in 的区别
= 只可以等于一个值
in 可以是多个值 或者一个值】
like 模糊匹配
like: 模糊匹配 效率低 where like ’ ’ 单引号
配合 : --> % _ 百分号 下划线使用
%: --> 任意个数任意字符 使用
_ : --> 一个任意字符
= :精确匹配
例: 1.查询名字里有A的
select * from emp where ename like '%A%';
2. 查询名字里 A开头的
select * from emp where ename like 'A%';
3.查询名字里第二个字母为A的
select * from emp where ename like '_A%';
4.查询名字里倒数第二个字母为A的
select * from emp where ename like '%A_';
函数
函数分为系统内置函数 自定义函数
根据函数的返回值分为:1.单行函数,一条记录返回一个结果
2.多行函数 ,多行函数 组函数 聚合函数 (重点) :多条记录 返回一个结果 (重点)
单行函数:
日期
sysdate/current_date 以date类型返回当前的日期
add_months(d,x) 返回加上x月后的日期d的值
LAST_DAY(d) 返回的所在月份的最后一天
months_between(date1,date2) 返回date1和date2之间月的数目
next_day(sysdate,星期一) 下一个即将要到来的星期一的日期查看今年日日期 sysdate
select sysdate from dual; select current_date from dual;
日期可以进行 加减 ± sysdate+90
select sysdate+90 from dual;--注意2月天数不确定,三个月后日期于今天不同
月份的加减 ± 解决2月份的不确定天数
转正日期 add_months( hiredate(开始计算的日期),+3(需要增加的月数))
select add_months( hiredate,+3) 转正 from emp;
某个月最后一天 last_day( 时间)
select last_day(sysdate) from dual;
两个日期之间有多少月 months_between(date1,date2)
【注意:算法date1-date2=所得值 避免负数】
select months_between(sysdate,hiredate) 入职月份 from emp; select months_between(sysdate,hiredate)/12 入职年份 from emp;
即将要过得星期几 next_day(日期,‘星期几’ )
【注意:星期三,汉语三; 老外不承认周几 或者礼拜几】
select next_day(sysdate,'星期三') 下周三 from dual;
to_char to_date
to_char(日期对象,‘格式模板’) : 日期转为字符串
to_date(‘字符串’,‘格式模板’) : 字符串转为日期**
【字符串,模板样式 都需要单引号】
select to_date('1997-07-07 08:30:30','yyyy-mm-dd hh:mi:ss' ) 日期 from dual; /* 字符串的小时为24时 转化格式hh需要添加24 24小时制 以上无效的数字 日期转字符串 必须表格自己的日期 */ select to_char('1997-07-07 13:30:30','yyyy-mm-dd hh:mi:ss' ) 日期 from dual; select to_char(sysdate,'yyyy-mm-dd hh:mi:ss' ) 日期 from dual; --年 月 日 需要用双引号"原封不动"保留 24必须在hh后 select to_char(sysdate,'yyyy"年"-mm"月"-dd"日" hh24"时":mi"分":ss"秒"' ) 日期 from dual; select to_char(sysdate,'yyyy"年"mm"月"dd"日" hh24"时":mi"分":ss"秒"' ) 日期 from dual; select to_char(sysdate,'yyyymmdd hh24miss' ) 日期 from dual; --输出为19970707 133030 select to_char(sysdate,'yyyymmddhh24miss' ) 日期 from dual; --输出为19970707133030
判断函数
nvl( 值1,值2) 判定null : 当值1 为null的时候输出值2;
当值1 不是null的时候,直接输出值1 ,不考虑值2;
decode(可变的值,定值case1,case1的结果,定值case2,case2 的结果, 默认结果)
可变的值与case进行判断:是否相等 【注意不能做多值或区间判断】
case与case的结果为一对 当可变的值等于定值case1 则输出case1 的结果
当可变的值等于定值case2 则输出case2 的结果
**例:**将部门编号 改为汉字编号
select deptno,ename,empno,decode(deptno,10,'十',20,'二十',30,'三十','四十') 部门编号汉化 from emp;
decode= 【 case when then else end】 中间没有逗号,用空格分开
(case 可变的值
when当可变值为什么时 then 则输出什么
when当可变值为什么时 then 则输出什么
else什么都不是则输出这个值
end结束)
select deptno,(case deptno when 10 then '十' when 20 then '二十' when 30 then '三十' else '四十' end) 汉化 from emp;
例:
将部门编号汉化 并且 10部门的工资十倍 20部门的100倍 30部门的1000倍 其他部门不变
select ename, deptno, decode(deptno, 10, sal * 10, 20, sal * 100, 30, sal * 1000, sal * 1) 工资翻倍, (case deptno when 10 then '十' when 20 then '二十' when 30 then '三十' else '四十' end) 汉化 from emp;
多行函数
多行函数| 组合函数| 聚合函数
count(求个数) sum(求和) avg(求平均) max(求最大) min(求最小)
语法:select count( 字段名 ) from emp
ename
comm 【null不参与运算】
* 【代表一条数据的所有字段】
select count(deptno) from emp; select count(distinct deptno) from emp;
【注意:select 后面一旦出现组函数只能与其他组函数 或分组字段(group by ) 一起使用
三十’
else
‘四十’
end) 汉化
from emp;## 多行函数 多行函数| 组合函数| 聚合函数 **count(求个数) sum(求和) avg(求平均) max(求最大) min(求最小)** 语法:select count( 字段名 ) from emp ename comm 【null不参与运算】 * 【代表一条数据的所有字段】 ```sql select count(deptno) from emp; select count(distinct deptno) from emp;
【注意:select 后面一旦出现组函数只能与其他组函数 或分组字段(group by ) 一起使用
where 后面不能出现组函数】
-
sql语句where后条件执行顺序与优化
2020-11-27 21:36:57曾经面试时。被问到过这个问题。结合网上的知识,整理如下: 针对mysql,其条件执行顺序是 ...在用MySQL查询数据库的时候,连接了很多个过滤条件,发现非常慢。例如:SELECT … WHERE p.languages_id=1 AND t.type=1.曾经面试时。被问到过这个问题。结合网上的知识,整理如下:
针对mysql,其条件执行顺序是 从左往右,自上而下;
针对orcale,其条件执行顺序是从右往左,自下而上。
其中mysql:
where执行顺序是从左往右执行的,在数据量小的时候不用考虑,但数据量多的时候要考虑条件的先后顺序,此时应遵守一个原则:排除越多的条件放在第一个。
在用MySQL查询数据库的时候,连接了很多个过滤条件,发现非常慢。例如:SELECT … WHERE p.languages_id=1 AND t.type=1 AND p.products_id IN (472,474),这样查询需要20多秒,虽然在各个字段上都建立了索引。用分析Explain SQL一分析,发现在第一次分析过程中就返回了几万条数据:WHERE p.languages_id=1 ,然后再依次根据条件缩小范围。
然后稍微改变一下WHERE字段的位置之后,速度就有了明显地提高:WHERE p.products_id IN (472,474) AND p.languages_id=1 AND t.type=1,这样第一次的过滤条件是p.products_id IN (472,474),它返回的结果只有不到10条,接下来还要根据其它的条件来过滤,自然在速度上有了较大的提升。经过实践发现,不要以为WHERE中的字段顺序无所谓,可以随便放在哪,应该尽可能地第一次就过滤掉大部分无用的数据,只返回最小范围的数据。
-
sqlserver where子句中多个and的执行顺序问题
2019-03-29 09:33:47经测验,and子句没有明显的查询顺序要求,也就是说,只要and中包含了过滤条件,不管过滤条件在什么位置,执行都会成功。 下面的sql的执行结果是相同的。 SELECT AlarmLevel FROM AlarmCountConfig WHERE CONVERT(...在转换相关字段(如varchar转int)的时候,需要前面的and把特殊的不能转换的字符过滤掉,如‘–’,此时,需要依赖and的查询顺序。
经测验,and子句没有明显的查询顺序要求,也就是说,只要and中包含了过滤条件,不管过滤条件在什么位置,执行都会成功,多个and之间的执行地位是平级的。
下面的sql的执行结果是相同的。
SELECT AlarmLevel FROM AlarmCountConfig WHERE CONVERT(FLOAT,ALARMLEVEL)>0 AND AlarmLevel <> '' AND AlarmLevel <> '--'
SELECT AlarmLevel FROM AlarmCountConfig WHERE AlarmLevel <> '' AND AlarmLevel <> '--' AND CONVERT(FLOAT,ALARMLEVEL)>0
另外,当空字符串在数值转换的时候会被转换成0
带where子句查询单个字段的时候,NULL值会直接被过滤SELECT ALARMLEVEL FROM AlarmCountConfig WHERE AlarmLevel <> '--'
结果:
ALARMLEVEL 2 SELECT ALARMLEVEL FROM AlarmCountConfig
结果:
ALARMLEVEL 2 NULL NULL NULL NULL -
SQL 语句中 多表与 where 多条件 顺序与执行效率
2019-02-01 14:29:41FROM多表顺序与效率 ORACLE的解析器按照从右到左的顺序处理FROM子句中的表名, 因此FROM子句中写在最后的表(基础表 ...在FROM子句中包含多个表的情况下, 你必须选择记录条数最少的表作为基础表. 当ORAC... -
SQL 多条件查询
2017-04-16 17:57:47网上有不少人提出过类似的问题:“看到有人写了WHERE 1=1这样的SQL,到底是...界面中列出了四个查询条件,包括按工号查询、按姓名查询、按年龄查询以及按工资查询,每个查询条件前都有一个复选框,如果复选框被选中 -
MySQL:WHERE后跟多个条件
2016-12-13 11:32:35我这里将来解决如何在MySQL执行update,delete等需要查询的语句,最后限制where后跟多个条件的问题。比如,我现在在数据库当中有如下一张表。当我想要更新name为”louyujing”,type为1的string当中的内容,就可以... -
SQL查询过滤Where子句用法
2019-09-01 11:01:38大多数情况下,查询关注的是表中所有行的一个子集,需要用到Where过滤,本文主要介绍过滤的条件连接符(AND, OR, (),NOT),条件类型(相等条件、范围条件、成员条件、通配条件)以及当列名包含NULL值的注意事项。 -
SQL Where特殊的三个条件(between,in,like(字符串匹配,模糊查寻))
2016-01-14 16:16:55//between and 和前一个SQL语句结果一样,有没多大的意义 select * from dbo.MyClass where Age >10 and Age order by Age //两个结果完成一样 select * from MyClass where Age between 10 and ... -
sql where条件语句中同时包含and,or注意加括号
2018-03-17 22:15:33在测试程序的时候发现sql查询语句超过范围检查sql语句发现原语句:select xx from xx where a=b and c=d or e=f;预期的结果是满足a=b的同时c=d或者e=f,忘记加括号导致范围超限加括号后select xx from xx where a=b ... -
sql的where后面的多个条件case when判断执行
2013-03-29 12:54:38表的所有数据如下图: 下图and后面的1可以视为传入的参数,当它等于1、2、3时,where后面分别执行不同的三个条件,如下图: -
SQL中的where语句的用法及实例——条件查询
2022-04-30 10:06:33目录 1.where语法和用法 (1)语法:where 即where <查询条件> (2)用法:获取满足一定条件的目标数据。 ...1.where语法和用法 ...(1)语法:where <...说明:①多个条件则用“and”或 “or” 连接,交集即 -
SQL where里能够加的条件
2020-05-06 20:12:03where语句的三种类别。 比大小类 SELECT * FROM Students WHERE id > 5 这里可以用 >, <, >=, <=, !=等 区间类 SELECT * FROM Students WHERE id BETWEEN 5 AND 7 同理,也有id NOT BETWEEN 5 AND... -
sql: where条件中AND、OR运算符的组合使用
2017-06-21 11:14:55在WHERE子句中,通过AND、OR运算符可以同时连接多个条件,当然AND、OR运算符也可以同时使用。但是当AND、OR运算符同时存在时,其优先级如何确定呢?与大多数语言一样,SQL语言认为AND运算符的运算级别要高于OR运算符... -
SQL 排除指定多个条件的记录行
2020-09-18 15:29:22在最近的一次数据分析中,我通过一段对两个表的链接查询,返回我需要的数据。在使用过程中,我发现了其中包含了一些脏数据,需要通过一些方法清除它们。我定位了这些数据的特点,然后把他们加入到查询的条件中,希望... -
where条件里面多个值查询
2021-02-07 14:56:14where 后边跟同一条件多值查询用 “ in ()‘’ SELECT * FROM sys_dept WHERE id IN ( 1253175466772705281, 1352263455977005058 ) 不同条件用 and SELECT * FROM sys_dept WHERE id = ... -
SQL语句like怎么使用多个like条件...
2021-02-03 13:01:22展开全部可以参考以下的代码:select type from new_datas where type like '%科技%' or type like '%IT%'select type from new_datas where type like '%科技%IT%' or type like '%IT%科技%'扩展资料:SQL中的其他... -
sql:mysql:on和where区别,on后可跟多个条件
2019-08-16 17:11:41数据库在通过连接两张或多张表来返回记录时,都会生成一张中间的临时表,然后再将这张临时表返回给用户。 在使用left jion时,on和where条件的区别如下: 1、 on条件是在生成临时表时使用的条件,它不管on中的条件... -
一个变量存储多个值,作为where条件的 查询sql
2018-09-28 15:55:26你可能遇到过这种情况:select * from 表A where name in (****),在in语句里面你想用个变量,但是这个变量有时候有多个值,如 in(‘李 四’,‘张三’),这个时候你是绝对不能写成 DECLARE v1 ... -
sql语句 where 后条件执行先后顺序
2020-08-18 14:29:51结论如下: 针对mysql,其条件执行顺序是 从左往右,...在用MySQL查询数据库的时候,连接了很多个过滤条件,发现非常慢。例如:SELECT … WHERE p.languages_id=1 AND t.type=1 AND p.products_id IN (472,474) -
【转载】SQL where in语句中一次select多个属性值的方法
2019-08-17 01:18:51在oracle数据库中使用SQL语句查询时,遇到了需要使用where in语句一次选择多个多个属性值的情况,第一反应是: select a,b from table where (a,b) in (10000,30); 但程序报错,虽然可以使用子查询语句的方式... -
sql sever 查询条件 where in 多参数
2019-07-23 17:15:29select * from tb where charindex(s1 , ? ) 这样就可以传递多个变量进入条件语句 ? 为你传递的变量,sql sever 是单引号。 -
[iOS sql数据库] 根据多个条件delete数据
2017-08-04 09:51:14命令的关键是@"delete from mqttlist where uid = '%@' and indexCount = '0'"@"delete from 表名 where 字段A = '%@' and 字段B = '0' -
Oracle sql where后面的多条件case when判断执行
2019-10-03 10:53:21sql code: select * from table_...where (case when t.table_column='条件' then t.table_column when t.table_column='条件' then t.table_column end)='条件' my sql code: -- 测试sql SELECT *FROM PROJ... -
SQL where in语句一次select多个确定属性值的方法
2018-10-23 18:20:13在oracle数据库中使用SQL语句查询时,遇到了需要使用where in语句一次选择多个多个属性值的情况,第一反应是: select a,b from table where (a,b) in (10000,30); 但程序报错,虽然可以使用子查询语句的方式访问... -
一条sql语句查询多个条件的写法
2020-08-18 15:21:401.一条sql语句查询多个条件的写法 (1)sql语句的使用 SELECT p1.count1 AS todayAdd,p2.count2 AS todayReturns,p3.count3 AS sameMonthAdd,p4.count4 AS lastMonthAdd FROM (SELECT COUNT(create_time)count1 ... -
关于sql语句中where条件内添加case when的问题
2019-08-29 15:09:28背景:数据库用的Oracle; 报表用的是【FineReport】,之前没用过,被临时授命解决问题,所以大概了解了一下。里面应该是集成了excel插件,报表样式如下: ...前期因为某一些需求,有一家医院出现了两个不同的名... -
linq to sql where 多条件 or and
2016-10-19 08:51:05where = where.Or(p => p.カラム1 == 検索条件1); } if (!string.IsNullOrEmpty(検索条件2)) { where = where.Or(p => p.カラム2 == 検索条件2); } var result = list.Where(where.Compile()).... -
SQL语句之条件查询--WHERE(where)
2021-04-19 20:23:43二、按照逻辑表达式筛选(一般就是用于连接多个条件表达式) 逻辑运算符: && 、 || 、 ! 建议使用 and 、or 、not 三、模糊查询 like between and in is null 一、按条件表达式筛选 例: