过滤 WHERE

SELECT column_name,column_name FROM table_name WHERE column_name operator value;

WHERE 子句中的运算符

比较

运算符 描述
= 等于
<> 不等于。注释:在 SQL 的一些版本中,该操作符可被写成 !=
> 大于
< 小于
>= 大于等于
<= 小于等于

范围

运算符 描述
BETWEEN...AND... 在某个范围内
LIKE (expr..) 模糊查询
IN (set) 指定针对某个列的多个可能值
NOT IN (set) 不在指定集合内
IS NULL 空值
IS NOT NULL 非空

逻辑

运算符 描述
AND 逻辑并
OR 逻辑或
NOT 逻辑否

优先级

运算符 描述
1 算术运算符
2 连接符
3 比较符
4 IS [NOT] NULL,LIKE,[NOT] IN
5 [NOT] BETWEEN
6 NOT
7 AND
8 OR

可以使用括号改变优先级顺序

WHERE 子句使用示例

--普通

SQL> --查询10号部门的员工
SQL> select *
     from emp
     where deptno=10;

     EMPNO ENAME    JOB              MGR HIREDATE         SAL       COMM     DEPTNO                                     
---------- -------- --------- ---------- -------------- ----- ---------- ----------                                     
      7782 CLARK    MANAGER         7839 09-6月 -81      2450                    10                                     
      7839 KING     PRESIDENT            17-11月-81      5000                    10                                     
      7934 MILLER   CLERK           7782 23-1月 -82      1300                    10 
--注意:
--是否设置字符串大小写敏感
--日期格式敏感

--between and

--查询薪水1000~2000之间的员工
SQL> select *
     from emp
     where sal between 1100 and 1600;

     EMPNO ENAME    JOB              MGR HIREDATE         SAL       COMM     DEPTNO                                                                                                                     
---------- -------- --------- ---------- -------------- ----- ---------- ----------                                                                                                                     
      7499 ALLEN    SALESMAN        7698 20-2月 -81      1600        300         30                                                                                                                     
      7521 WARD     SALESMAN        7698 22-2月 -81      1250        500         30                                                                                                                     
      7654 MARTIN   SALESMAN        7698 28-9月 -81      1250       1400         30                                                                                                                     
      7844 TURNER   SALESMAN        7698 08-9月 -81      1500          0         30                                                                                                                     
      7876 ADAMS    CLERK           7788 23-5月 -87      1100                    20                                                                                                                     
      7934 MILLER   CLERK           7782 23-1月 -82      1300                    10  
--between and: 
1.含有边界  
2.小值在前 大值在后

*** --in ***

--查询10和20号部门的员工
SQL> select *
     from emp
     where deptno in (10,20);

     EMPNO ENAME    JOB              MGR HIREDATE         SAL       COMM     DEPTNO                                                                                                                     
---------- -------- --------- ---------- -------------- ----- ---------- ----------                                                                                                                     
      7369 SMITH    CLERK           7902 17-12月-80       800                    20                                                                                                                     
      7566 JONES    MANAGER         7839 02-4月 -81      2975                    20                                                                                                                     
      7782 CLARK    MANAGER         7839 09-6月 -81      2450                    10                                                                                                                     
      7788 SCOTT    ANALYST         7566 19-4月 -87      3000                    20                                                                                                                     
      7839 KING     PRESIDENT            17-11月-81      5000                    10                                                                                                                     
      7876 ADAMS    CLERK           7788 23-5月 -87      1100                    20                                                                                                                     
      7902 FORD     ANALYST         7566 03-12月-81      3000                    20                                                                                                                     
      7934 MILLER   CLERK           7782 23-1月 -82      1300                    10
--查询不是10和20号部门的员工
SQL> select *
     from emp
     where deptno not in (10,20)
	
 EMPNO ENAME    JOB              MGR HIREDATE         SAL       COMM     DEPTNO                                                                                                                     
---------- -------- --------- ---------- -------------- ----- ---------- ----------                                                                                                                     
      7499 ALLEN    SALESMAN        7698 20-2月 -81      1600        300         30                                                                                                                     
      7521 WARD     SALESMAN        7698 22-2月 -81      1250        500         30                                                                                                                     
      7654 MARTIN   SALESMAN        7698 28-9月 -81      1250       1400         30                                                                                                                     
      7698 BLAKE    MANAGER         7839 01-5月 -81      2850                    30                                                                                                                     
      7844 TURNER   SALESMAN        7698 08-9月 -81      1500          0         30                                                                                                                     
      7900 JAMES    CLERK           7698 03-12月-81       950                    30                                                                                                                     
--null:
--3、如果集合中含有null,不能使用not in;但可以使用in

