MySQL学习-MySQL条件查询

操作的表

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

其每个字段的字段名分别为员工编号、员工姓名、员工职位、员工上级领导编号、员工雇佣日期,员工薪水、员工津贴、员工部门编号。

1.条件查询概述

语法格式:
  select
     字段,字段…
  from
      表名
  where
      条件;
执行顺序:先from,然后where,最后select

查询工资等于5000的员工姓名?
  select ename,sal from emp where sal=5000;

+-------+---------+
| ename | sal     |
+-------+---------+
| KING  | 5000.00 |
+-------+---------+

查询SMITH的工资?
  select sal from emp where ename = ‘SMITH’; // 字符串使用单引号括起来。

+--------+
| sal    |
+--------+
| 800.00 |
+--------+

找出工资高于3000的员工?
   select ename,sal from emp where sal > 3000;

+-------+---------+
| ename | sal     |
+-------+---------+
| KING  | 5000.00 |
+-------+---------+

select ename,sal from emp where sal >= 3000;
select ename,sal from emp where sal < 3000;
select ename,sal from emp where sal <= 3000;

找出工资不等于3000的?
   select ename,sal from emp where sal!=3000;
   select ename,sal from emp where sal <> 3000;

+--------+---------+
| ename  | sal     |
+--------+---------+
| SMITH  |  800.00 |
| ALLEN  | 1600.00 |
| WARD   | 1250.00 |
| JONES  | 2975.00 |
| MARTIN | 1250.00 |
| BLAKE  | 2850.00 |
| CLARK  | 2450.00 |
| KING   | 5000.00 |
| TURNER | 1500.00 |
| ADAMS  | 1100.00 |
| JAMES  |  950.00 |
| MILLER | 1300.00 |
+--------+---------+

找出工资在1100和3000之间的员工,包括1100和3000?
   select ename,sal from emp where sal <= 3000 and sal>=1100;
   select ename,sal from emp where sal between 1100 and 3000; // between…and…是闭区间 [1100 ~ 3000]
   select ename,sal from emp where sal between 3000 and 1100; // 查询不到任何数据
   between and在使用的时候必须左小右大。

2.条件查询between and]

操作的表的各个字段,具体值见第一节

EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO

其每个字段的字段名分别为员工编号、员工姓名、员工职位、员工上级领导编号、员工雇佣日期,员工薪水、员工津贴、员工部门编号。

between and在使用的时候必须左小右大。
between and除了可以使用在数字方面之外,还可以使用在字符串方面。
   select ename from emp where ename between ‘A’ and ‘D’;

+-------+
| ename |
+-------+
| ALLEN |
| BLAKE |
| CLARK |
| ADAMS |
+-------+

select ename from emp where ename between ‘A’ and ‘D’; // 左闭右开。

3.条件查询is null和is not null

EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO

其每个字段的字段名分别为员工编号、员工姓名、员工职位、员工上级领导编号、员工雇佣日期,员工薪水、员工津贴、员工部门编号。

找出哪些人津贴为NULL?
在数据库当中NULL不是一个值,代表什么也没有,为空。
空不是一个值,不能用等号衡量。
必须使用 is null或者is not null
  select ename,sal,comm from emp where comm is null;

+--------+---------+------+
| ename  | sal     | comm |
+--------+---------+------+
| SMITH  |  800.00 | NULL |
| JONES  | 2975.00 | NULL |
| BLAKE  | 2850.00 | NULL |
| CLARK  | 2450.00 | NULL |
| SCOTT  | 3000.00 | NULL |
| KING   | 5000.00 | NULL |
| ADAMS  | 1100.00 | NULL |
| JAMES  |  950.00 | NULL |
| FORD   | 3000.00 | NULL |
| MILLER | 1300.00 | NULL |
+--------+---------+------+

select ename,sal,comm from emp where comm = null;是错误的
Empty set (0.00 sec)
找出哪些人津贴不为NULL?
  select ename,sal,comm from emp where comm is not null;

+--------+---------+---------+
| ename  | sal     | comm    |
+--------+---------+---------+
| ALLEN  | 1600.00 |  300.00 |
| WARD   | 1250.00 |  500.00 |
| MARTIN | 1250.00 | 1400.00 |
| TURNER | 1500.00 |    0.00 |
+--------+---------+---------+

