读书笔记-sql经典实例

  • 随机返回几行
SELECT ename,job  
FROM EMP
ORDER BY RAND() LIMIT 5
  • 查找NULL值: 要判断一个值是否为Null,必须使用IS Null
select *from emp where comm is null

Null值不会等于或者不等于任何值,甚至不能与其自身作比较。因此,不能使用 = 或 != 来测试某一列的值是否为Null。判断一行是否含有Null,必须使用IS Null。你也可以使用IS NOT Null来找到给定列的值不是Null的所有行

  • 将NUll值换为其他值
    SELECT COALESCE(comm,0) FROM EMP
    处理Null值时,最好利用数据库的内置功能。
  • case when 处理Null值
select case
       when comm is not null then comm
       else 0
       end
from emp
  • order by: 如果你的查询语句里有GROUP BY或DISTINCT,那么就不能按照SELECT列表之外的列进行排序。
  • 排序时对Null值的处理
    使用CASE表达式标记Null值。该标记有两种可能的取值:一种代表Null值,另一种代表非Null值。一旦你做好了标记,只要简单地把它放进ORDER BY子句就行了。这样一来,你就能在不影响非Null值的情况下,方便地调整Null值的位置了
  • order by 根据条件排序

    如果JOB等于SALESMAN,就要按照COMM来排序;否则,按照SAL排序。你希望返回如下所示的结果集

多表查询

  • UNION ALL:将重复的值也算上
  • UNION: 过滤掉重复值,会进行一次排序,去除重复值
  • UNION相当于UNION ALL再加上一次distinct操作
  • 查找只存在于一个表中的数据
    其中oracle可以直接用MINUS
    eg: select deptno from dept
    minus
    select deptno from emp
    mysql:
    select deptno from dept
    where deptno not in (select deptno from emp)
    可以使用DISTINCT来确保每个在EMP表里缺少的DEPTNO值只出现一次
    select distinct deptno
    from dept
    where deptno not in (select deptno from emp)
    在使用NOT IN时,要注意Null值。考虑如下的表NEW_DEPT
    create table new_dept(deptno integer)
    insert into new_dept values (10)
    insert into new_dept values (50)
    insert into new_dept values (null)
    如果你试着使用NOT IN子查询检索存在于DEPT表却不存在于NEW_DEPT表的DEPTNO,会发现查不到任何值
    SELECT *
    FROM DEPT
    WHERE deptno NOT IN (SELECT deptno FROM new_dept)
    这样返回为空
    原因就在于NEW_DEPT表里有Null值。子查询会返回3行DEPTNO,分别为10、50和Null值。IN和NOT IN本质上是OR运算,
    由于Null值参与OR逻辑运算的方式不同,IN和NOT IN将会产生不同的结果
    当使用in时:

    使用not in时:



原文地址:https://www.cnblogs.com/Baronboy/p/14145983.html