那一年,我在墻頭,你在墻角
阿新 • • 發佈:2019-03-08
lock 通用函數 between 中文名 此刻 角度 一個 添加 ont
對表做增刪改查
-- 創建一張表
create table tab_user(
id number(11) primary key ,
username varchar2(10),
password varchar2(20)
);
-- 修改表添加一列
alter table tab_user add age number(3) ;
alter table tab_user add birthday date ;
-- 修改列的類型長度和約束
alter table tab_user modify birthday varchar(20) ;
-- 修改表刪除一列
alter table tab_user drop column age ;
-- 修改表修改列名稱
alter table tab_user rename column birthday to birth ;
-- 刪除表
delete from tab_user; --- 一條一條刪除數據
drop table tab_user ; -- 刪除整個表結構
truncate table tab_user ; -- 刪除表結構,再從新創建表結構
數據庫表數據的增刪改查
oracle序列
CREATE SEQUENCE 序列名稱;
序列創建完成之後,所有的自動增長應該由用戶自己處理,所以在序列中提供了以下的兩種操作:
nextval :取得序列的下一個內容
currval :取得序列的當前內容
表數據增刪改
-- 創建一個序列
-- 序列的作用:產生一組連續的值
create sequence seq_user ;
-- 插入數據
insert into tab_user values(seq_user.nextval,‘張三‘,‘123‘);
insert into tab_user values(seq_user.nextval,‘李四‘,‘123‘);
insert into tab_user values(seq_user.nextval,‘王五‘,‘123‘);
commit; -- 註意oracle執行增刪改操作需要提交事物
-- 更新數據
update tab_user set password = ‘456‘ where username = ‘張三‘ ;
oracle數據庫常用函數
開啟scott賬戶
alter user scott account unlock; --解鎖scott賬戶
alter user scott identified by itcast; -- 為scott賬戶設置密碼 itcast
單行函數
字符函數
函數 | 說明 |
---|---|
ASCII | 返回對應字符的十進制值 |
CHR | 給出十進制返回字符 |
CONCAT | 拼接兩個字符串 |
INITCAP | 將字符串的第一個字母變為大寫 |
INSTR | 找出某個字符串的位置 |
INSTRB | 找出某個字符串的位置和字節數 |
LENGTH | 以字符給出字符串的長度 |
LENGTHB | 以字節給出字符串的長度 |
LOWER | 將字符串轉換成小寫 |
LPAD | 使用指定的字符在字符的左邊填充 |
LTRIM | 在左邊裁剪掉指定的字符 |
RPAD | 使用指定的字符在字符的右邊填充 |
RTRIM | 在右邊裁剪掉指定的字符 |
REPLACE | 執行字符串搜索和替換 |
SUBSTR | 取字符串的子串 |
SUBSTRB | 取字符串的子串(以字節) |
SOUNDEX | 返回一個同音字符串 |
TRANSLATE | 執行字符串搜索和替換 |
TRIM | 裁剪掉前面或後面的字符串 |
UPPER | 將字符串變為大寫 |
-- 求字符串長度LENGTH
select length(‘ABCD‘) from dual;
-- 求字符串的子串SUBSTR
select substr(‘ABCD‘,2,2) from dual;
-- 字符串拼接CONCAT
select concat(‘ABC‘,‘D‘) from dual;
數值函數
函數 | 說明 |
---|---|
ABS(value) | 絕對值 |
CEIL(value) | 大於或等於value 的最小整數 |
COS(value) | 余弦 |
COSH(value) | 反余弦 |
EXP(value) | e 的value 次冪 |
FLOOR(value) | 小於或等於value 的最大整數 |
LN(value) | value 的自然對數 |
LOG(value) | value 的以10 為底的對數 |
MOD(value,divisor) | 求模 |
POWER(value,exponent) | value 的exponent 次冪 |
ROUND(value,precision) | 按precision 精度4 舍5 入 |
SIGN(value) | value 為正返回1;為負返回-1;為0 返回0. |
SIN(value) | 余弦 |
SINH(value) | 反余弦 |
SQRT(value) | value 的平方根 |
TAN(value) | 正切 |
TANH(value) | 反正切 |
TRUNC(value,按precision) | 按照precision 截取value |
VSIZE(value) | 返回value 在ORACLE 的存儲空間大小 |
---- 四舍五入函數ROUND
select round(100.567) from dual
-- 四舍五入保留二位小數
select round(100.567,2) from dual
----截取函數TRUNC
select trunc(100.567) from dual
-- 截取數字,保留二位小數
select trunc(100.567,2) from dual
----取模MOD
select mod(10,3) from dual
日期函數
函數 | 描述 |
---|---|
ADD_MONTHS | 在日期date 上增加count 個月 |
GREATEST(date1,date2,. . .) | 從日期列表中選出最晚的日期 |
LAST_DAY( date ) | 返回日期date 所在月的最後一天 |
LEAST( date1, date2, . . .) | 從日期列表中選出最早的日期 |
MONTHS_BETWEEN(date2, date1) | 給出Date2 - date1 的月數(可以是小數) |
NEXT_DAY( date,’day’) | 給出日期date 之後下一天的日期,這裏的day 為星期, 如: MONDAY,Tuesday 等。 |
NEW_TIME(date,’this’,’other’) | 給出在this 時區=Other 時區的日期和時間 |
ROUND(date,’format’) | 未指定format 時,如果日期中的時間在中午之前,則將日期中的時間截斷為12 A.M.(午夜,一天的開始),否則進到第二天。時間截斷為12 A.M.(午夜,一天的開始),否則進到第二天。 |
TRUNC(date,’format’) | 未指定format 時,將日期截為12 A.M.( 午夜,一天的開始). |
----查詢出emp表中所有員工入職距離現在幾天。
select sysdate-e.hiredate from emp e;
----算出明天此刻
select sysdate+1 from dual;
----查詢出emp表中所有員工入職距離現在幾月。
select months_between(sysdate,e.hiredate) from emp e;
----查詢出emp表中所有員工入職距離現在幾年。
select months_between(sysdate,e.hiredate)/12 from emp e;
----查詢出emp表中所有員工入職距離現在幾周。
select round((sysdate-e.hiredate)/7) from emp e;
轉換函數
函數 | 描述 |
---|---|
CHARTOROWID | 將字符轉換到rowid 類型 |
CONVERT | 轉換一個字符節到另外一個字符節 |
HEXTORAW | 轉換十六進制到raw 類型 |
RAWTOHEX | 轉換raw 到十六進制 |
ROWIDTOCHAR | 轉換ROWID 到字符 |
TO_CHAR | 轉換日期格式到字符串 |
TO_DATE | 按照指定的格式將字符串轉換到日期型 |
TO_MULTIBYTE | 把單字節字符轉換到多字節 |
TO_NUMBER | 將數字字串轉換到數字 |
TO_SINGLE_BYTE | 轉換多字節到單字節 |
---日期轉字符串
select to_char(sysdate, ‘fm yyyy-mm-dd hh24:mi:ss‘) from dual;
---字符串轉日期
select to_date(‘2018-6-7 16:39:50‘, ‘fm yyyy-mm-dd hh24:mi:ss‘) from dual;
空值處理函數
函數 | 描述 |
---|---|
NVL(檢測的值,如果為null 的值) | 將null轉化為指定的值 |
NVL2(檢測的值,如果不為null 的值,如果為null 的值); | 對null值進行處理 |
----通用函數
---算出emp表中所有員工的年薪
----獎金裏面有null值,如果null值和任意數字做算術運算,結果都是null。
select e.sal*12+nvl(e.comm, 0) from emp e;
條件取值函數
函數 | 描述 |
---|---|
decode(條件,值1,翻譯值1,值2,翻譯值2,...值n,翻譯值n,缺省值) | 根據條件返回相應值 |
----oracle專用條件表達式
select e.ename,
decode(e.ename,
‘SMITH‘, ‘曹賊‘,
‘ALLEN‘, ‘大耳賊‘,
‘WARD‘, ‘諸葛小兒‘,
‘無名‘) "中文名"
from emp e;
上邊的語句也可以用case when then
語句來實現(mysql和oracle通用)
---條件表達式
---給emp表中員工起中文名
select e.ename,
case e.ename
when ‘SMITH‘ then ‘曹賊‘
when ‘ALLEN‘ then ‘大耳賊‘
when ‘WARD‘ then ‘諸葛小兒‘
else ‘無名‘
end
from emp e;
---判斷emp表中員工工資,如果高於3000顯示高收入,如果高於1500低於3000顯示中等收入,
-----其余顯示低收入
select e.sal,
case
when e.sal>3000 then ‘高收入‘
when e.sal>1500 then ‘中等收入‘
else ‘低收入‘
end
from emp e;
多行函數
函數 | 描述 |
---|---|
count(統計值) | 計算數量 |
sum(統計值) | 計算總和 |
max(統計值) | 計算最大值 |
min(統計值) | 計算最小值 |
avg(統計值) | 計算平均值 |
--多行函數【聚合函數】:作用於多行,返回一個值。
select count(1) from emp;---查詢總數量
select sum(sal) from emp;---工資總和
select max(sal) from emp;---最大工資
select min(sal) from emp;---最低工資
select avg(sal) from emp;---平均工資
oracle數據庫查詢語句
分組查詢
---分組查詢
---查詢出每個部門的平均工資
---分組查詢中,出現在group by後面的原始列,才能出現在select後面
---沒有出現在group by後面的列,想在select後面,必須加上聚合函數。
---聚合函數有一個特性,可以把多行記錄變成一個值。
select e.deptno, avg(e.sal)--, e.ename
from emp e
group by e.deptno;
---查詢出平均工資高於2000的部門信息
select e.deptno, avg(e.sal) asal
from emp e
group by e.deptno
having avg(e.sal)>2000;
---所有條件都不能使用別名來判斷。
--比如下面的條件語句也不能使用別名當條件
select ename, sal s from emp where sal>1500;
---查詢出每個部門工資高於800的員工的平均工資
select e.deptno, avg(e.sal) asal
from emp e
where e.sal>800
group by e.deptno;
----where是過濾分組前的數據,having是過濾分組後的數據。
---表現形式:where必須在group by之前,having是在group by之後。
---查詢出每個部門工資高於800的員工的平均工資
---然後再查詢出平均工資高於2000的部門
select e.deptno, avg(e.sal) asal
from emp e
where e.sal>800
group by e.deptno
having avg(e.sal)>2000;
試題
- where和having區別?(面試和筆試會遇到) ```
- where 不能放在GROUP BY 後面
- HAVING 是跟GROUP BY 連在一起用的,放在GROUP BY 後面,此時的作用相當於WHERE
-
WHERE 後面的條件中不能有聚集函數,比如SUM(),AVG()等,而HAVING 可以 ```
-
mysql分組和oralce分組的不同(面試和筆試會遇到) ```
-
Oracle裏,SELECT子句後面的所有目標列或目標表達式要麽是分組列,要麽是分組表達式,要麽是聚合函數 MySQL裏SELECT後面的字段並沒有這樣的限制,MySQL裏SELECT後面可以是表裏的任何字段或這些字段的表達式。
-
在對分組之後的數據進行篩選的時候MySQL可以為表裏的任何字段,而Oracle只能為分組字段 只要有group by,那麽Oracle裏除where子句的其他任何子句裏出現的字段都必須是分組字段(子查詢不受這個限制)。 ```
連接查詢
---多表查詢中的一些概念
---笛卡爾積
select *
from emp e, dept d;
---等值連接
select *
from emp e, dept d
where e.deptno=d.deptno;
---內連接
select *
from emp e inner join dept d
on e.deptno = d.deptno;
---查詢出所有部門,以及部門下的員工信息。【外連接】
select *
from emp e right join dept d
on e.deptno=d.deptno;
---查詢所有員工信息,以及員工所屬部門
select *
from emp e left join dept d
on e.deptno=d.deptno;
---oracle中專用外連接(了解)
select *
from emp e, dept d
where e.deptno(+) = d.deptno;
-- 自連接查詢
---查詢出員工姓名,員工領導姓名
---自連接:自連接其實就是站在不同的角度把一張表看成多張表。
select e1.ename, e2.ename
from emp e1, emp e2
where e1.mgr = e2.empno;
------查詢出員工姓名,員工部門名稱,員工領導姓名,員工領導部門名稱
select e1.ename, d1.dname, e2.ename, d2.dname
from emp e1, emp e2, dept d1, dept d2
where e1.mgr = e2.empno
and e1.deptno=d1.deptno
and e2.deptno=d2.deptno;
子查詢
---子查詢
---子查詢返回一個值
---查詢出工資和SCOTT一樣的員工信息
select * from emp where sal in
(select sal from emp where ename = ‘SCOTT‘);
---子查詢返回一個集合
---查詢出工資和10號部門任意員工一樣的員工信息
select * from emp where sal in
(select sal from emp where deptno = 10);
---子查詢返回一張表
---查詢出每個部門最低工資,和最低工資員工姓名,和該員工所在部門名稱
---1,先查詢出每個部門最低工資
select deptno, min(sal) msal
from emp
group by deptno;
---2,三表聯查,得到最終結果。
select t.deptno, t.msal, e.ename, d.dname
from (select deptno, min(sal) msal
from emp
group by deptno) t, emp e, dept d
where t.deptno = e.deptno
and t.msal = e.sal
and e.deptno = d.deptno;
分頁查詢
ROWNUM:表示行號,實際上此是一個列,但是這個列是一個偽列,此列可以在每張表中出現。
----oracle中的分頁
---rownum行號:當我們做select操作的時候,
--每查詢出一行記錄,就會在該行上加上一個行號,
--行號從1開始,依次遞增,不能跳著走。
----排序操作會影響rownum的順序
select rownum, e.* from emp e order by e.sal desc
----如果涉及到排序,但是還要使用rownum的話,我們可以再次嵌套查詢。
select rownum, t.* from(
select rownum, e.* from emp e order by e.sal desc) t;
----emp表工資倒敘排列後,每頁五條記錄,查詢第二頁。
----rownum行號不能寫上大於一個正數。
select * from(
select rownum rn, tt.* from(
select * from emp order by sal desc
) tt
) where rn>5 and rn <11
那一年,我在墻頭,你在墻角