0表示数字0,而不是为空
找出哪些人没有津贴?
  select ename,sal,comm from emp where comm is null or comm = 0;

+--------+---------+------+
| ename  | sal     | comm |
+--------+---------+------+
| SMITH  |  800.00 | NULL |
| JONES  | 2975.00 | NULL |
| BLAKE  | 2850.00 | NULL |
| CLARK  | 2450.00 | NULL |
| SCOTT  | 3000.00 | NULL |
| KING   | 5000.00 | NULL |
| TURNER | 1500.00 | 0.00 |
| ADAMS  | 1100.00 | NULL |
| JAMES  |  950.00 | NULL |
| FORD   | 3000.00 | NULL |
| MILLER | 1300.00 | NULL |
+--------+---------+------+

and是并且,or是或者,两者都要选

4.and和or的优先级的问题

EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO

其每个字段的字段名分别为员工编号、员工姓名、员工职位、员工上级领导编号、员工雇佣日期,员工薪水、员工津贴、员工部门编号。

找出工作岗位是MANAGER和SALESMAN的员工?
  select ename,job from emp where job = ‘MANAGER’ or job = ‘SALESMAN’;

注意,这里肯定是用or,不可能有一个人既是经理又是销售员
and被翻译成并且,or是或者

+--------+----------+
| ename  | job      |
+--------+----------+
| ALLEN  | SALESMAN |
| WARD   | SALESMAN |
| JONES  | MANAGER  |
| MARTIN | SALESMAN |
| BLAKE  | MANAGER  |
| CLARK  | MANAGER  |
| TURNER | SALESMAN |
+--------+----------+

and和or联合起来用:找出薪资大于1000的并且部门编号是20或30部门的员工。
  select ename,sal,deptno from emp where sal>1000 and deptno=‘20’ or deptno='30’

错误的
但是查询结果里面竟然出来了一个950

+--------+---------+--------+
| ename  | sal     | deptno |
+--------+---------+--------+
| ALLEN  | 1600.00 |     30 |
| WARD   | 1250.00 |     30 |
| JONES  | 2975.00 |     20 |
| MARTIN | 1250.00 |     30 |
| BLAKE  | 2850.00 |     30 |
| SCOTT  | 3000.00 |     20 |
| TURNER | 1500.00 |     30 |
| ADAMS  | 1100.00 |     20 |
| JAMES  |  950.00 |     30 |
| FORD   | 3000.00 |     20 |
+--------+---------+--------+

为什么950先出来,因为and和or组队后,优先级最高的是and, sal>1000 and deptno='20’这两个写在一块,会先查满足这两个条件的,然后再查单独满足deptno='30’的员工,也就是部门号为30的都会查询出来。

  select ename,sal,deptno from emp where sal>1000 and (deptno=‘20’ or deptno=‘30’)(正确的)

+--------+---------+--------+
| ename  | sal     | deptno |
+--------+---------+--------+
| ALLEN  | 1600.00 |     30 |
| WARD   | 1250.00 |     30 |
| JONES  | 2975.00 |     20 |
| MARTIN | 1250.00 |     30 |
| BLAKE  | 2850.00 |     30 |
| SCOTT  | 3000.00 |     20 |
| TURNER | 1500.00 |     30 |
| ADAMS  | 1100.00 |     20 |
| FORD   | 3000.00 |     20 |
+--------+---------+--------+

注意:当运算符的优先级不确定的时候加小括号。

5.条件查询in

EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO

其每个字段的字段名分别为员工编号、员工姓名、员工职位、员工上级领导编号、员工雇佣日期,员工薪水、员工津贴、员工部门编号。

in等同于or:找出工作岗位是MANAGER和SALESMAN的员工?
  select ename,job from emp where job = ‘SALESMAN’ or job = ‘MANAGER’;
  select ename,job from emp where job in(‘SALESMAN’, ‘MANAGER’);

