oracle菜鳥日記1
阿新 • • 發佈:2019-02-08
1. 在查詢資料字典檢視的時候,使用where語句時,要注意後面的字元型別的查詢需要大寫,因為資料庫儲存的時候預設將字典裡面的每個欄位裡面的內容按照大寫來儲存的。
例如:select * from user_constraints where table_name='大寫表名'
例如:select deptno,
ltrim(sys_connect_by_path(ename,','),',') emps
from (
select deptno,
ename,
row_number() over (partition by deptno order by empno) rn,
count(*) over (partition by deptno) cnt
from emp
)
where level=cnt
start with rn=1
connect by prior deptno=deptno and prior rn=rn-1
/
而不能寫成:select deptno,
ltrim(sys_connect_by_path(ename,','),',') emps
from (
select deptno,
ename,
row_number() over (partition by deptno order by empno) rn,
count(*) over (partition by deptno) cnt
from emp
)
start with rn=1
connect by prior deptno=deptno and prior rn=rn-1
where level=cnt
/
例如:select * from user_constraints where table_name='大寫表名'
2. 對於有內聯檢視的select查詢語句,最外面的查詢是最後執行的,要先將最外面的from後面的子句全部執行完畢後,才能執行select ..... where...;
但是,對於有connect by 樹形迭代語句時,與最外面的select對應的where子句的位置一定要放在內聯檢視後面,而不能放在connect by 子句之後,否則會報錯!例如:select deptno,
ltrim(sys_connect_by_path(ename,','),',') emps
from (
select deptno,
ename,
row_number() over (partition by deptno order by empno) rn,
count(*) over (partition by deptno) cnt
from emp
)
where level=cnt
start with rn=1
connect by prior deptno=deptno and prior rn=rn-1
/
而不能寫成:select deptno,
ltrim(sys_connect_by_path(ename,','),',') emps
from (
select deptno,
ename,
row_number() over (partition by deptno order by empno) rn,
count(*) over (partition by deptno) cnt
from emp
)
start with rn=1
connect by prior deptno=deptno and prior rn=rn-1
where level=cnt
/
注意:一定要搞清楚語句的執行順序、和where子句所在的位置。
3. where empno in ('1993,2222,2233');肯定報錯,因為我們很不細心的將括號中的看成了數字型別,但是其實,empno是數字型別,而括號裡面的是字元型別。解決方法:只能將其轉換列
4. 在insert into table_name values (),在values和後面的括號之間一定要加個空格號
5. 對於null進行insert時可以用‘’代替
6. 對於ltrim(‘’,‘’)第三個引數要是刪除的話就不用寫,而對於translate(字元型)和replace(字串型)要是刪除的時候需要新增'';
7. 在開窗函式中,over (partition by .. order by ..)在partition by和order by之間不用逗號隔開,只需空格即可;
8. 看似是將行變換成列,實際上是將行與rownum進行笛卡爾基,變成多行,在從每行中提取出所需要的值;
9. replace和translate一般是一起用的,而instr和substr一般是一起用的(因為這兩個函式都要用到數字(也就是字元所在的位置));
10. 注意:instr是字元型函式,instr(列名,'單個字元',起始位置,第幾次出現);
11. where instr(translate(mixed,‘0123456789’,‘9999999999’),‘9’);精妙之處,可以篩選出純數字或者純字母
12. 對於一個欄位的每一行都有幾個字串的話,如果要求將每一行的幾個字串轉換成每行一個字串。則需要笛卡爾基rownum。