select 用於從數據看查詢數據。語法 * 是通配符表示查詢所有欄位。如果要查特定的欄位時,不要使用*,影響查詢效率。 1.1.2 distinct 去重 把重覆性的記錄去掉,只保留一條。 修飾多欄位時,多個欄位的值都不一樣才保留。 1.1.3 where 子句 where 表示查詢的條件。 [1 ...
1.1 查詢語句
1.1.1 select
select 用於從數據看查詢數據。語法
select field1,filed2,.. . from tablename [where condition]
1 -- 查詢所有員工的名字和雇員號 2 select empno,ename from emp; 3 4 -- 查詢所有員工的雇員號、姓名、崗位 5 select empno,ename,job from emp; 6 7 -- 欄位的別名 as 8 select ename as "姓名" from emp; 9 select ename as "姓名",job as "崗位" from emp; 10 11 -- 別名一定要用雙引號,不能用單引號 12 select ename "姓名",job "崗位" from emp; 13 -- 雙引號可以省略 14 select ename 姓名 from emp; 15 16 -- 表的別名 17 select emp.ename,emp.job from emp; 18 select e.ename,e.job from emp e;
* 是通配符表示查詢所有欄位。如果要查特定的欄位時,不要使用*,影響查詢效率。
1.1.2 distinct 去重
把重覆性的記錄去掉,只保留一條。
select empno,ename,job,mgr,hiredate,sal,comm,deptno from emp; -- * 通配符表示所有欄位 select * from emp;
修飾多欄位時,多個欄位的值都不一樣才保留。
1.1.3 where 子句
where 表示查詢的條件。
[1] =,!= ,<>,<,>,<=,>= 關係運算符
<> 表示不等於
1 -- where 子句 2 3 -- 把部分10的雇員查詢出來 4 select * 5 from emp 6 where deptno = 10; 7 8 -- 把名稱為smith的雇員 9 select e.* 10 from emp e 11 where e.ename = 'SMITH'; 12 13 -- 查詢底薪大於等於1000的員工 14 select e.* 15 from emp e 16 where e.sal >= 1000; 17 18 select e.* 19 from emp e 20 where e.sal <> 800
any/som/all(list)
any/some(list) 滿足list列表中的任意一個條件
all(list) 滿足list列表的中所有條件
1 -- any some all 2 3 -- 查詢薪資大於1000或者薪資大於800的雇員 4 select e.* 5 from emp e 6 where e.sal > some(1000,800); 7 8 -- 查詢薪資大於1000 9 select e.* 10 from emp e 11 where e.sal > all(1000,800);
[2] null
null 在sql中表示的是不確定 => 可以認為沒有值(一些情況下)
1 -- null/not null 2 -- 查詢沒有津貼的雇員 3 select e.* 4 from emp e 5 where e.comm is null 6 7 select e.* 8 from emp e 9 where e.comm is not null
【3】betweem x and y
表示一個值位於【x,y】區間,x與Y一般都是數字
-- between x and y -- 查詢薪資在1000-5000之間的雇員 select e.* from emp e where e.sal between 1000 and 5000 -- 查詢薪資在(3000,5000]之間的雇員 select e.* from emp e where e.sal between 3000.01 and 5000
【4】in/not in list
表示欄位值是否在list列表中
1 -- in/not in(list) 2 -- 查詢部分號是10和20的員工 3 select e.* 4 from emp e 5 where e.deptno in(10,20); 6 7 select e.* 8 from emp e 9 where e.deptno not in(10,20); 10 11 -- 查詢薪資是1000,2000,5000的員工 12 select e.* 13 from emp e 14 where e.sal in (1000,2000,5000);
【5】模糊查詢
like 關鍵字 用於模糊查詢中
%:表示任意字元出現多次(含0次),
_:表示任意字元出現1次。
escape(‘x’)表示指定的轉義字元為x,一般指定為\
-- 查詢名字是c開頭的雇員 select e.* from emp e where e.ename like 'c%'; -- 查詢名字中第二個字母是M的雇員 select e.* from emp e where e.ename like '_M%' -- 查詢名字中含有M的雇員 select e.* from emp e where e.ename like '%M%'; -- 查詢名字中含有%的雇員 select e.* from emp e where e.ename like '%\%%' escape('\');
1.2 複雜查詢(and /or)
where 後面的條件可以跟多個and或者or連接
and:且、並且
or:或、或者
1 -- 查詢部門10且薪資大於等2000的雇員 2 select e.* 3 from emp e 4 where e.deptno = 10 and e.sal >= 2000; 5 6 -- 查詢名字中含M且薪資大於1000的雇員 7 select e.* 8 from emp e 9 where e.ename like '%M%' and e.sal > 1000 10 11 -- 查詢部門在10或20的雇員 12 select e.* 13 from emp e 14 where e.deptno = 10 or e.deptno = 20
where 中and、or的執行效率問題
-- 思考:查詢條件的順序對查詢速度是否有影響? /* 分析: and 表示且,條件越多,檢索的數據量越來越少 or 表示或,條件越多,檢索的數據量越來越多 where 條件的執行順序從後向前 */ -- 優化後的sql select e.* from emp e where e.sal>=2000 and e.deptno = 10 -- 結論 -- AND: 把檢索結果較少的條件放到後面 -- 查部門10或30的雇員 select e.* from emp e where e.deptno = 10 or e.deptno = 30;
綜合案例
1 --使用in查詢部門名稱為 SALES 和 RESEARCH 的雇員姓名、工資、部門編號 2 -- 思考:部門名稱位於dept,雇員信息位於emp表 3 select e.ename,e.sal,e.deptno 4 from emp e 5 where e.deptno in 6 ( 7 select d.deptno 8 from dept d 9 where d.dname = 'SALES' or d.dname = 'RESEARCH' 10 );
1.3 計算欄位
我們經常需要把資料庫中檢索出來的信息進行再加工,允許的操作+、-、*、/。通過四個運算得到新的欄位(計算欄位)。
計算欄位在數據表中不存在。
-- 查詢出每個雇員的月薪(收入) select e.ename,e.sal+e.comm as "收入",e.deptno from emp e
註意:很多記錄中的comm是null,表示不確定的值,經常四則運算後的值也不確定。
當遇到欄位時null時,可以通過nvl函數把null轉化便於運算的類型。
-- nvl函數優化 select e.ename,e.sal+nvl(e.comm,0) "收入",e.deptno from emp e