SQL> select *
     from emp
     where deptno not in (10,20,null)
--将查询不到结果

SQL> select *
     from emp
     where deptno in (10,20,null)
--可以查询到结果

--思考:上面的原因是什么?

*** --模糊查询 LIKE***

--查询名字以S打头的员工
SQL> select *
     from emp
     where ename like 'S%';

     EMPNO ENAME    JOB              MGR HIREDATE         SAL       COMM     DEPTNO                                                                                                                     
---------- -------- --------- ---------- -------------- ----- ---------- ----------                                                                                                                     
      7369 SMITH    CLERK           7902 17-12月-80       800                    20                                                                                                                     
      7788 SCOTT    ANALYST         7566 19-4月 -87      3000                    20                                                                                                                     

SQL> --查询名字是4个字的员工
SQL> select *
     from emp
     where ename like '____'

     EMPNO ENAME    JOB              MGR HIREDATE         SAL       COMM     DEPTNO                                                                                                                     
---------- -------- --------- ---------- -------------- ----- ---------- ----------                                                                                                                     
      7521 WARD     SALESMAN        7698 22-2月 -81      1250        500         30                                                                                                                     
      7839 KING     PRESIDENT            17-11月-81      5000                    10                                                                                                                     
      7902 FORD     ANALYST         7566 03-12月-81      3000                    20                                                                                                                     
--向数据库里插入这样一条数据:
SQL> insert into emp(empno,ename,sal,deptno) values(1001,'Tom_AB',3000,10);
--然后通过模糊查询获得它

--查询名字中含有下划线的员工
SQL> select *
     from emp
     where ename like '%_%';

     EMPNO ENAME    JOB              MGR HIREDATE         SAL       COMM     DEPTNO                                                                                                                     
---------- -------- --------- ---------- -------------- ----- ---------- ----------                                                                                                                     
      1001 Tom_AB                                        3000                    10                                                                                                                     
      7369 SMITH    CLERK           7902 17-12月-80       800                    20                                                                                                                     
      7499 ALLEN    SALESMAN        7698 20-2月 -81      1600        300         30                                                                                                                     
      7521 WARD     SALESMAN        7698 22-2月 -81      1250        500         30                                                                                                                     
      7566 JONES    MANAGER         7839 02-4月 -81      2975                    20                                                                                                                     
      7654 MARTIN   SALESMAN        7698 28-9月 -81      1250       1400         30                                                                                                                     
      7698 BLAKE    MANAGER         7839 01-5月 -81      2850                    30                                                                                                                     
      7782 CLARK    MANAGER         7839 09-6月 -81      2450                    10                                                                                                                     
      7788 SCOTT    ANALYST         7566 19-4月 -87      3000                    20                                                                                                                     
      7839 KING     PRESIDENT            17-11月-81      5000                    10                                                                                                                     
      7844 TURNER   SALESMAN        7698 08-9月 -81      1500          0         30                                                                                                                     
      7876 ADAMS    CLERK           7788 23-5月 -87      1100                    20                                                                                                                     
      7900 JAMES    CLERK           7698 03-12月-81       950                    30                                                                                                                     
      7902 FORD     ANALYST         7566 03-12月-81      3000                    20                                                                                                                     
      7934 MILLER   CLERK           7782 23-1月 -82      1300                    10                                                                                                                     
--却发现得到了所有的员工,这明显是 %_% 中的 _ 未被转义
--转意字符
SQL> select *
     from emp
     where ename like '%\_%' 
		 
--oracle中还可以通过escape自己设定转义字符
--select * from emp where ename like '%#_%' escape '#'

     EMPNO ENAME    JOB              MGR HIREDATE         SAL       COMM     DEPTNO                                                                                                                     
---------- -------- --------- ---------- -------------- ----- ---------- ----------                                                                                                                     
      1001 Tom_AB                                        3000                    10                                                                                                                     

WHERE 解析顺序

--where解析顺序: 右 ---> 左
--where cons1 and cons2
--SQL将会先判断cons2,若cons2为true,再判断cons1,若cons2为false,则不用再判断cons1

--SQL优化:
--2、where子句中将容易返回false的判断写在右边

排序 ORDER BY

*** --普通***

--查询员工信息,按照月薪排序
  select * from emp order by sal;

     EMPNO ENAME    JOB              MGR HIREDATE         SAL       COMM     DEPTNO                                                                                                                     
---------- -------- --------- ---------- -------------- ----- ---------- ----------                                                                                                                     
      7369 SMITH    CLERK           7902 17-12月-80       800                    20                                                                                                                     
      7900 JAMES    CLERK           7698 03-12月-81       950                    30                                                                                                                     
      7876 ADAMS    CLERK           7788 23-5月 -87      1100                    20                                                                                                                     
      7521 WARD     SALESMAN        7698 22-2月 -81      1250        500         30                                                                                                                     
      7654 MARTIN   SALESMAN        7698 28-9月 -81      1250       1400         30                                                                                                                     
      7934 MILLER   CLERK           7782 23-1月 -82      1300                    10                                                                                                                     
      7844 TURNER   SALESMAN        7698 08-9月 -81      1500          0         30                                                                                                                     
      7499 ALLEN    SALESMAN        7698 20-2月 -81      1600        300         30                                                                                                                     
      7782 CLARK    MANAGER         7839 09-6月 -81      2450                    10                                                                                                                     
      7698 BLAKE    MANAGER         7839 01-5月 -81      2850                    30                                                                                                                     
--order by 后面  +  列、表达式、别名、序号
--列:ENAMEl
--表达式:sal*12
--别名:年薪
--序号:3 (序号从1开始)
SQL> select empno,ename,sal,sal*12
     from emp
     order by sal*12 desc;

     EMPNO ENAME      SAL     SAL*12                                                                                                                                                                    
---------- -------- ----- ----------                                                                                                                                                                    
      7839 KING      5000      60000                                                                                                                                                                    
      7902 FORD      3000      36000                                                                                                                                                                    
      7788 SCOTT     3000      36000                                                                                                                                                                    
      7566 JONES     2975      35700                                                                                                                                                                    
      7698 BLAKE     2850      34200                                                                                                                                                                    
      7782 CLARK     2450      29400                                                                                                                                                                    
      7499 ALLEN     1600      19200                                                                                                                                                                    
      7844 TURNER    1500      18000                                                                                                                                                                    
      7934 MILLER    1300      15600                                                                                                                                                                    
      7521 WARD      1250      15000                                                                                                                                                                    
      7654 MARTIN    1250      15000                                                                                                                                                                                                                             
      7876 ADAMS     1100      13200                                                                                                                                                                    
      7900 JAMES      950      11400                                                                                                                                                                    
      7369 SMITH      800       9600                                                                                                       

*** --升降序 ASC DESC***

--升序 ASC(默认)
--降序 DESC
SQL> select empno,ename,sal,sal*12 年薪
     from emp
     order by 4 desc

     EMPNO ENAME      SAL       年薪                                                                                                                                                                    
---------- -------- ----- ----------                                                                                                                                                                    
      7839 KING      5000      60000                                                                                                                                                                    
      7902 FORD      3000      36000                                                                                                                                                                    
      7788 SCOTT     3000      36000                                                                                                                                                                    
      7566 JONES     2975      35700                                                                                                                                                                    
      7698 BLAKE     2850      34200                                                                                                                                                                    
      7782 CLARK     2450      29400                                                                                                                                                                    
      7499 ALLEN     1600      19200                                                                                                                                                                    
      7844 TURNER    1500      18000                                                                                                                                                                    
      7934 MILLER    1300      15600                                                                                                                                                                    
      7521 WARD      1250      15000                                                                                                                                                                    
      7654 MARTIN    1250      15000                                                                                                                                                                                                                                                                                                                           
      7876 ADAMS     1100      13200                                                                                                                                                                    
      7900 JAMES      950      11400                                                                                                                                                                    
      7369 SMITH      800       9600

*** --多个列的排序***

--多个列的排序
SQL> select *
     from emp
     order by deptno,sal desc

     EMPNO ENAME    JOB              MGR HIREDATE         SAL       COMM     DEPTNO                                                                                                                     
---------- -------- --------- ---------- -------------- ----- ---------- ----------                                                                                                                     
      7839 KING     PRESIDENT            17-11月-81      5000                    10                                                                                                                     
      7782 CLARK    MANAGER         7839 09-6月 -81      2450                    10                                                                                                                     
      7934 MILLER   CLERK           7782 23-1月 -82      1300                    10                                                                                                                     
      7788 SCOTT    ANALYST         7566 19-4月 -87      3000                    20                                                                                                                     
      7902 FORD     ANALYST         7566 03-12月-81      3000                    20                                                                                                                     
      7566 JONES    MANAGER         7839 02-4月 -81      2975                    20                                                                                                                     
      7876 ADAMS    CLERK           7788 23-5月 -87      1100                    20                                                                                                                     
      7369 SMITH    CLERK           7902 17-12月-80       800                    20                                                                                                                     
      7698 BLAKE    MANAGER         7839 01-5月 -81      2850                    30                                                                                                                     
      7499 ALLEN    SALESMAN        7698 20-2月 -81      1600        300         30                                                                                                                     
      7844 TURNER   SALESMAN        7698 08-9月 -81      1500          0         30                                                                                                                     
      7654 MARTIN   SALESMAN        7698 28-9月 -81      1250       1400         30                                                                                                                     
      7521 WARD     SALESMAN        7698 22-2月 -81      1250        500         30                                                                                                                     
      7900 JAMES    CLERK           7698 03-12月-81       950                    30   
