简单查询最大的问题在于可以显示一张数据表之中的所有数据,但是很多情况下并不需要所有的数据。很多时候往往都需要针对于一些数据执行过滤,而这样的查询就属于限定查询。限定查询的操作语法如下:
SELECT [DISTINCT] *|列 [别名],列 [别名],... à 3、控制要显示的数据列 FROM 表名称 [别名] à 1、确定查询的数据来源 [WHWRE 条件(s)] ; à2、根据判断条件选择参与的数据行 |
在使用WHERE子句操作的时候可以进行条件判断,而对于条件的判断主要可以使用如下的几种操作符:关系运算符(>、<、>=、<=、<>、!=)、范围运算符(BETWEEN...AND)、IN子句、LIKE子句、空判断(IS [NOT] NULL)。
而且在进行限定查询的时候可以使用以下的逻辑运算符:AND(与操作,所有的判断条件都满足)、OR(或操作,表示若干个判断条件只需要满足一个)、NOT(求反,TRUE变FALSE、FALSE变TRUE)。
关系运算是最简单的运算符,使用的符号有“>、<、>=、<=、=、<>、!=”。
范例:要求查询基本工资高于2000的雇员信息(sal为基本工资)
SELECT * FROM emp WHERE sal > 2000 ; |
范例:查询所有基本工资小于等于1600的全部雇员信息
SELECT * FROM emp WHERE sal<=1600 ; |
范例:查询姓名是Smith的雇员信息(ename为姓名)
SELECT * FROM emp WHERE ename = ‘smith’ ; |
SELECT * FROM emp WHERE ename = ‘SMITH’ ; |
在Oracle之中所有保存的数据都是区分大小写关系的,像一些系统发现密码是区分大小写的,这样的情况是非常适合于Oracle保存。
范例:查询所有职位不是销售人员的信息
·销售人员是职位的数据,职位的字段是job ,而现在的关系是取反,不是销售,使用<>(!=)
SELECT * FROM emp WHERE job <> ’SALESMAN’ ; |
SELECT * FROM emp WHERE job != ‘SALESMAN’ ; |
由开发者个人来决定使用何种不等于符号。
在WHERE子句之中是可以同时编写多个条件的,但是这多个条件之间就必须使用逻辑连接,主要使用两种符号:
·AND:条件 AND 条件 AND 条件 à 所有条件都要同时满足
·OR :条件 OR 条件 OR 条件 à 所有条件只要由一个满足即可
1、AND连接操作
范例:要求查询出所有销售人员并且工资高于1200的所有雇员
·条件1:职位是销售人员:job=’SALESMAN’ ;
·条件2:工资高于1200,sal>1200 ;
·这两个条件应该同时满足,所以使用AND连接 ;
SELECT * FROM emp WHERE sal>1200 AND job=’SALESMAN’ ; |
范例:查询出工资范围在1200~3000之间的数据(包含1200和3000)
·条件1:工资大于等于1200,sal>=1200
·条件2:工资小于等于3000,sal<=3000
·两个条件同时满足,使用AND连接
SELECT * FROM emp WHERE sal>=1200 AND sal<=3000 ; |
范例:查询出10部门的经理数据
·条件1:职位是经理,job=’MANAGER’ ;
·条件2:部门是10,deptno = 10 ;
SELECT * FROM emp WHERE job=’MANAGER’ AND deptno = 10 ; |
2、OR连接操作
范例:要求查询出工资高于3000,或者职位是办事员的全部雇员信息
·条件1:工资大于3000,sal>3000
·条件2:职位是办事员,job=’CLERK’ ;
·两个条件只需要满足一个,使用OR连接
SELECT * FROM emp WHERE sal>3000 OR job = ’CLERK’ ; |
3、NOT取反操作
正常情况下,如果说“1>0”返回的额判断结果是TRUE,如果加上了一个NOT,那么结果就变成了FALSE,等于是判读的记过进行了取反操作。
范例:观察取反——查询出所有职位不是办事员的信息
SELECT * FROM emp WHERE NOT sal=’CLERK’ ; |
如果决定NOT不好用,可以使用“<>”完成。
所有的逻辑运算可以在任何的WHERE运算之中使用,进行条件的连接。
如果说现在已经知道了某一个范围的两个数值:最大值和最小值,就可以采用如下操作;
字段 BETWEEN 最小值 AND 最大值 |
在进行计算过程之中也会包含了最大和最小两个值的判断。
范例:查询出所有工资范围在1200~3000之间的雇员信息(包含1200和3000)
这个时候是一个范围,所以面对范围就不需要使用复杂的AND连接了,直接利用BETWEEN...AND 就可以了。
SELECT * FROM emp WHERE sal BETWEEN 1200 AND 3000 ; |
但是通过之前的程序可以发现一个特点:所有的关系运算符是不分数据类型的。
范例:观察不分数据类型的判断
SELECT * FROM emp WHERE ename>’SMITH’ |
SELECT * FROM emp WHERE sal>1200 |
不管是字符串还是数字实际上都可以使用这些运算符进行判断,所以来讲BETWEEN…AND也可以:即所有判断符号都支持字符串、数字、日期类型的操作。
范例:查询所有在1981年雇佣的雇员信息
· 范围:’1981-01-01’(’01-1月-1981’) ~ ’1981-12-31’ (’31-12月-1981’)
SELECT * FROM emp WHERE hiredate BETWEEN ’01-1月-1981’ AND ’31-12月-1981’ |
SELECT * FROM emp WHERE hiredate BETWEEN '01-1月-1981' AND '31-12月-1981' ; |
所有符号都不分判断的数据类型。
select * from emp where ename between 'CLERK' and 'SMITH' ; |
NULL是一种特殊的数值,在标准的解释来讲,空表示的是一个不确定的内容。对于NULL的判断不能够使用传统的关系运算符。
范例:错误的操作
SELECT * FROM emp WHERE comm=NULL ; |
对于NULL而言,不能够直接进行验证,必须通过特定的符号完成:
· 为空:IS NULL ;
· 不为空:IS NOT NULL 、NOT IS NULL
范例:查询出所有不领取佣金的雇员信息(comm is null)
SELECT * FROM emp WHERE comm IS NULL ; |
范例:查询出所有领取佣金的雇员
SELECT * FROM emp WHERE comm IS NOT NULL ; |
SELECT * FROM emp WHERE NOT comm IS NULL ; |
提醒:在进行数字列的表示上,0和NULL是绝对不一样的两个概念。
在讲解此操作之前首先来思考一个查询。
范例:查询出雇员编号为7369、7566、7839、8899(不存在)的雇员——使用OR连接
SELECT * FROM emp WHERE empno=7369 OR empno=7566 OR ename=7839 OR ename=8899 ; |
但是发现此时的查询是一种基数查询,可以发现里面有固定的几个种子数据(7369、7566、7839、8899),那么面对这样的查询就可以使用IN操作符完成,语法如下:
· 在基数范围之中:字段 IN(数值,数值,...) ;
· 不在基数范围之中:字段 NOT IN(数值,数值,...) ;
范例:查询出雇员编号为7369、7566、7839、8899(不存在)的雇员——使用IN判断
SELECT * FROM emp WHERE empno IN(7369,7566,7839,8899) ; |
注意:关于IN操作的问题
· 对于IN操作而言是针对于基数的判断,如果说此时在使用NOT IN 的时候基数里面包含了NULL,那么所有满足的数据都不会被显示。
范例:观察程序,在IN之中使用NULL
SELECT * FROM emp WHERE empno IN(7369,7566,7839,NULL) ; |
范例:观察程序,在NOT IN之中使用NULL
SELECT * FROM emp WHERE empno NOT IN(7369,7566,7839,NULL) ; |
不满足的原因是数据库自身的保护机制,避免大数据所带来的问题。
LIKE子句可以实现数据库中的模糊数据查询,但是这种查询的方式只适合于小数据的情况,不适合于所谓的搜索引擎的搭建操作。因为搜索引擎上的检索是基于分词的操作原理实现的。
如果想要使用LIKE,那么可以使用如下的操作语法:
· 字段LIKE匹配关键字,而在进行关键字匹配的时候有两个符号标记;
|- “_”:匹配任意一个字符;
|- “%”:匹配0个、1个或多个任意字符;
范例:查询所有姓名以字符A开头的所有雇员
SELECT * FROM emp WHERE ename LIKE ’A%’ ; |
范例:查询所有姓名第二个字符以A开头的所有雇员
SELECT * FROM emp WHERE ename LIKE ’_A’ ; |
范例:查询所有位置上包含字符A的雇员信息
SELECT * FROM emp WHERE ename LIKE ’%A%’ ; |
范例:查询出所有姓名不带有‘R’雇员信息
SELECT * FROM emp where ename NOT LIKE ‘%R%’ ; |
说明:关于LIKE子句的说明:
·说明一:与之前的所有判断符号一样,在使用LIKE的时候可以针对于各种数据类型实现判断。
SELECT * FROM emp WHERE sal LIKE ‘%1%’ ; |
这种不受限制只是在于用户直接执行SQL的时候,而有一些实体层的框架上会自动的帮助用户增加若干验证。
·说明二:在使用LIKE操作的时候如果没有编写任何的查询关键字,则表示查询全部。
SELECT * FROM emp WHERE ename LIKE ’%%’ ; |
这一个特性可以帮助我们节约一些代码。