+--------+----------+
| ename  | job      |
+--------+----------+
| ALLEN  | SALESMAN |
| WARD   | SALESMAN |
| JONES  | MANAGER  |
| MARTIN | SALESMAN |
| BLAKE  | MANAGER  |
| CLARK  | MANAGER  |
| TURNER | SALESMAN |
+--------+----------+

  select ename,job from emp where sal in(800, 5000); // in后面的值不是区间,是具体的值。找出工资800和5000的

+-------+-----------+
| ename | job       |
+-------+-----------+
| SMITH | CLERK     |
| KING  | PRESIDENT |
+-------+-----------+

not in: 不在这几个值当中。
  select ename,job from emp where sal not in(800, 5000);

6.模糊查询like

EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO

其每个字段的字段名分别为员工编号、员工姓名、员工职位、员工上级领导编号、员工雇佣日期,员工薪水、员工津贴、员工部门编号。

找出名字当中含有O的?
(在模糊查询当中,必须掌握两个特殊的符号,一个是%,一个是_)
%代表任意多个字符,_代表任意1个字符。
  select ename from emp where ename like ‘%O%’;

+-------+
| ename |
+-------+
| JONES |
| SCOTT |
| FORD  |
+-------+

找出第二个字母是A的
  select ename from emp where ename like ‘_A%’

+--------+
| ename  |
+--------+
| WARD   |
| MARTIN |
| JAMES  |
+--------+

找出名字中有下划线的?
  mysql> select * from t_user;

			| id   | name     |
			+------+----------+
			|    1 | zhangsan |
			|    2 | lisi     |
			|    3 | WANG_WU  |
			+------+----------+

  select name from t_user where name like ‘%_%’;

			| name     |
			+----------+
			| zhangsan |
			| lisi     |
			| WANG_WU  |
			+----------+

这里的_下划线拥有特殊的含义,只表示一个字符。我们想让它成为一个普通的下划线字符,而不具有特殊含义,我们可以使用转义字符
  select name from t_user where name like ‘%_%’;

			| name    |
			+---------+
			| WANG_WU |
			+---------+

找出名字中最后一个字母是T的?
  select ename from emp where ename like '%T’

+-------+
| ename |
+-------+
| SCOTT |
+-------+

注:本版块中MySQL所用到的数据库bjpowernode代码如下,可以直接运行生成数据库文件

DROP TABLE IF EXISTS EMP;
DROP TABLE IF EXISTS DEPT;
DROP TABLE IF EXISTS SALGRADE;

CREATE TABLE DEPT
       (DEPTNO int(2) not null ,
	DNAME VARCHAR(14) ,
	LOC VARCHAR(13),
	primary key (DEPTNO)
	);
CREATE TABLE EMP
       (EMPNO int(4)  not null ,
	ENAME VARCHAR(10),
	JOB VARCHAR(9),
	MGR INT(4),
	HIREDATE DATE  DEFAULT NULL,
	SAL DOUBLE(7,2),
	COMM DOUBLE(7,2),
	primary key (EMPNO),
	DEPTNO INT(2) 
	)
	;

CREATE TABLE SALGRADE
      ( GRADE INT,
	LOSAL INT,
	HISAL INT );




INSERT INTO DEPT ( DEPTNO, DNAME, LOC ) VALUES ( 
10, 'ACCOUNTING', 'NEW YORK'); 
INSERT INTO DEPT ( DEPTNO, DNAME, LOC ) VALUES ( 
20, 'RESEARCH', 'DALLAS'); 
INSERT INTO DEPT ( DEPTNO, DNAME, LOC ) VALUES ( 
30, 'SALES', 'CHICAGO'); 
INSERT INTO DEPT ( DEPTNO, DNAME, LOC ) VALUES ( 
40, 'OPERATIONS', 'BOSTON'); 
commit;
 
