MySQL 第四章 条件查询

四、条件查询

4.1 什么是条件查询

不是将表中所有数据都查出来,只是查询符合条件的

语法格式:

select 字段1, 字段2, 字段3...
from 表名
where 条件;

4.2 = 操作符

查询薪资等于800的编号和员工姓名:

mysql> select empno, ename from emp where sal = 800;
+-------+-------+
| empno | ename |
+-------+-------+
|  7369 | SMITH |
+-------+-------+
1 row in set (0.00 sec)
# 对比 “附件” 查看

查询SMITH的编号和薪资:

mysql> select empno, sal from emp where ename = 'SMITH';	# 字符串使用单引号
+-------+--------+
| empno | sal    |
+-------+--------+
|  7369 | 800.00 |
+-------+--------+
1 row in set (0.00 sec)
# 对比 “附件” 查看

4.3 < > 或 !=操作符

< 小于

查询薪资小于2000的员工姓名和编号:

mysql> select empno, ename, sal from emp where sal < 2000;
+-------+--------+---------+
| empno | ename  | sal     |
+-------+--------+---------+
|  7369 | SMITH  |  800.00 |
|  7499 | ALLEN  | 1600.00 |
|  7521 | WARD   | 1250.00 |
|  7654 | MARTIN | 1250.00 |
|  7844 | TURNER | 1500.00 |
|  7876 | ADAMS  | 1100.00 |
|  7900 | JAMES  |  950.00 |
|  7934 | MILLER | 1300.00 |
+-------+--------+---------+
8 rows in set (0.00 sec)

<= 小于等于

查询薪资小于等于3000的员工姓名和编号

mysql> select ename, empno, sal from emp where sal <= 3000;
+--------+-------+---------+
| ename  | empno | sal     |
+--------+-------+---------+
| SMITH  |  7369 |  800.00 |
| ALLEN  |  7499 | 1600.00 |
| WARD   |  7521 | 1250.00 |
| JONES  |  7566 | 2975.00 |
| MARTIN |  7654 | 1250.00 |
| BLAKE  |  7698 | 2850.00 |
| CLARK  |  7782 | 2450.00 |
| SCOTT  |  7788 | 3000.00 |
| TURNER |  7844 | 1500.00 |
| ADAMS  |  7876 | 1100.00 |
| JAMES  |  7900 |  950.00 |
| FORD   |  7902 | 3000.00 |
| MILLER |  7934 | 1300.00 |
+--------+-------+---------+
13 rows in set (0.00 sec)

> 大于

查询薪资大于3000的员工姓名和编号

mysql> select ename, empno, sal from emp where sal > 3000;
+-------+-------+---------+
| ename | empno | sal     |
+-------+-------+---------+
| KING  |  7839 | 5000.00 |
+-------+-------+---------+
1 row in set (0.00 sec)

>= 大于等于

查询薪资大于等于3000的编号和员工姓名

mysql> select empno, ename, sal from emp where sal >= 3000;
+-------+-------+---------+
| empno | ename | sal     |
+-------+-------+---------+
|  7788 | SCOTT | 3000.00 |
|  7839 | KING  | 5000.00 |
|  7902 | FORD  | 3000.00 |
+-------+-------+---------+
3 rows in set (0.00 sec)

4.4 between … and … 操作符

betweenand. 两个值之间, 等同于 >= and <=

查询薪资在2450和3000之间的员工信息?包括2450和3000:

# 法1,>= and <=
mysql> select empno, ename, sal from emp where sal >= 2450 and sal <= 3000;
+-------+-------+---------+
| empno | ename | sal     |
+-------+-------+---------+
|  7566 | JONES | 2975.00 |
|  7698 | BLAKE | 2850.00 |
|  7782 | CLARK | 2450.00 |
|  7788 | SCOTT | 3000.00 |
|  7902 | FORD  | 3000.00 |
+-------+-------+---------+
5 rows in set (0.00 sec)

