4. DQL-条件查询

本单元在主要讲解如何使用SQL语言来查询指定条件的数据行。

1. 条件查询作用

        在上一小节中我们知道,在进行简单查询时,可以查询表中所有数据行。但在大部分情况下,我们只需要查询某些特定条件的数据行,这就需要我们本章要学习的SQL语句中的条件查询来过滤。

       条件查询分为但条件查询和多条件查询。单条件查询就是按照一个条件进行查询,比如查询部门编号为01号的员工信息就是单表条件查询。多表条件查询就是按照多个条件同时进行查询,如查询部门编号为01并且工资大于5000的员工的信息。

      下面首先介绍单条件查询。

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. 特殊比较运算符

       然后我们介绍四种常用的特殊比较运算符,分别是 between...and...、in、like、is null。

2.2.1 BETWEEN..AND..运算符

       使用between...and..可以查询出某列的值在某个范围(包括边界值)的数据行。

       语法:where 列名 between 值1 and 值2;

       例:查询工资在100到150之间的员工编号,姓名,工资。

select empno,ename,sal 
from emp 
where sal between 100 and 150;
2.2.2 IN运算符

      使用in运算符可以查询出某列的值是否和给定集合内的任意一个值相等。

      语法:where 列名 in (值1,值2,....值n) //小括号中的内容是一个集合而不是范围。

      

例:使用in运算符,查询出部门为10号或者20号的员工编号,姓名,部门编号。

select empno, ename, deptno 
from emp 
where deptno in (10 , 20)
2.2.4 LIKE运算符

       使用like运算符可以查询出某列的值是否满足关键字匹配,也叫模糊查询。

       首先介绍两个通配符:

              %:百分号,代表匹配零个或者任意个字符。

              _:下划线,代表匹配1个任意字符。

       例:查询员工姓名中以S开头的员工。

select ename 
from emp 
where ename like 'S%';

       例:查询员工姓名中第二个字母是L的员工。

select ename 
from emp 
where ename like '_L%';
2.2.4 IS NULL 运算符

     如果要查询某列的值是否为null,使用“列名=null”是查询不出来的。只能使用“列名 is null”

     例:查询上级为空的员工姓名、上级编号。

select ename, mgr 
from emp 
where mgr is 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;

       通过如上结果可以看出,该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;

       各种运算符的优先级如下表。

优先级

运算分类

运算符举例

1

算术运算符

*, \, +, -

2

比较运算符

=, <>, <, >, <=, >=

3

特殊比较运算符

BETWEEN..AND.. ,IN,LIKE,IS NULL

4

逻辑非

NOT

5

逻辑与

AND

6

逻辑或

OR

  • 15
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

记乐

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值