1. 条件查询作用
通过简单查询,可以查询表中的所有数据行。但大多数情况下,我们只需要查询符合某些特定条件的数据行,这就需要用到SQL语言中的条件查询来过滤。
条件查询分为单条件查询和多条件查询。单条件查询就是按照一个条件进行查询,如查询部门编号为10号的员工信息就是单条件查询。多条件查询就是按照多个条件同时进行查询,如查询部门编号为10号且工资大于2000的员工信息,查询出来的员工既要满足部门编号为10的条件,也要满足工资大于2000的条件。下面首先看单条件查询。
2. 单条件查询
2.1 单条件查询
语法:
SELECT [ DISTINCT ] * | 列名 | 表达式 [别名] [,...]
FROM 表名
[ WHERE 条件表达式 ] ;
说明:
1、条件查询使用WHERE子句来完成,WHERE子句必须紧跟在FROM子句后面。
2、条件表达式的格式为:列名 比较运算符 要比较的值 ,如 deptno = 10 表示部门编号为10号。
3、比较运算符包括 = 、>、>=、 <、 <=、 <>,含义分别是等于、大于、大等于、小于、小等于、不等于。
4、数值型、字符型、日期型数据都可以使用比较运算符进行比较。
5、字符型和日期型数据做为查询条件时,条件表达式右边的值,必须加单引号。
下面通过几个例子,体会不同数据类型的列做为查询条件的写法。
1、数值型列做为查询条件:
例:查询部门编号为20的员工编号、姓名、所在部门编号。
SELECT empno, ename, deptno
FROM emp
WHERE deptno=20;
查询结果如下:
EMPNO | ENAME | DEPTNO |
7369 | SMITH | 20 |
7566 | JONES | 20 |
7788 | SCOTT | 20 |
7876 | ADAMS | 20 |
7902 | FORD | 20 |
2、字符型列做为查询条件:
例:查询职位为CLERK的员工编号、姓名、职位。
SELECT empno,ename,job
FROM emp
WHERE job='CLERK';
查询结果如下:
EMPNO | ENAME | JOB |
7369 | SMITH | CLERK |
7876 | ADAMS | CLERK |
7900 | JAMES | CLERK |
7934 | MILLER | CLERK |
3、日期型列做为查询条件:
例:查询入职日期在1985年1月1日之后的员工编号、姓名、入职日期。
SELECT empno,ename,hiredate
FROM emp
WHERE hiredate > '1985-01-01';
查询结果如下:
EMPNO | ENAME | HIREDATE |
7788 | SCOTT | 1987-04-19 |
7876 | ADAMS | 1987-05-23 |
2.2. 特殊比较运算符
接下来介绍4种常用的特殊比较运算符,分别是BETWEEN...AND...、IN、LIKE、IS NULL。
2.2.1 BETWEEN..AND..运算符
使用BETWEEN .. AND.. 可以查询出某列的值在某个范围内(包括边界值)的数据行。
语法:WHERE 列名 BETWEEN 值1 AND 值2;
例:查询工资在1000到1500之间的员工编号,姓名,工资。
SELECT empno,ename,sal
FROM emp
WHERE sal BETWEEN 1000 AND 1500;
通过结果可以看出,工资等于1000和1500的员工也被查出来了,所以BETWEEN..AND..是闭区间查询。
EMPNO | ENAME | SAL |
7521 | WARD | 1000 |
7654 | MARTIN | 1250 |
7844 | TURNER | 1500 |
7876 | ADAMS | 1100 |
7934 | MILLER | 1300 |
2.2.2 IN运算符
使用IN运算符可以查询出某列的值是否和给定集合内的任意一个值相等。
语法:WHERE 列名 IN (值1, 值2, ....值n)
例:使用IN运算符,查询出部门为10号或者20号的员工编号,姓名,部门编号。
SELECT empno, ename, deptno
FROM emp
WHERE deptno IN (10 , 20)
通过结果可以看出,部门编号为10或20的员工都被查出来了。
EMPNO | ENAME | DEPTNO |
7369 | SMITH | 20 |
7566 | JONES | 10 |
7788 | SCOTT | 20 |
7876 | ADAMS | 10 |
7902 | FORD | 20 |
2.2.3 LIKE运算符
使用LIKE运算符可以查询出某列的值是否满足关键字匹配,也叫模糊查询。如查询员工名字中含有字母S的员工,就可以使用LIKE运算符来解决。
先介绍两个通配符:
% : 百分号,代表匹配零个或任意个字符。
_ : 下划线,代表匹配1个任意字符。
例:查询员工姓名中以S开头的员工。
SELECT ename
FROM emp
WHERE ename LIKE 'S%';
结果如下:
ENAME |
SMITH |
SCOTT |
例:查询员工姓名中第二个字母是L的员工。
SELECT ename
FROM emp
WHERE ename LIKE '_L%';
结果如下:
ENAME |
ALLEN |
BLAKE |
CLARK |
2.2.4 IS NULL 运算符
如果要查询某列的值是否为NULL,使用 “列名 = NULL”是查询不出来的。只能使用 “列名 IS NULL”
例:查询上级为空的员工姓名、上级编号。
SELECT ename, mgr
FROM emp
WHERE mgr IS NULL;
结果如下:
ENAME | MGR |
KING |
注意:查询某列不为空,使用 “列名 IS NOT NULL”
3. 多条件查询
3.1 逻辑运算符
多条件查询是按照多个条件同时进行查询,查询出的结果集要同时满足多个条件。多个条件之间需要使用逻辑运算符进行连接。
语法:
SELECT [ DISTINCT ] * | 列名 | 表达式 [别名] [,...]
FROM 表名
[ WHERE 条件表达式1 逻辑运算符 条件表达式2 ] ;
说明:
逻辑运算符包含逻辑与 AND,逻辑或 OR,逻辑非 NOT。下表分别介绍3类逻辑运算符的含义。
运算符 | 含义 |
AND | 逻辑与,用来连接两个条件表达式。如果每个条件表达式的结果都为TRUE,整个表达式的结果才为TRUE。 |
OR | 逻辑或,用来连接两个条件表达式。只要有1个条件表达式的结果为TRUE,整个表达式的结果就为TRUE。 |
NOT | 逻辑非,用来对条件表达式取反。TRUE取反为FALSE,FALSE取反为TRUE。 |
例:查询工资大于1100且职位为‘CLERK’的员工编号、姓名、职位、工资。
分析:本题查询出的员工,需要同时满足两个条件,条件1:工资>1100,条件2:职位='CLERK',因此本题可以用逻辑与来解决,SQL语句为:
SELECT empno, ename, job, sal
FROM emp
WHERE sal>=1100
AND job='CLERK';
例:查询工资大于1100或职位为‘CLERK’的员工编号、姓名、职位、工资。
分析:本题查询出的员工,只需要满足‘工资>1100’ 或‘职位='CLERK' ’中的一个条件即可,因此本题可以用逻辑或来解决,SQL语句为:
SELECT empno, ename, job, sal
FROM emp
WHERE sal>=1100
OR job='CLERK';
例:查询职位不为CLERK的员工编号、姓名、职位、工资。
分析:本题查询出的员工,需要满足的条件“职位不是CLERK”。那如何用条件表达式表示职位不是CLERK呢? 我们可以先写出职位是CLERK的条件表达式 job = 'CLERK',然后加上逻辑非就可以,因此SQL语句为:
SELECT empno, ename, job, sal
FROM emp
WHERE NOT (job='CLERK');
当然,本题直接使用比较运算符解决更简单,如下:
SELECT empno, ename, job, sal
FROM emp
WHERE job <> 'CLERK';
NOT运算符还可以和BETWEEN…AND、IN、LIKE、IS NULL一起使用,表示的含义分别为:
NOT BETWEEN .. AND .. :不在某个区间
NOT IN (集合):不在某个集合内
NOT LIKE :不像.....
IS NOT NULL: 不是空
例:
1.查询工资不在3000到5000之间的员工姓名
SELECT ename
FROM emp
WHERE sal NOT BETWEEN 3000 AND 5000;
2.查询部门该编号不在10号或20号的员工姓名
SELECT ename
FROM emp
WHERE deptno NOT IN (10,20);
3.查询姓名不以字母D开头的员工姓名
SELECT ename
FROM emp
WHERE ename NOT LIKE 'D%';
4.查询没有津贴的员工姓名
SELECT ename
FROM emp
WHERE comm IS NOT NULL;
3.2 运算符的优先级
至此,我们已经学习了算术运算符、比较运算符、特殊比较运算符、逻辑运算符,如果在一个WHERE子句中,这几种运算符同时出现,那么各种预算符的优先级如何呢?
运行如下SQL语句,分析查询结果。
SELECT ename, job, sal
FROM emp
WHERE job='SALESMAN'
OR job='PRESIDENT'
AND sal>1500;
ENAME | JOB | SAL |
ALLEN | SALESMAN | 1600 |
WARD | SALESMAN | 1250 |
MARTIN | SALESMAN | 1250 |
KING | PRESIDENT | 5000 |
TURNER | SALESMAN | 1500 |
通过如上结果可以看出,该SQL语句,查询出:
职位是SALESMAN工资不限,或者职位是PRESIDENT同时工资大于1500的员工信息。
而我们实际想查询的可能是:
职位是SALESMAN工资高于1500,或者职位是PRESIDENT同时工资大于1500的员工信息
为什么会出现这种查询结果呢? 因为AND的优先级比OR高,上面WHERE子句的3个表达式,会优先完成AND条件表达式判断,然后再和第一个条件表达式做OR判断。
因此,如果想要查询出我们想要的结果,可以通过增加()来改变优先级,修改后的SQL如下:
SELECT ename, job, sal
FROM emp
WHERE ( job='SALESMAN'
OR job='PRESIDENT')
AND sal>1500;
该语句的查询结果如下。
ENAME | JOB | SAL |
KING | PRESIDENT | 5000 |
ALLEN | SALESMAN | 1600 |
各种运算符的优先级如下表。
优先级 | 运算分类 | 运算符举例 |
1 | 算术运算符 | *, \, +, - |
2 | 比较运算符 | =, <>, <, >, <=, >= |
3 | 特殊比较运算符 | BETWEEN..AND.. ,IN,LIKE,IS NULL |
4 | 逻辑非 | NOT |
5 | 逻辑与 | AND |
6 | 逻辑或 | OR |