1. 程式人生 > >那一年,我在墻頭,你在墻角

那一年,我在墻頭,你在墻角

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;

試題

  1. where和having區別?(面試和筆試會遇到) ```
  2. where 不能放在GROUP BY 後面
  3. HAVING 是跟GROUP BY 連在一起用的,放在GROUP BY 後面,此時的作用相當於WHERE
  4. WHERE 後面的條件中不能有聚集函數,比如SUM(),AVG()等,而HAVING 可以 ```

  5. mysql分組和oralce分組的不同(面試和筆試會遇到) ```

  6. Oracle裏,SELECT子句後面的所有目標列或目標表達式要麽是分組列,要麽是分組表達式,要麽是聚合函數 MySQL裏SELECT後面的字段並沒有這樣的限制,MySQL裏SELECT後面可以是表裏的任何字段或這些字段的表達式。

  7. 在對分組之後的數據進行篩選的時候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

那一年,我在墻頭,你在墻角