INSERT INTO EMP ( EMPNO, ENAME, JOB, MGR, HIREDATE, SAL, COMM,
DEPTNO ) VALUES ( 
7369, 'SMITH', 'CLERK', 7902,  '1980-12-17'
, 800, NULL, 20); 
INSERT INTO EMP ( EMPNO, ENAME, JOB, MGR, HIREDATE, SAL, COMM,
DEPTNO ) VALUES ( 
7499, 'ALLEN', 'SALESMAN', 7698,  '1981-02-20'
, 1600, 300, 30); 
INSERT INTO EMP ( EMPNO, ENAME, JOB, MGR, HIREDATE, SAL, COMM,
DEPTNO ) VALUES ( 
7521, 'WARD', 'SALESMAN', 7698,  '1981-02-22'
, 1250, 500, 30); 
INSERT INTO EMP ( EMPNO, ENAME, JOB, MGR, HIREDATE, SAL, COMM,
DEPTNO ) VALUES ( 
7566, 'JONES', 'MANAGER', 7839,  '1981-04-02'
, 2975, NULL, 20); 
INSERT INTO EMP ( EMPNO, ENAME, JOB, MGR, HIREDATE, SAL, COMM,
DEPTNO ) VALUES ( 
7654, 'MARTIN', 'SALESMAN', 7698,  '1981-09-28'
, 1250, 1400, 30); 
INSERT INTO EMP ( EMPNO, ENAME, JOB, MGR, HIREDATE, SAL, COMM,
DEPTNO ) VALUES ( 
7698, 'BLAKE', 'MANAGER', 7839,  '1981-05-01'
, 2850, NULL, 30); 
INSERT INTO EMP ( EMPNO, ENAME, JOB, MGR, HIREDATE, SAL, COMM,
DEPTNO ) VALUES ( 
7782, 'CLARK', 'MANAGER', 7839,  '1981-06-09'
, 2450, NULL, 10); 
INSERT INTO EMP ( EMPNO, ENAME, JOB, MGR, HIREDATE, SAL, COMM,
DEPTNO ) VALUES ( 
7788, 'SCOTT', 'ANALYST', 7566,  '1987-04-19'
, 3000, NULL, 20); 
INSERT INTO EMP ( EMPNO, ENAME, JOB, MGR, HIREDATE, SAL, COMM,
DEPTNO ) VALUES ( 
7839, 'KING', 'PRESIDENT', NULL,  '1981-11-17'
, 5000, NULL, 10); 
INSERT INTO EMP ( EMPNO, ENAME, JOB, MGR, HIREDATE, SAL, COMM,
DEPTNO ) VALUES ( 
7844, 'TURNER', 'SALESMAN', 7698,  '1981-09-08'
, 1500, 0, 30); 
INSERT INTO EMP ( EMPNO, ENAME, JOB, MGR, HIREDATE, SAL, COMM,
DEPTNO ) VALUES ( 
7876, 'ADAMS', 'CLERK', 7788,  '1987-05-23'
, 1100, NULL, 20); 
INSERT INTO EMP ( EMPNO, ENAME, JOB, MGR, HIREDATE, SAL, COMM,
DEPTNO ) VALUES ( 
7900, 'JAMES', 'CLERK', 7698,  '1981-12-03'
, 950, NULL, 30); 
INSERT INTO EMP ( EMPNO, ENAME, JOB, MGR, HIREDATE, SAL, COMM,
DEPTNO ) VALUES ( 
7902, 'FORD', 'ANALYST', 7566,  '1981-12-03'
, 3000, NULL, 20); 
INSERT INTO EMP ( EMPNO, ENAME, JOB, MGR, HIREDATE, SAL, COMM,
DEPTNO ) VALUES ( 
7934, 'MILLER', 'CLERK', 7782,  '1982-01-23'
, 1300, NULL, 10); 
commit;
 
INSERT INTO SALGRADE ( GRADE, LOSAL, HISAL ) VALUES ( 
1, 700, 1200); 
INSERT INTO SALGRADE ( GRADE, LOSAL, HISAL ) VALUES ( 
2, 1201, 1400); 
INSERT INTO SALGRADE ( GRADE, LOSAL, HISAL ) VALUES ( 
3, 1401, 2000); 
INSERT INTO SALGRADE ( GRADE, LOSAL, HISAL ) VALUES ( 
4, 2001, 3000); 
INSERT INTO SALGRADE ( GRADE, LOSAL, HISAL ) VALUES ( 
5, 3001, 9999); 
commit;

猜你喜欢

转载自blog.csdn.net/qq_39736597/article/details/111698245
今日推荐