一、建表语句
CREATE TABLE "SCOTT"."TAB"
( "ID" VARCHAR2(32) NOT NULL ENABLE,
"NAME" VARCHAR2(10) DEFAULT NULL,
"SEX" CHAR(1) DEFAULT NULL,
"AGE" NUMBER(3,0) DEFAULT NULL,
PRIMARY KEY ("ID")
USING INDEX PCTFREE 10 INITRANS 2 MAXTRANS 255 NOCOMPRESS LOGGING
TABLESPACE "USERS" ENABLE
) SEGMENT CREATION DEFERRED
PCTFREE 10 PCTUSED 40 INITRANS 1 MAXTRANS 255 NOCOMPRESS LOGGING
TABLESPACE "USERS" ;
二、测试数据
INSERT INTO SCOTT.TAB (ID,NAME,SEX,AGE)VALUES('1', 'zs', '1', 18);
INSERT INTO SCOTT.TAB (ID,NAME,SEX,AGE)VALUES('2', 'zs', '1', 19);
INSERT INTO SCOTT.TAB (ID,NAME,SEX,AGE)VALUES('3', 'zs', '1', 20);
INSERT INTO SCOTT.TAB (ID,NAME,SEX,AGE)VALUES('4', 'zs', '1', 21);
INSERT INTO SCOTT.TAB (ID,NAME,SEX,AGE)VALUES('5', 'zs', '1', 22);
INSERT INTO SCOTT.TAB (ID,NAME,SEX,AGE)VALUES('6', 'ww', '1', 22);
三、测试
SELECT * FROM SCOTT.TAB t WHERE t.ID IN ('1','4','5') OR NAME LIKE 'zs%' AND age =20;
SELECT * FROM SCOTT.TAB t WHERE t.ID IN ('1','4','5') OR (NAME LIKE 'zs%' AND age =20);
分析:
如果按顺序执行,第一条 sql 执行完 or 之后,筛选出 id 为 1、2、3、4、5 的记录,再执行 and,最终结果是查出 id 为 3 的记录。实际执行结果犹如第二条 sql,先执行 and,筛选出 id 为 3 的记录,然后再执行 or,最终结果是查出 id 为 1、3、4、5 的记录。所以如果 sql 中 or/and 同时存在的情况下,在保证逻辑无误的前提下,建议加括号更便于理解。