- 随机返回几行
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时: