讀書筆記-mysql經典例項
- 隨機返回幾行
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: 過濾掉重複值,會進行一次排序,去除重複值
-
查詢只存在於一個表中的資料
其中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時: