where子查询
限定查询(WHERE子句)
之前的查询是将一张表的全部记录查询出来,那么现在如果希望可以根据指定的条件查询的话,则必须指定限定查询。
格式:
[SELECT] [{DISTINCT}] [* |具体的列别名FROM表名称] [{WHERE 条件(s)}]
例:查询出工资大5000的雇员的信息。
数学计算中,工资大于5000:sal > 5000
l SELECT * FROM emp WHERE sal > 4000 ;
输出如下:
例:查询每月可以得到奖金的雇员信息
奖金是comm字段,只要字段中存在内容,则表示内容不为空(null),如果存在内容,则会显示具体的值。
l 不为空的表示:字段 IS NOT NULL
l SELECT * FROM emp WHERE comm IS NOT NULL ;
输出如下:
例:查询没有奖金的雇员
没有奖金则comm字段的内容肯定是NULL,
l 肯定是空的表示:IS NULL
l SELECT * FROM emp WHERE comm IS NULL ;
输出如下:
例:要求查询出基本工资大于1500,同时可以领取奖金的雇员信息。
l 此时应该是两个条件,而且两个条件必须同时满足
l 既然要求两个条件全部满足,则必须使用AND操作符进行条件的连接。
l SELECT * FROM emp WHERE sal > 1500 AND comm IS NOT NULL ;
输出如下:
例:要求查询出基本工资大于1500,或者可以领取奖金的雇员信息。
l 如果要表现出或者的概念是由OR 进行连接,表示两个条件有一个满足就输出信息。
l SELECT * FROM emp WHERE sal > 3000 OR comm IS NOT NULL ;
输出如下:
之前使用NOT可以取反,把真的条件变为假,把假的变为真的。
例:要求查询出基本工资不大于1500或者不可以领取奖金的雇员信息。
l 此时相当于是对(基本工资大于1500并且可以领取奖金的雇员)整体的条件取反,我们可以用()来表示一组整体。
l SELECT * FROM emp WHERE NOT (sal > 1500 AND comm IS NOT NULL) ;
l 上面的取反后的意思就是基本工资小于等于1500或者不可以领取奖金的雇员信息。所以,也可以用下面的语句查询,输出都是一样的
l SELECT * FROM emp WHERE sal <= 1500 OR comm IS NULL ;
输出如下:(第一条语句)
输出如下:(第二条语句)
例:查询基本工资大于1500并且小于3000的全部雇员的信息。
l SELECT * FROM emp WHERE sal > 1500 AND sal < 3000 ;
输出如下:
在SQL语法中,提供了一个专门的指定范围的查询的过滤语句,BETWEEN … AND…
语句格式:字段 BETWEEN最小值 AND 最大值 ;
例:使用BETWEEN …AND …完成(基本工资大于等于1500并且小于等于3000)的查询。
l SELECT * FROM emp WHERE BETWEEN 1500 AND 3000 ;
输出如下:
实际上BETWEEN … AND … 操作等价:sal >= 1500 AND sal <= 3000 ;包含了等于的功能。
例:要求查询出在1981年雇佣的全部雇员信息。
l 从1981年1月1日 ~ 1981年12月31日之间的雇员
l 日期加入的时候要加入“‘“。
l SELECT * FROM emp WHERE hiredate BETWEEN ‘1-1月 -81’ AND ’31-12月 -81’ ;
输出如下:
结论:BETWEEN … AND … 查询除了可以支持数字之外,也可以支持日期的查询
l 随着深入的学习会发现,日期实际上也是以数字的形式表示出来的。
例:查询出姓名是SMITH的雇员信息。
l 此时告诉了要查询的姓名,条件:ename = ‘smith’ ;
l SELECT * FROM emp WHERE ename = ‘smith’ ;
输出如下:
执行以上的查询语句之后,并不会返回查询结果,再次查询数据库表的信息,发现smith是采用大写的形式表示出来的,在ORACLE中是对大小写敏感的,所以在查询的时候必须以大写的形式进行条件的编写,语句修改如下:
l SELECT * FROM emp WHERE ename = ‘SMITH’ ;
输出如下:
例:要求查询出雇员编号是7369、7499、7521的雇员的具体信息。
l 如果此时按照之前的做法,则设置条件要使用OR连接
l SELECT * FROM emp WHERE empno = 7369 OR empno = 7499 OR empno = 7521;
输出如下:
我们发现这样也是可以的,但是,如果让我们查询几十条呢?实际上,此时是指定了查询的范围,既然有范围了,那么,在SQL语句中就可以使用IN操作符完成。
l 语法格式:
字段 IN (值1,值2, ………, 值n) ;
l 如果现在要求查询的内容不在此范围之中,则可以使用NOT IN,语法如下
字段 NOT IN (值1,值2, ………, 值n) ;
例:使用以上的格式完成(雇员编号是7369、7499、7521)的雇员信息查询
l SELECT * FROM emp WHERE empno IN (7369, 7499, 7521) ;
输出如下:
例:要求查询出雇员编号不是7369、7499、7521的雇员的具体信息。
l SELECT * FROM emp WHERE empno NOT IN (7369, 7499, 7521) ;
输出如下:
另外,需要说明的是,使用IN操作符不光可以用在数字上,也可以用在字符串的信息上。
例:要求查询出雇员姓名是SMITH、ALLEN、KING的雇员的信息。
l SELECT * FROM emp WHERE ename IN (‘SMITH’, ‘ALLEN’, ‘KING’) ;
输出如下:
提示:如果在指定的查询范围中指了额外的内容,则不影响程序的运行。
例:要求查询出雇员姓名是SMITH、ALLEN、KING、jdkjdk$#的雇员的信息。
l SELECT * FROM emp WHERE ename IN (‘SMITH’, ‘ALLEN’, ‘KING’, ‘jdkjdk$#’);
输出如下:
在一般的日常见到的站点中经常发现有模糊查找功能,即:输入一个指定的关键字,把符合的内容全部查询出来,在SQL中使用LIKE语句完成。
在使用LIKE语句的时候要注意通配符的使用,在LIKE语句中主要使用以下两种通配符
l “%”:可以匹配任意长度的内容;
l “_”:可以匹配一个长度的内容;
例:查询出所有雇员姓名中第二个字母是“M”的雇员信息。
l SELECT * FROM emp WHERE ename LIKE ‘_M%’ ;
输出如下:
例:要求查询雇员姓名中包含字母M的雇员信息。
l 此时,表示可以任意的位置上出现字母M
l SELECT * FORM emp WHERE ename LIKE ‘%M%’ ;
输出如下:
但是,要提醒大家的是:“如果在使用LIKE的时候没有指定查询的关键字,则表示查询全部“。
使用LIKE 还可以方便的进行日期的查找功能。
例:要求查询出在1981年雇佣的雇员信息。
l SELECT * FROM emp WHERE hiredate LIKE ‘%81%’ ;
输出如下:
在操作条件中还可以使用:>、>=、=、<=等计算符。
不等于符号:在SQL中如果要想使用不等于符号,可以有两种形式:“<>”、“!=”
例:要求查询编号不为7369的雇员的信息
l 使用“<>”完成
l SELECT * FROM emp WHERE empno <> 7369 ;
输出如下:
l 使用“!=”完成
l SELECT * FROM emp WHERE empno != 7369 ;
输出如下: