Bootstrap

4. DQL-条件查询

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)

通过结果可以看出,部门编号为1020的员工都被查出来了。

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

悦读

道可道,非常道;名可名,非常名。 无名,天地之始,有名,万物之母。 故常无欲,以观其妙,常有欲,以观其徼。 此两者,同出而异名,同谓之玄,玄之又玄,众妙之门。

;