# 法2,between … and …
mysql> select empno, ename, sal from emp where sal between 2450 and 3000;
+-------+-------+---------+
| empno | ename | sal     |
+-------+-------+---------+
|  7566 | JONES | 2975.00 |
|  7698 | BLAKE | 2850.00 |
|  7782 | CLARK | 2450.00 |
|  7788 | SCOTT | 3000.00 |
|  7902 | FORD  | 3000.00 |
+-------+-------+---------+
5 rows in set (0.00 sec)

4.5 is null / is not null 操作符

查询哪些员工的津贴/补助为null:

mysql> select empno, ename, sal, comm from emp where comm is null;	# 注意是 xxx is null,而不是 xxx = null
+-------+--------+---------+------+
| empno | ename  | sal     | comm |
+-------+--------+---------+------+
|  7369 | SMITH  |  800.00 | NULL |
|  7566 | JONES  | 2975.00 | NULL |
|  7698 | BLAKE  | 2850.00 | NULL |
|  7782 | CLARK  | 2450.00 | NULL |
|  7788 | SCOTT  | 3000.00 | NULL |
|  7839 | KING   | 5000.00 | NULL |
|  7876 | ADAMS  | 1100.00 | NULL |
|  7900 | JAMES  |  950.00 | NULL |
|  7902 | FORD   | 3000.00 | NULL |
|  7934 | MILLER | 1300.00 | NULL |
+-------+--------+---------+------+
10 rows in set (0.00 sec)

在数据库中null代表什么也没有,他不是一个值,所以不能使用等号来衡量。

查询哪些员工的津贴/补助不为null:

mysql> select empno, ename, sal, comm from emp where comm is not null;
+-------+--------+---------+---------+
| empno | ename  | sal     | comm    |
+-------+--------+---------+---------+
|  7499 | ALLEN  | 1600.00 |  300.00 |
|  7521 | WARD   | 1250.00 |  500.00 |
|  7654 | MARTIN | 1250.00 | 1400.00 |
|  7844 | TURNER | 1500.00 |    0.00 |
+-------+--------+---------+---------+
4 rows in set (0.00 sec)

4.6 and 操作符

查询工作岗位是MANAGER并且工资大于2500的员工信息:

mysql> select empno, ename, job, sal from emp where job = 'MANAGER' and sal > 2500;
+-------+-------+---------+---------+
| empno | ename | job     | sal     |
+-------+-------+---------+---------+
|  7566 | JONES | MANAGER | 2975.00 |
|  7698 | BLAKE | MANAGER | 2850.00 |
+-------+-------+---------+---------+
2 rows in set (0.00 sec)

4.7 or 操作符(and、or同时出现?)

查询工作岗位是MANAGER和SALESMAN的员工?

# 法1
mysql> select empno,ename,job from emp where job = 'MANAGER';
mysql> select empno,ename,job from emp where job = 'SALESMAN';

# 法2
mysql> select empno, ename, job from emp where job = 'MANAGER' or job = 'SALESMAN';
+-------+--------+----------+
| empno | ename  | job      |
+-------+--------+----------+
|  7499 | ALLEN  | SALESMAN |
|  7521 | WARD   | SALESMAN |
|  7566 | JONES  | MANAGER  |
|  7654 | MARTIN | SALESMAN |
|  7698 | BLAKE  | MANAGER  |
|  7782 | CLARK  | MANAGER  |
|  7844 | TURNER | SALESMAN |
+-------+--------+----------+
7 rows in set (0.00 sec)

and和or同时出现的话,有优先级问题吗?

查询工资大于2500,并且部门编号为10或20部门的员工?

mysql> select *
    -> from emp
    -> where sal > 2500 and deptno = 10 or deptno = 20;
+-------+-------+-----------+------+------------+---------+------+--------+
| EMPNO | ENAME | JOB       | MGR  | HIREDATE   | SAL     | COMM | DEPTNO |
+-------+-------+-----------+------+------------+---------+------+--------+
|  7369 | SMITH | CLERK     | 7902 | 1980-12-17 |  800.00 | NULL |     20 |
|  7566 | JONES | MANAGER   | 7839 | 1981-04-02 | 2975.00 | NULL |     20 |
|  7788 | SCOTT | ANALYST   | 7566 | 1987-04-19 | 3000.00 | NULL |     20 |
|  7839 | KING  | PRESIDENT | NULL | 1981-11-17 | 5000.00 | NULL |     10 |
|  7876 | ADAMS | CLERK     | 7788 | 1987-05-23 | 1100.00 | NULL |     20 |
|  7902 | FORD  | ANALYST   | 7566 | 1981-12-03 | 3000.00 | NULL |     20 |
+-------+-------+-----------+------+------------+---------+------+--------+
6 rows in set (0.00 sec)
# 分析上面的语句可以看到and的优先级高于or:
# 先筛选出了工资大于2500并且部门编号为10的员工,然后 or 了部门编号为20的员工。--->最后出现了工资小于2500的情况

# 
mysql> select * from emp where sal > 2500 and (deptno = 10 or deptno = 20);
+-------+-------+-----------+------+------------+---------+------+--------+
| EMPNO | ENAME | JOB       | MGR  | HIREDATE   | SAL     | COMM | DEPTNO |
+-------+-------+-----------+------+------------+---------+------+--------+
|  7566 | JONES | MANAGER   | 7839 | 1981-04-02 | 2975.00 | NULL |     20 |
|  7788 | SCOTT | ANALYST   | 7566 | 1987-04-19 | 3000.00 | NULL |     20 |
|  7839 | KING  | PRESIDENT | NULL | 1981-11-17 | 5000.00 | NULL |     10 |
|  7902 | FORD  | ANALYST   | 7566 | 1981-12-03 | 3000.00 | NULL |     20 |
+-------+-------+-----------+------+------------+---------+------+--------+
4 rows in set (0.00 sec)

分析上面的语句:

  • and优先级高于or
  • and和or同时出现,and优先级较高。如果想让or先执行,需要加“小括号”
  • 以后在开发中,如果不确定优先级,就加小括号就行了
select * from table where  条件1 AND 条件2 OR 条件3
<==>
select * from table where  ( 条件1 AND 条件2 )  OR 条件3

select * from table where  条件1 AND  条件2 OR 条件3 AND 条件4
<==>
select * from table where (  条件1 AND  条件2  ) OR (  条件3 AND 条件4  ) 

4.8 in 操作符

in 包含,相当于多个 ornot in 不在这个范围中)
注意,in不是一个区间。in后面跟的是具体的值。

查询工作岗位是MANAGER和SALESMAN的员工:

# 法1
mysql> select empno, ename, job from emp where job = 'MANAGER' or job = 'SALESMAN';
+-------+--------+----------+
| empno | ename  | job      |
+-------+--------+----------+
|  7499 | ALLEN  | SALESMAN |
|  7521 | WARD   | SALESMAN |
|  7566 | JONES  | MANAGER  |
|  7654 | MARTIN | SALESMAN |
|  7698 | BLAKE  | MANAGER  |
|  7782 | CLARK  | MANAGER  |
|  7844 | TURNER | SALESMAN |
+-------+--------+----------+
7 rows in set (0.00 sec)

# 法2
mysql> select empno, ename, job from emp where job in('MANAGER', 'SALESMAN');	
+-------+--------+----------+
| empno | ename  | job      |
+-------+--------+----------+
|  7499 | ALLEN  | SALESMAN |
|  7521 | WARD   | SALESMAN |
|  7566 | JONES  | MANAGER  |
|  7654 | MARTIN | SALESMAN |
|  7698 | BLAKE  | MANAGER  |
|  7782 | CLARK  | MANAGER  |
|  7844 | TURNER | SALESMAN |
+-------+--------+----------+
7 rows in set (0.00 sec)

4.9 not 操作符

not可以取非,主要用在is或者inis null
is not null
in
not in

4.10 like 操作符

称为模糊查询,支持 % 或者下划线匹配(%,_ 都是特殊符号)
%:匹配任意多个字符
_:任意一个字符

找出名字中含有O的:

mysql> select ename from emp where ename like '%O%';
+-------+
| ename |
+-------+
| JONES |
| SCOTT |
| FORD  |
+-------+
3 rows in set (0.00 sec)

找出名字以T结尾的?

mysql> select ename from emp where ename like '%T';
+-------+
| ename |
+-------+
| SCOTT |
+-------+
1 row in set (0.00 sec)

找出名字以K开始的?

mysql> select ename from emp where ename like 'K%';
+-------+
| ename |
+-------+
| KING  |
+-------+
1 row in set (0.00 sec)

找出第二个字每是A的?

mysql> select ename from emp where ename like '_A%';
+--------+
| ename  |
+--------+
| WARD   |
| MARTIN |
| JAMES  |
+--------+
3 rows in set (0.00 sec)

特别的,如果是找出名字中含有 “_”的,需要用到转义字符:

mysql> ... ... like '%\_%' 	# \为转义字符

查找一下名字中是否含有 “_”

mysql> select ename from emp where ename like '%\_%';
Empty set (0.00 sec)

附件 - 对照:

mysql> show tables;
+-----------------------+
| Tables_in_bjpowernode |
+-----------------------+
| dept                  |
| emp                   |
| salgrade              |
+-----------------------+
3 rows in set (0.00 sec)

mysql> select * from dept;
+--------+------------+----------+
| DEPTNO | DNAME      | LOC      |
+--------+------------+----------+
|     10 | ACCOUNTING | NEW YORK |
|     20 | RESEARCH   | DALLAS   |
|     30 | SALES      | CHICAGO  |
|     40 | OPERATIONS | BOSTON   |
+--------+------------+----------+
4 rows in set (0.00 sec)

mysql> select * from emp;
+-------+--------+-----------+------+------------+---------+---------+--------+
| EMPNO | ENAME  | JOB       | MGR  | HIREDATE   | SAL     | COMM    | DEPTNO |
+-------+--------+-----------+------+------------+---------+---------+--------+
|  7369 | SMITH  | CLERK     | 7902 | 1980-12-17 |  800.00 |    NULL |     20 |
|  7499 | ALLEN  | SALESMAN  | 7698 | 1981-02-20 | 1600.00 |  300.00 |     30 |
|  7521 | WARD   | SALESMAN  | 7698 | 1981-02-22 | 1250.00 |  500.00 |     30 |
|  7566 | JONES  | MANAGER   | 7839 | 1981-04-02 | 2975.00 |    NULL |     20 |
|  7654 | MARTIN | SALESMAN  | 7698 | 1981-09-28 | 1250.00 | 1400.00 |     30 |
|  7698 | BLAKE  | MANAGER   | 7839 | 1981-05-01 | 2850.00 |    NULL |     30 |
|  7782 | CLARK  | MANAGER   | 7839 | 1981-06-09 | 2450.00 |    NULL |     10 |
|  7788 | SCOTT  | ANALYST   | 7566 | 1987-04-19 | 3000.00 |    NULL |     20 |
|  7839 | KING   | PRESIDENT | NULL | 1981-11-17 | 5000.00 |    NULL |     10 |
|  7844 | TURNER | SALESMAN  | 7698 | 1981-09-08 | 1500.00 |    0.00 |     30 |
|  7876 | ADAMS  | CLERK     | 7788 | 1987-05-23 | 1100.00 |    NULL |     20 |
|  7900 | JAMES  | CLERK     | 7698 | 1981-12-03 |  950.00 |    NULL |     30 |
|  7902 | FORD   | ANALYST   | 7566 | 1981-12-03 | 3000.00 |    NULL |     20 |
|  7934 | MILLER | CLERK     | 7782 | 1982-01-23 | 1300.00 |    NULL |     10 |
+-------+--------+-----------+------+------------+---------+---------+--------+
14 rows in set (0.00 sec)

mysql> select * from salgrade;
+-------+-------+-------+
| GRADE | LOSAL | HISAL |
+-------+-------+-------+
|     1 |   700 |  1200 |
|     2 |  1201 |  1400 |
|     3 |  1401 |  2000 |
|     4 |  2001 |  3000 |
|     5 |  3001 |  9999 |
+-------+-------+-------+
5 rows in set (0.00 sec)

猜你喜欢

转载自blog.csdn.net/qq_45893475/article/details/121302182