--order by 作用于后面所有的列,先按照第一个列排序,再按后面的列排序
--desc只作用于离他最近的列
--多列排序时需要给每一个列都加排序说明[desc|asc]
--思考:排序后的结果,是否是原来的表?

*** --null的排序***

--在oracle中:
--升序
SQL> select * from emp order by comm;

     EMPNO ENAME    JOB              MGR HIREDATE         SAL       COMM     DEPTNO                                                                                                                     
---------- -------- --------- ---------- -------------- ----- ---------- ----------                                                                                                                     
      7844 TURNER   SALESMAN        7698 08-9月 -81      1500          0         30                                                                                                                     
      7499 ALLEN    SALESMAN        7698 20-2月 -81      1600        300         30                                                                                                                     
      7521 WARD     SALESMAN        7698 22-2月 -81      1250        500         30                                                                                                                     
      7654 MARTIN   SALESMAN        7698 28-9月 -81      1250       1400         30                                                                                                                     
      7788 SCOTT    ANALYST         7566 19-4月 -87      3000                    20                                                                                                                     
      7839 KING     PRESIDENT            17-11月-81      5000                    10                                                                                                                     
      7876 ADAMS    CLERK           7788 23-5月 -87      1100                    20                                                                                                                     
      7900 JAMES    CLERK           7698 03-12月-81       950                    30                                                                                                                     
      7902 FORD     ANALYST         7566 03-12月-81      3000                    20                                                                                                                     
      7934 MILLER   CLERK           7782 23-1月 -82      1300                    10                                                                                                                     
      7698 BLAKE    MANAGER         7839 01-5月 -81      2850                    30                                                                                                                     
      7566 JONES    MANAGER         7839 02-4月 -81      2975                    20                                                                                                                     
      7369 SMITH    CLERK           7902 17-12月-80       800                    20                                                                                                                     
      7782 CLARK    MANAGER         7839 09-6月 -81      2450                    10                                                                                                                     

--降序
SQL> select * from emp order by comm desc;

     EMPNO ENAME    JOB              MGR HIREDATE         SAL       COMM     DEPTNO                                                                                                                     
---------- -------- --------- ---------- -------------- ----- ---------- ----------                                                                                                                     
      7369 SMITH    CLERK           7902 17-12月-80       800                    20                                                                                                                     
      7782 CLARK    MANAGER         7839 09-6月 -81      2450                    10                                                                                                                     
      7902 FORD     ANALYST         7566 03-12月-81      3000                    20                                                                                                                     
      7900 JAMES    CLERK           7698 03-12月-81       950                    30                                                                                                                     
      7876 ADAMS    CLERK           7788 23-5月 -87      1100                    20                                                                                                                     
      7566 JONES    MANAGER         7839 02-4月 -81      2975                    20                                                                                                                     
      7698 BLAKE    MANAGER         7839 01-5月 -81      2850                    30                                                                                                                     
      7934 MILLER   CLERK           7782 23-1月 -82      1300                    10                                                                                                                     
      7788 SCOTT    ANALYST         7566 19-4月 -87      3000                    20                                                                                                                     
      7839 KING     PRESIDENT            17-11月-81      5000                    10                                                                                                                     
      7654 MARTIN   SALESMAN        7698 28-9月 -81      1250       1400         30                                                                                                                     
      7521 WARD     SALESMAN        7698 22-2月 -81      1250        500         30                                                                                                                     
      7499 ALLEN    SALESMAN        7698 20-2月 -81      1600        300         30                                                                                                                     
      7844 TURNER   SALESMAN        7698 08-9月 -81      1500          0         30 
--不难发现有null值排序中:
--升序时null值排在了最后
--降序时null值排在了最前
--null值最大?
--oracle:
--null值排在最前
select * from A order by a desc null first
--null值排在最后
select * from A order by a desc null last

--mysql:
--null值排在最后,用Mysql的IF和ISNULL函数。如果为空返回1,否返回0
select * from A order by IF(ISNULL(a),1,0),a desc
--null值排在最前,用Mysql的IF和ISNULL函数。如果为空返回1,否返回0
select * from A order by IF(ISNULL(a),0,1),a desc
最后修改于 2019-05-09 12:02:09
如果觉得我的文章对你有用,请随意赞赏
扫一扫支付
上一篇