目录
条件数据记录查询
在具体应用中,用户并不需要查询所有数据记录,而只需根据限制条件来查询一部分数据记录。这就需要用到条件数据记录查询。
它通过SQL语句SELECT来实现,同时通过关键字WHERE 对所查询到的数据记录进行过滤,其语法形式为:
SELECT field1,field2,…fieldn
FROM table_name
WHERE CONDITION;
本文所涉及到的表(t_employee)在【表单数据记录查询一】中可以找到
关于条件数据查询语句可以包含如下功能:
- 带关系运算符和逻辑运算符的条件数据查询
- 带 BETWEEN AND 关键字的范围查询
- 带 IS NULL 关键字的空值查询
- 带 IN 关键字的集合查询
- 带 LIKE 关键字的模糊查询
一、带关系运算符和逻辑运算符的条件数据查询
MySQL 支持的比较运算符
运算符 | 描述 |
---|---|
> | 大于 |
< | 小于 |
= | 等于 |
!=(<>) | 不等于 |
>= | 大于等于 |
<= | 大于等于 |
MySQL 支持的逻辑运算符
运算符 | 描述 |
---|---|
AND(&&) | 逻辑与 |
OR (||) | 逻辑或 |
XOR | 逻辑异或 |
NOT(!) | 逻辑非 |
1、单条件数据查询
来个实例先:
我们要查找从事 “店员” 工作的雇员的姓名及工作,需要查找条件 “job=CLERK”
mysql> #查询表数据#
mysql> SELECT ename,job
-> FROM t_employee
-> WHERE job='CLERK';
+--------+-------+
| ename | job |
+--------+-------+
| SMITH | CLERK |
| ADAMS | CLERK |
| JAMES | CLERK |
| MILLER | CLERK |
+--------+-------+
4 rows in set (0.00 sec)
2、多条件数据查询
有的时候所查询的数据需要符合多个条件,在 MySQL 的软件中通过逻辑运算符来进行多条件联合查询
【实例】
查询从事 “CLERK” 的工作,而且工资大于800的雇员姓名、工资、及工作内容。
mysql>#查询表数据#
mysql> SELECT ename,sal,job
-> FROM t_employee
-> WHERE job='CLERK'&&SAL>800;
+--------+---------+-------+
| ename | sal | job |
+--------+---------+-------+
| ADAMS | 1100.00 | CLERK |
| JAMES | 950.00 | CLERK |
| MILLER | 1300.00 | CLERK |
+--------+---------+-------+
3 rows in set, 1 warning (0.03 sec)
在上述的语句中,通过 “&&” 符号连接查询条件 “job=CLERK” 表达式和 “sal>800” 表达式
二、带 BETWEEN AND 关键字的范围查询
BETWEEN AND 用来实现判断字段的数值是否在指定范围内的条件查询。其语法形式如下:
SELECT field1,field2,…fieldn
FROM table_name
WHERE field BETWEEN value1 AND value2
在上述语句中,通过关键字 BETWEEN 和 AND 来设置字段 field 的取值范围,如果字段 field 的值在所指定的范围内,则满足查询条件,该记录就会被查询出来;否则不会被查询出来。
BETWEEN minvalue AND maxvalue ,表示的是一个范围间的判断过程,这些关键字操作符只针对数字类型。
- 注:BETWEEN 后面的数字必须要比 AND 后面小
1、符合范围的数据记录查询
【实例】
在雇员表(t_employee)中查询工资在 1000 到 2000 的雇员
mysql>#查询表数据#
mysql> SELECT ename,sal
-> FROM t_employee
-> WHERE sal BETWEEN 1000 AND 2000;
+--------+---------+
| ename | sal |
+--------+---------+
| ALLEN | 1600.00 |
| WARD | 1250.00 |
| MARTIN | 1250.00 |
| TURNER | 1500.00 |
| ADAMS | 1100.00 |
| MILLER | 1300.00 |
+--------+---------+
6 rows in set (0.01 sec)
2、不符合范围的数据记录查询
如果我们想查询不在某一范围内的数据就会用到 NOT 这个关键字
【实例】
查询雇员表(t_employee)中工资不在 1000 到2000 之间的雇员
mysql> SELECT ename,sal
-> FROM t_employee
-> WHERE sal NOT BETWEEN 1000 AND 2000;
+-------+---------+
| ename | sal |
+-------+---------+
| SMITH | 800.00 |
| JONES | 2975.00 |
| BLAKE | 2850.00 |
| CLARK | 2450.00 |
| SCOTT | 3000.00 |
| KING | 5000.00 |
| JAMES | 950.00 |
| FORD | 3000.00 |
+-------+---------+
8 rows in set (0.02 sec)
在上述语句中,通过关键字 NOT BETWEEN 和 AND 实现非范围的查找。
三、带 IS NULL 关键字的空值查询
IS NULL 关键字用来实现判断字段的数值是否为空的条件查询。具体语法形式为:
SELECT field1,field2,…fieldn
FROM talble_name
WHERE field IS NULL;
在具体实现该应用时,一定要注意空值与空字符串和0的区别。
1、空值数据记录查询
【实例】
在雇员表(t_employee)中查询所有不领奖金的雇员
mysql> SELECT ename,comm
-> FROM t_employee
-> WHERE comm IS NULL;
+--------+------+
| ename | comm |
+--------+------+
| SMITH | NULL |
| JONES | NULL |
| BLAKE | NULL |
| CLARK | NULL |
| SCOTT | NULL |
| KING | NULL |
| ADAMS | NULL |
| JAMES | NULL |
| FORD | NULL |
| MILLER | NULL |
+--------+------+
10 rows in set (0.00 sec)
上述语句中查询的是字段 comm 是空值的雇员明细
2、不是空值数据记录查询
通过非逻辑运算符设置非空值判断
NOT … IS NULL
下面用一个例子,实现如何查询不是空值的数据记录
【实例】
mysql> SELECT *
-> FROM t_employee
-> WHERE NOT comm IS NULL;
+-------+--------+----------+------+------------+---------+---------+--------+
| empno | ename | job | MGR | Hiredate | sal | comm | deptno |
+-------+--------+----------+------+------------+---------+---------+--------+
| 7499 | ALLEN | SALESMAN | 7698 | 1982-03-12 | 1600.00 | 300.00 | 30 |
| 7521 | WARD | SALESMAN | 7698 | 1983-03-12 | 1250.00 | 500.00 | 30 |
| 7654 | MARTIN | SALESMAN | 7698 | 1981-03-12 | 1250.00 | 1400.00 | 30 |
| 7844 | TURNER | SALESMAN | 7698 | 1989-03-12 | 1500.00 | 0.00 | 30 |
+-------+--------+----------+------+------------+---------+---------+--------+
4 rows in set (0.01 sec)
上述的语句查询的是领取奖金的雇员的信息,我们可以看出:雇员 TURNER ,他的奖金是0.00 元,因为我们查找的是 comm 字段不为空的条件,0.00 并不等于空值,因此也被查找出来。
四、带 IN 关键字的集合查询
关键字 IN 用来实现判断字段的数值是否在指定集合中的查询条件。其具体语法形式是:
SELECT field1,field2,…fieldn
FROM talble_name
WHERE field IN (value1,value2,value3…,valuen);
上述语句中,参数 valuen 表示集合中的值,通过关键字 IN 来判断字段 field 的值是否在集合(value1,value2,value3…,valuen)中如果字段 field 的值在集合中,则满足查询条件,该记录就会被查询出来,否则不会被查询出来。
1、在集合中数据记录查询
- 通过关键字 IN 设置集合查询条件
【实例】
查询雇员编号为7521、7782、7566 和 7788 的雇员
mysql> SELECT ename,empno
-> FROM t_employee
-> WHERE empno IN (7521,7782,7566,7788);
+-------+-------+
| ename | empno |
+-------+-------+
| WARD | 7521 |
| JONES | 7566 |
| CLARK | 7782 |
| SCOTT | 7788 |
+-------+-------+
4 rows in set (0.01 sec)
- 通过 “或逻辑运算” 连接各个等值表达式,设置查询条件
【实例】
前面的实例,也可以通过通过 “或逻辑运算” 连接各个等值表达式,以实现查询雇员编号为:7521、7782、7566 和 7788 的雇员,如下:
mysql> SELECT ename,empno
-> FROM t_employee
-> WHERE empno=7521 OR empno=7782 OR empno=7566 OR empno=7788;
+-------+-------+
| ename | empno |
+-------+-------+
| WARD | 7521 |
| JONES | 7566 |
| CLARK | 7782 |
| SCOTT | 7788 |
+-------+-------+
4 rows in set (0.00 sec)
在上述的语句中,通过 OR 逻辑运算符设置条件,同样能达到 关键字 IN 的查询效果。
2、不在集合中数据记录查询
- 通过关键字 NOT IN 设置查询条件
下面通过一个具体的实例来说明如何实现查询不是集合中的数据记录
【实例】
mysql> SELECT ename,empno
-> FROM t_employee
-> WHERE empno NOT IN (7521,7782,7566,7788);
+--------+-------+
| ename | empno |
+--------+-------+
| SMITH | 7369 |
| ALLEN | 7499 |
| MARTIN | 7654 |
| BLAKE | 7698 |
| KING | 7839 |
| TURNER | 7844 |
| ADAMS | 7876 |
| JAMES | 7900 |
| FORD | 7902 |
| MILLER | 7934 |
+--------+-------+
10 rows in set (0.01 sec)
上面的语句是通过关键字 NOT IN 来设定查询条件,查询不在集合中的数据。
- 通过 “非逻辑运算” 设置查询条件
【实例】
mysql> SELECT ename,empno
-> FROM t_employee
-> WHERE NOT empno IN (7521,7782,7566,7788);
+--------+-------+
| ename | empno |
+--------+-------+
| SMITH | 7369 |
| ALLEN | 7499 |
| MARTIN | 7654 |
| BLAKE | 7698 |
| KING | 7839 |
| TURNER | 7844 |
| ADAMS | 7876 |
| JAMES | 7900 |
| FORD | 7902 |
| MILLER | 7934 |
+--------+-------+
10 rows in set (0.01 sec)
上述的语句是通过非逻辑运算符设置的条件进行的查询。
- 注:“NOT IN” 是关键字
“NOT 字段 IN” 中的 NOT 是非逻辑运算符(取反),IN 为关键字
3、关于集合查询注意点
在具体使用关键字 IN 时,查询的集合中如果存在 NULL 则不会影响查询;如果使用关键字 NOT IN ,查询的集合中如果存在 NULL ,则不会有任何的查询结果。
【实例】
使用关键字 IN 并且查询集合中存在 NULL
mysql>#集合中不包含NULL#
mysql> SELECT ename,empno
-> FROM t_employee
-> WHERE empno in(7521,7782,7566,7788);
+-------+-------+
| ename | empno |
+-------+-------+
| WARD | 7521 |
| JONES | 7566 |
| CLARK | 7782 |
| SCOTT | 7788 |
+-------+-------+
4 rows in set (0.01 sec)
mysql>#集合中包含NULL#
mysql> SELECT ename,empno
-> FROM t_employee
-> WHERE empno in(7521,7782,7566,7788,NULL);
+-------+-------+
| ename | empno |
+-------+-------+
| WARD | 7521 |
| JONES | 7566 |
| CLARK | 7782 |
| SCOTT | 7788 |
+-------+-------+
4 rows in set (0.00 sec)
从上述的语句中,可以对比出,使用关键字 IN 时,集合中有或没有 NULL 都不会影响查询结果。
下面,我们看看使用关键字 NOT IN 时,查询集合中存在 NULL 的结果
mysql> SELECT ename,empno
-> FROM t_employee
-> WHERE empno NOT IN (7521,7782,7566,7788,NULL);
Empty set (0.00 sec)
结果显示:查询结果为空
下面我们再看看 NOT 作为逻辑运算符时的情况
mysql> SELECT ename,empno
-> FROM t_employee
-> WHERE NOT empno IN (7521,7782,7566,7788,NULL);
Empty set (0.00 sec)
结果显示:查询结果也是为空
为什么会出现这种情况,这是因为:当判断一个值是否为null的时候,MySQL 要用is null 或者is not null,而不是=null ,因此, 在MySQL中,Null值并不是一个值,而是一种状态,表示特定含义,其所表示的含义是“Unknow”,可以理解为未定义或者未知,因此 任何与Null值进行比对的操作符结果一定为Null。
- 在 IN (7521,7782,7566,7788,NULL ) 语句中表示只要有满足集合内的其中一个条件就筛选出来,也就是说集合内的条件是OR 的关系 在前面的例子中我们己经实验了。
- 而在 NOT IN (7521,7782,7566,7788,NULL) 或 NOT empno IN (7521,7782,7566,7788,NULL) 语句中表示需要排除集合内的所有条件,他们之间是AND 的关系,但是在与 NULL 进行比较时就出问题了,上面讲到 “任何与Null值进行比对的操作符结果一定为Null” 因此,最终的逻辑结果就为 NULL
五、带 LIKE 关键字的模糊查询
上面所介绍的条件数据查询中,WHERE 关键字后面的表达式都是针对已经知道数据值进行查询操作,但是这种查询操作并不适合任何情况。例如,查询雇员名字中包含文本 “cjgon” 的所有雇员,因此利用比较操作符(=)一定是不行的,这就需要通过通配符来实现模糊查询。
通配符: 主要用来实现代表部分值的特殊字符
通过关键字 LIKE 用来实现判断字段的值是否与指定的值相匹配。其语法形式:
SELECT field1,field2,…,fieldn
FROM table_name
WHERE field LIKE value;
在上述语句中,通过关键字 LIKE 来判断字段 field 的值是否与 value 字符串相匹配,如果相匹配,则满足查询条件,该记录就会被查询出来;否则不会被查询出来。
对于字符串在MySQL 软件中,必须加上单引号(’ ')或双引号(“ ”)。由于关键字LIKE 可以实现模糊查询,所以改关键字后面的字符串参数除了可以是一个完整的字符串外,还可以包含通配符。LIKE 关键字支持的通配符如下:
- “%” 通配符,该通配符值可以匹配任意长度的字符串,既可以是 0 个字符 ,1 个字符,也可以是很多个字符。
- “_” 统配符,该通配符值能匹配单个字符。
1、带有 “%” 通配符的模糊查询
【实例】查询雇员表(t_employee)中雇员名字中以字母A开头的全部雇员
mysql>#使用%通配符进行模糊查询#
mysql> SELECT ename
-> FROM t_employee
-> WHERE ename LIKE 'a%';
+-------+
| ename |
+-------+
| ALLEN |
| ADAMS |
+-------+
2 rows in set (0.02 sec)
从结果中可以看出查询到了以字母A开头的所有雇员。细心的你也许能够发现语句中我们写的是‘a%’ 而不是‘A%’ ,但是同样可以查询到所有以字母 A 开头的所有雇员,因此,MySQL 软件不仅对于关键字不区分大小写,对于字段数据记录也不区分大小写
【实例】如果想查询不是以字母 A 开头的全部雇员,可以执行逻辑非运算符(NOT 或 !),具体语句为:
mysql> SELECT ename
-> FROM t_employee
-> WHERE NOT ename LIKE 'A%';
+--------+
| ename |
+--------+
| SMITH |
| WARD |
| JONES |
| MARTIN |
| BLAKE |
| CLARK |
| SCOTT |
| KING |
| TURNER |
| JAMES |
| FORD |
| MILLER |
+--------+
12 rows in set (0.00 sec)
如果用 NOT LIKE 关键字可不可以呢
mysql> SELECT ename
-> FROM t_employee
-> WHERE ename NOT LIKE 'A%';
+--------+
| ename |
+--------+
| SMITH |
| WARD |
| JONES |
| MARTIN |
| BLAKE |
| CLARK |
| SCOTT |
| KING |
| TURNER |
| JAMES |
| FORD |
| MILLER |
+--------+
12 rows in set (0.00 sec)
从结果中显示,使用 NOT LIKE 关键字也是可以的。
2、带有 “_” 通配符的模糊查询
首先看一个实例
【实例】查询雇员名中第2个字母是 A 的全部雇员
mysql> SELECT ename
-> FROM t_employee
-> WHERE ename LIKE '_A%';
+--------+
| ename |
+--------+
| WARD |
| MARTIN |
| JAMES |
+--------+
3 rows in set (0.00 sec)
‘_’ 通配符只能代表一个字符,因此 ‘_A%’ 代表第二个字母为 A 的所有字符串
如果要显示名字中第二个字母不是 A 的全部雇员,则可用逻辑非运算(NOT 或 !),当然关键字 NOT LIKE 也行。
mysql> SELECT ename
-> FROM t_employee
-> WHERE ename NOT LIKE '_a%';
+--------+
| ename |
+--------+
| SMITH |
| ALLEN |
| JONES |
| BLAKE |
| CLARK |
| SCOTT |
| KING |
| TURNER |
| ADAMS |
| FORD |
| MILLER |
+--------+
11 rows in set (0.00 sec)
3、带有 LIKE 关键字的模糊查询注意点
LIKE 关键字除了可以操作字符串类型数据外,还可以操作其他任意的数据类型。
【实例】查询工自重带有数字 5 的全部雇员
mysql> SELECT ename,sal
-> FROM t_employee
-> WHERE sal LIKE '%5%';
+--------+---------+
| ename | sal |
+--------+---------+
| WARD | 1250.00 |
| JONES | 2975.00 |
| MARTIN | 1250.00 |
| BLAKE | 2850.00 |
| CLARK | 2450.00 |
| KING | 5000.00 |
| TURNER | 1500.00 |
| JAMES | 950.00 |
+--------+---------+
8 rows in set (0.01 sec)
从结果中看出来,数字中包含5的记录都被查询出来了。
通配符使用意义
表达式 | 意义 |
---|---|
_ | 通配符,该通配符值能匹配单个字符。 |
% | 通配符,该通配符值可以匹配任意长度的字符串,既可以是 0 个字符 ,1 个字符,也 可以是很多个字符。 |
A% | 以A或a打头的所有字符 |
_A% | 第二个字母包含A或a的所有字符 |
%A_ | 最后一个字母以A结尾的所有字符 |
%A% | 包含A或a的所有字符 |
%% | 所有字符 |
如有错误敬请高人指点,书写的易读性可否,希望大家多提意见。
上一篇 【单表数据记录查询一】
下一篇 【单表数据记录查询三】