ORACLE資料庫筆記

@author:杜勇帥

@email:[email protected]

1安裝與卸載

卸載:

1停用oracle服務:進入計算機管理,在服務中,找到oracle開頭的所有服務,右擊選擇停止

2:在開始菜單中,找到Universal Installer,運行Oracle Universal Installer,單擊卸載產品

3:在產品清單窗口中,單擊全部展開,除了OraDb11g_home1外,勾選其他項目,單擊刪除

4:按Windows徽標鍵和R鍵,打開運行窗口,輸入regedit,打開註冊表,依次展開HKEY_LOCAL_MACHINESOFTWARE,找到oracle,刪除之

5:依次展開HKEY_LOCAL_MACHINESYSTEMCurrentControlSetServices中,刪除所有oracle開頭的項

6:依次展開HKEY_LOCAL_MACHINESYSTEMCurrentControlSetServicesEventlogApplication,刪除所有oracle開頭的項;

在HKEY_CLASSES_ROOT,刪除以ora開頭的項

7:重啟電腦,刪除oracle目錄,刪除Oracle的安裝目錄app等

運行:sqlplus/nolog4

或者scott

密碼: Dys199463

2.SCOTT賬戶 表的介紹

-- 1:僱員表 總共有 14人 ? -- 普通職員 4人 職位是 CLERK ? -- 銷售 4人 職位是 SALESMAN ? -- 分析師 2人 職位是 ANALYST ? -- 經理 3人 職位是 MANAGER ? -- 董事長 1人 職位是 PRESIDENT ? empno ename job mgr hiredate sal comm deptno 僱員編號 名字 職位 上級領導編號 入職日期 工資 獎金 部門編號 -- 2:部門表 4個部門 ? -- 財務部 部門名稱 ACCOUNTING ? -- 市場部 部門名稱 RESEARCH ? -- 銷售部 部門名稱 SALES ? -- 車間部 部門名稱 OPERATIONS ?

deptno dname loc
部門編號 部門名稱 部門地址

-- 3:獎金錶

-- 4:工資等級表


--資料庫學習 -- 表結構 -- 視圖 -- 索引 -- 序列

-- sql語言的分類

-- 1 DQL 數據查詢語言 select 查詢 -- 2 DML 數據操作語言 insert 插入 update 修改數據 delete 刪除數據 -- 3 DDL 數據定義語言 create 創建 alter 修改表結構 drop 刪除表結構 -- 4 DCL 數據控制語言 grant 授予許可權 revoke 撤銷許可權


  • sql查詢語言

--sql 語言發展 --sql92版本

--sql99版本

-select 查詢

--sql 語言發展 --sql92版本 --sql99版本

---- * 所有 -- from emp 來自emp表 select * from emp; --查詢員工表的所有數據 select * from emp order by sal; --查詢員工表的所有數據按照工資從小到大排序 select * from emp order by empno;--查詢員工表的所有數據按照員工編號從小到大排序 select * from emp where ename like S% select avg(sal),sum(sal) from emp;

--1 單表練習查詢 --查詢所有員工信息 employee select * from emp; --查詢所有部門信息 deptment 注意,記著加結束符為 ";"

select * from dept; select * from emp; --查詢員工表中員工的編號和姓名 查詢個別欄位數據,中間用,分割,最後一個不要加,號 select empno,ename from emp;

-- 查詢所有員工的年薪 (編號,姓名,職位,月薪) select empno,ename,job,sal from emp;

--2 欄位的算術運算 只能對數字(整數和小數)做運算 ? -- 查詢所有員工的年薪 (編號,姓名,職位,月薪) ? select empno,ename,job,sal12 from emp; ? select empno, ename,sal, sal12 +1000 from emp;

--3 使用欄位的別名 ? --查詢員工的姓名,職位,薪資 select ename 姓名,job 職位,sal 薪資 from emp;

select ename as 姓名,job as 職位,sal as 薪資 from emp;

--注意 如果別名的中間有特殊字元,需要將別名用雙引號括起來 --注意 oracle中表示一個字元串統一使用單引號括起來 ,使用雙引號的地方很少,別名這裡使用 select ename "姓 名",job "職 位",sal "薪 資" from emp;

select ename as 姓名, job as 職位,sal12 as 年薪 from emp; select ename as 姓名, job as 職位,sal12 from emp;

--4 查詢員工的姓名,職位,薪資 ? select ename,job,sal from emp; ? --連接運算符 || 和java中的+一個意思 ? --注意:欄位和字元串做拼接,字元串需要使用括起來 select 姓名:||ename|| 職位:||job|| 薪資:||sal as 員工信息 from emp

--5 去除重複行 distinct ? --查詢員工的部門編號 ? select distinct deptno from emp; ? --查詢員工的職位 ? select distinct job from emp; ? --查詢員工的部門編號和職位 distinct對後面的所有欄位都起作用 ? select distinct deptno,job from emp;

--6 排序 order by asc 升序 desc 降序 --查詢員工信息,按照工資從低到高 select * from emp order by sal asc --默認是升序 ? --查詢員工信息,按照工資從高到低 select * from emp order by sal desc --降序

select * from emp order by ename --英文按照字母的順序排列

----查詢員工信息,按照入職日期從早到晚 select * from emp order by hiredate ----查詢員工信息,按照薪資和入職日期排序 當薪資一樣的時候,再按照入職日期升序排序 select * from emp order by sal,hiredate ----查詢員工信息,按照薪資和入職日期排序 當薪資一樣的時候,再按照入職日期降序排序 select * from emp order by sal asc ,hiredate desc --使用欄位別名排序 --查詢員工的姓名,職位,年薪,按照年薪降序排列 select ename as 姓名,job as 職位,sal*12 as 年薪 from emp order by 年薪 desc

--7 where 查詢子句:限定查詢條件 --查詢員工編號是7788的員工 select * from emp where empno = 7788; ----查詢員工姓名是james的員工

--注意:大小寫的區分 --1:關鍵字不區分 --2:表名、欄位名不區分 --3:數據內容區分 --注意:運算符號 = 代表等於,不是賦值 --注意:字元串和日期值要用單引號擴起來 SELECT * FROM EMP WHERE ENAME = JAMES; --查詢入職日期是1981/12/3的員工 select * from emp where hiredate = 1981/12/3 --錯誤 select * from emp where hiredate = 03-12月-1981 --正確

--查詢工資小於2500的員工 select * from emp where sal<=2500 --查詢編號大於7788的 select * from emp where empno>=7788 --查詢編號不是7788的 select * from emp where empno!=7788 select * from emp where empno<>7788 --查詢員工工資在1500到3000之間的 select * from emp where sal>=1500 and sal<=3000 select * from emp where sal between 1500 and 3000 --包含1500和3000 --查詢員工工資在小於1500或者大於3000的 select * from emp where sal<=1500 or sal>=3000 ----查詢員工工資是3000,並且職位是CLERK的員工 select * from emp where sal = 3000 and job = CLERK ----查詢員工工資是3000,或者職位是CLERK的員工 select * from emp where sal = 3000 or job = CLERK --查詢員工的職位是CLERK或者MANAGER或者SALESMAN select * from emp where job = CLERK or job = MANAGER or job = SALESMAN select * from emp where job in(CLERK,MANAGER,SALESMAN)

--一個欄位不能多次使用and select * from emp where job = CLERK and job = MANAGER

--查詢上級領導編號為空的員工信息 select * from emp where mgr is null --查詢上級領導編號不為空的員工信息 select * from emp where mgr is not null

3.sqlwhere子句和通配符

-- 1 where 子句中 的like用法

--通配符 % 表示 0-n (佔位符) --通配符 _ 表示 1個 --查詢員工表中首字母說S的 select * from emp where ename like S%; --查詢員工表中尾字母說T的 select * from emp where ename like %T --查詢員工表中姓名帶S的 select * from emp where ename like %S%; --查詢員工表中第二位字母帶C select * from emp where ename like _C%; --查詢員工表中第4位字母帶T select * from emp where ename like ___T%;

--查詢員工表中姓名帶 select * from emp where ename like % %; --查詢員工表中姓名帶_ 轉義字元 select * from emp where ename like %_% escape ;

SELECT * FROM EMP FOR UPDATE

--2 sql小優化 --查詢工資大於1000並且部門編號為10的員信息 --優化1:AND: 把檢索結果較少的條件放到前面 select * from emp where deptno = 10 and sal > 1000 --效率高 select * from emp where sal > 1000 and deptno = 10 --效率低

--查詢部門編號為10或者工資大於1000的員信息 ? --優化2 OR: 把檢索結果較多的條件放到前面 ? select * from emp where sal>1000 or deptno = 10 --效率高 ? select * from emp where deptno = 10 or sal>1000 --效率低 ?

--3 運算符

-- 算術 > 連接 > 比較 > 邏輯

--查詢職位不是 MANAGER 和 CLERK select * from emp where JOB<>MANAGER and JOB<>CLERK select * from emp where job not in (MANAGER,CLERK)

--查詢職位是CLERK並且工資大於1280 或者 職位是SALESMAN and優先順序大於or select * from emp where job=SALESMAN or job=CLERK and sal>=1280; --可使用小括弧強行改變運算順序 select * from emp where job=SALESMAN or (job=CLERK and sal>=1280);

4單行函數和多行函數

--函數的用法 --Oracle將函數分為單行函數和多行函數

單行函數

字元函數,數值函數 日期函數 轉換函數 統配函數 */ --偽表 --1字元函數 ? select 10+6 from dual; ? select sysdate from dual; ? select initcap(hello) from dual; ?

select * from emp for update;
--查詢員工表的信息,並且將首字母大寫
select initcap(ename) from emp;

select lower(ename) from emp; --全小寫
select upper(ename) from emp; ---全大小

select rtrim(abc你好嗎abc,abc)from dual;
select ltrim(abc你好嗎abc,abc)from dual;
--截取字元串 從原始字元串的第三位開始
select substr(abcde,3,2)frpm dual;

--拼接字元串
select 你好|| 20 from dual;
--comncat只能一次性拼接2個字元
select concat(你好,20) from dual;

--2數值函數 ? select abs(-100) from dual; --絕對值 ? select ceil(44.123)from dual;--向上取整 ? select floor(44.123)from dual;--向下取整 ? select power(10,3)from dual;--求n的m次冪 ? select mod(10,3)from dual;--求餘數 注意:%不是求餘數 ? select round(100.12345,2)from dual; --求餘數並保留2位小數 ? select trunc(100.12345,2)from dual; --求餘數並截取2位小數 ?

? --3日期函數 ? select sysdate from dual;--獲取當前系統時間 ? select sysdate as 當前日期,add_months(sysdate,3)as "3個月後" from dual; --獲取日期前後日期 ? select sysdate as 當前日期,add_months(sysdate,-1)as "一個月前" from dual; ? select months_between(sysdate,3-6月-1994) from dual; --獲取2個日期之間的月總和 ? --4轉換函數 --注意:數據轉換分為自動轉換和強制轉換 ? select 10+10.123 from dual; --整數轉為小數 ? select 10+10.123 from dual; --字元轉為數字:注意:字元應該為數字字元 ? select a+10.123 from dual; ----錯誤 ? select 10||10.123 from dual; --拼接 ? ? --常用轉換類型函數 ? --to_char 是數字和日期之間轉換的橋樑,to_char可以和數字,日期相互轉換 ? select to_char(100) from dual; --將數字轉為字元 ? select to_number(100) from dual; --將字元100轉為數字100 ? select to_Date(10-1月-1999) from dual; ? ? --將字元串轉化為日期,按照自定義日期 ? select to_date(1999-12-12,YYYY-MM-DD) from dual; ? select to_char(sysdate,YYYY-MM-DD HH24:MI:SS AM DY)as 日期信息 from dual;

--5其他函數 ? NAL(EXP1,EXP2) 如果exp1的值為null,則返回exp1的值,否則為表達式2 ? --查詢員工編號姓名工資 獎金 薪資 ? select empno 編號,ename 姓名,sal 工資,comm 獎金,sal+comm 薪金 from emp; --錯誤 ? select empno 編號,ename 姓名,sal 工資,comm 獎金,sal+NVL(comm,0)薪金 from emp; --正確 ?

? --DECODE(VALUE,IF1,THEN1,IF2,THEN2,……,ELSE) 如果value的值為if1,則返回then1的值,如果value的值為if2,則返回then2的值,……,否則返回else值 ? select empno 編號,ename 姓名,sal 工資,comm 獎金,NVL2(comm,sal+comm,sal)薪金 from emp; --正確 ? select 800+null 傻逼 from dual; ?

? --查詢員工信息 ? /如果職位為CLERK 則按照普通員工顯示 ? 如果職位為SALESMAN 則按照銷售顯示 ? 如果職位為MANAGER 則按照經理顯示 ? 如果職位為ANALYST 則按照分析師顯示 ? 如果職位為PRESIDENT 則按照董事長顯示/ ? select empno 編號,ename 名稱,sal 工資, ? decode(job,CLERK,普通員工,SALESMAN,銷售,MANAGER,經理,ANALYST,分析師,董事長) ? from emp;

多行函數

--對一組數據進行原酸,針對一組數據只返回一個結果,也稱聚合函數 --分類 / 求最大值 max 任何數據類型 求最小值 min 任何數據類型 求總和 sum 數字類型 求平均值 avg 數字類型 求次數 count 任何數據類型 /

--1求公司最高薪資 select max(sal) from emp; --1求公司最低薪資 select min(sal) from emp; --1求公司工資總和 select sum(sal) from emp; --1求公司平均工資 select round(avg(sal),1) from emp; --1求公司總人數統計的時候只統計有值得行 select count(sal) from emp; select count(*) from emp;

--求公司的最高薪資,最低薪資,薪資總和,平均薪資,人數 select max(sal) 最高工資,min(sal) 最低工資,sum(sal) 薪資總和,avg(sal) 平均薪資,count(*) 人數 from emp;

--統計公司的部門有幾個 需要先去重 再統計 select count(distinct deptno) from emp;

select count(comm) from emp; --錯誤 select count(nvl(comm,0)) from emp; select count(*) from emp;

5;group by 語句

--group by字句 分組字句 --注意:聚合函數和分組語句搭配使用 --注意:select語句中如果出現了聚合函數,單獨的列是不允許和聚合函數混合使用的,除非這個列是分組列 --注意:分組可以按照多列分組,如果第一列出現相等情況,再按照後面列分組 --注意:聚合函數不允許出現在where子句中 --適用場合:當多行數據中有重複的時候,需要分組統計

--公司最高工資的員工 --分組函數不能和列匹配 select max(sal)from emp; --統計每個部門的最高工資 --1先按照部門的編號將公司分為3組 --2在對每個分組後的部門求最大值 select deptno as 部門編號,max(sal) 最高工資 from emp group by deptno; --求公司的員工人數 select count() from emp; ? --求每個部門員工的人數 ? select deptno as 部門編號,count() 部門人數 from emp group by deptno; ? --求每個職位的人數 ? select job 職位,count() 人數 from emp group by job; ? --求每個職位的人數 最高工資 最低工資 平均工資 工資總和 ? select ? job 職位,count() 人數 ,max(sal) 最高工資,min(sal) 最低工資,avg(sal) 平均工資,sum(sal) 工資總和 ? from emp ? group by job; ?

select deptno 部門,job 職位 from emp group by deptno,job;

--統計員工人數大於3人的部門

--having:分組之後的條件語句

--having:支持所有where操作符

--求每個部門的員工人數

select deptno as 部門編號,count(*) 部門人數

from emp

group by deptno

--where count(*)>3;---------------------------------------------錯誤

having count(*)>3;

--查詢 來自 分組前篩選的條件 分組 分組後篩選的條件 排序

--select-->from-->where--------->group by---->having-------->order by

--統計每個部門的平均工資大於3000的部門

select deptno 部門編號,round(avg(sal),1)平均工資

from emp

group by deptno

having avg(sal)>=2000;


select job,max(sal)

from emp

where sal>2000

group by job;

select job,max(sal)

from emp

group by job

where sal>3000; ---------------------錯誤

--統計部門編號是10或者20的每個部門職位的人數大於2的部門,按照人數從小大大排序

select deptno 部門編號,job 職位,count(*) 人數

from emp

where deptno in(10,20)

group by deptno,job

having count(*)>=2

order by 人數;

--執行過程:from--where --group by--hanving --select--orderby

/*where:過濾表中數據的條件

group by:如何將上面過濾出的數據分組

having:對上面已經分組的數據進行過濾的條件

select:查看結果集中的哪個列,或列的計算結果

order by :按照什麼樣的順序來查看返回的數據 */

--在emp表中,列出工資最小值小於2000的職位

select job 職位,min(sal) 最低工資

from emp

group by job

having min(sal)<2000

--列出平均工資大於1200元的部門和工作搭配組合

select deptno 部門編號,job 職位,avg(sal) 平均工資

from emp

group by deptno,job

having avg(sal)>1200

order by 平均工資;

--統計人數小於4的部門 平均工資

select deptno 部門編號,avg(sal) 平均工資,count(*)人數

from emp

group by deptno

having count(*)<4;

--統計個部門的最高工資,排除最高工資小於3000的部門

select deptno 部門編號,max(sal)

from emp

group by deptno

having max(sal)>3000;

6DML語句

--DML 語句 insert語句 插入數據

--注意:DML語句操作完成後需要提交數據,否則只在本窗口有效 --注意:DML語句,操作完成後點擊回滾,name表的結果集會回到操作之前

--1一種是記錄值的插入,一次操作插入一行數據 ? insert into 表名 value(v1,v2,v3......) ? --向emp表插入一條數據 需要將所有列寫滿 ? select * from emp; ? insert into emp values(9999,張三,CLERK,7902,01-2月-1999,2000,null,20); ? insert into emp values(8888,李四,SALESMAN,7698,to_date(1999-12-12,YYYY-MM-DD),2000,null,20); ? --插入之後要提交 ? --向emp表中插入一條數據,插入編號,姓名,薪資 ? insert into emp(empno,ename,sal)values(7777,王五,5000); ? select * from emp; ?

--2一種是結果的插入 --注意:查詢結果集需要和插入的表數據結構一致 -- sqlplus /scott Dys199463/ select * from emp

--創建一張臨時表 create table temps as select * from emp where 1!=1;

--向temp中插入數據 insert into temp select * from emp where ename=SCOTT; select * from temp; insert into temp(empno,ename,sal); select empno,ename,sal from emp where ename=JAMES; insert into temp select * from dept; ----沒有足夠的值,錯誤 select * from dept;

--DMl update語句 修改語句

--update 標名 set 需要修改的列=需要修改的值 修改之後需要提交 --將temp表中員工編號為9999的員工工資改為10000 update temp set sal=10000 where empno=9999; select * from temp;

--將temp表中員工姓名為張三的員工工資改為5000,職位改為SALEMAN UPDATE temp set sal=5000,job=SALEMAN WHERE ENAME=張三

--DML delete語句 刪除語句

--delete 表名 where 條件 --刪除張三這個員工 --刪除指定條件數據 delete temp where ename=張三; --刪除所有數據 delete temp; delete from temp; delete * from temp; truncate table temp; --delete和truncate都是刪除 --區別 --delete後面可以跟whewe 字句,truncate沒有 --2:delete效率低於truncate --3:delete會產生日誌記錄,trancate不會產生

6多表聯合查詢

--多表聯合查詢

--sql92 --sql99

select * from emp; select * from dept;

--sql92

-- 1 sql92 笛卡爾積 左錶行數*右錶行數 瞭解 select * from emp,dept

-- 2 sql92 等值連接 重點掌握

select * from emp,dept where emp.deptno = dept.deptno --匹配條件

--查詢員工編號,姓名,工資,部門名稱 select empno,ename,sal,dname from emp,dept where emp.deptno = dept.deptno --匹配條件

--查詢員工編號,姓名,工資,部門編號,部門名稱 select empno,ename,sal,e.deptno,dname from emp e,dept d --表也起別名 where e.deptno = d.deptno

--查詢部門為10的員工編號,姓名,工資,部門編號,部門名稱 select empno,ename,sal,e.deptno,dname from emp e,dept d --表也起別名 where e.deptno = d.deptno --匹配條件 and d.deptno = 10 --篩選條件

select empno,ename,sal,e.deptno,dname from emp e,dept d --表也起別名 where d.deptno = 10 --篩選條件 and e.deptno = d.deptno --匹配條件

--查詢員工的所有信息,以及部門名稱 select e.*,dname from emp e,dept d where e.deptno = d.deptno --匹配條件

--查詢職位不是SALESMAN 的每個部門的員工人數,以及部門名稱,人數需要小於3人 select dname 部門名稱,count() 部門人數 from emp e,dept d where e.deptno = d.deptno --匹配條件 and job not in(SALESMAN) group by dname having count()<3

-- 3:非等值連接 --查詢員工的工資等級 員工編號,姓名,工資,等級

select empno,ename,sal,grade from emp e,salgrade s where e.sal>= s.losal and e.sal<=s.hisal

--查詢SCOTT的工資等級 員工編號,姓名,工資,等級 ? select empno,ename,sal,grade from emp e,salgrade s where e.sal>= s.losal and e.sal<=s.hisal and ename = SCOTT

--4:外連接 --4.1 左外連接:左外連接顯示左邊表的全部行,和右表的匹配行

--查詢員工編號,姓名,工資,部門編號,部門名稱 select empno,ename,sal,e.deptno,dname from emp e,dept d where e.deptno = d.deptno(+)

--4.2 右外連接:右外連接顯示右邊表的全部行,和左表的匹配行 select empno,ename,sal,e.deptno,dname from emp e,dept d where e.deptno(+) = d.deptno

--4.3:全外連接:顯示左表和右表的所有行,注sql92 不支持全外連接 sql99支持 select empno,ename,sal,e.deptno,dname from emp e,dept d where e.deptno(+) = d.deptno(+) -- 錯誤

--5:自連接:將1張表看成2張表使用 --查詢每個員工的工號、姓名、經理姓名 select e1.empno 員工編號,e1.ename 員工姓名,NVL(e2.ename,沒有上級) 領導姓名 from emp e1,emp e2 where e1.mgr = e2.empno(+)

3表聯合查詢

create table emp1 as select * from emp; --部門表

select * from dept1 insert into dept1 values(10,財務部,1); insert into dept1 values(20,市場部,2); insert into dept1 values(30,銷售部,3); insert into dept1 values(40,生產部,4); --城市表 select *from city insert into city values(1,北京); insert into city values(2,上海); insert into city values(3,廣州); insert into city values(4,武漢);

--查詢員工的信息 員工編號,姓名,薪資,部門名稱,所在城市 select empno,ename,sal,dname,cname from emp1 e,dept1 d,city c where e.deptno = d.deptno and d.cno = c.cno --連接條件 and cname = 北京 --篩選條件

---sql99多表聯合查詢

--查詢部門名稱為ACCOUNTING 的員工信息

select ename,job,sal,dname from emp e,dept d where e.deptno = d.deptno --連接條件 and dname = ACCOUNTING --篩選條件

-- 1:交叉連接 等同於 sql92的笛卡爾積 select * from emp,dept --sql92 select * from emp cross join dept -- sql99

--2:自然連接 Natural join --查詢部門編號為10的員工信息(員工名字,薪資,部門名稱) / Natural join基於兩個表中的全部同名列建立等值連接 從兩個表中選出同名列的值均對應相等的所有行 如果兩個表中同名列的數據類型不同,則出錯 不允許在同名列上使用表名或者別名作為前綴 自然連接的結果不保留重複的屬性 / ? select ename,sal,dname ? from emp e,dept d ? where e.deptno = d.deptno and d.deptno = 10 --sql92

select e.ename,sal,dname
from emp e Natural join dept d
where deptno = 10 --sql99

select *
from emp e Natural join dept d

select * from emp e,dept d
where e.deptno = d.deptno
where deptno = 10

-- 3:Using子句

/ 如果不希望參照被連接表的所有同名列進行等值連接,自然連接將無法滿足要求, 可以在連接時使用USING子句來設置用於等值連接的列(參照列)名。 using子句引用的列在sql任何地方不能使用表名或者別名做前綴 / select * from emp e Natural join dept d --無法滿足匹配條件

select * from emp join dept using(deptno) --using 指定等值連接的欄位

-- 4 on子句 --查詢職位是MANAGER,部門編號是10 的員工信息和部門信息

select empno,ename,job,d.deptno,dname from emp e,dept d where e.deptno = d.deptno --連接條件 and job = MANAGER and d.deptno = 10 --篩選條件 --sql92

select empno,ename,job,d.deptno,dname from emp e join dept d --員工表連接部門表 on e.deptno = d.deptno --連接條件 where job = MANAGER and d.deptno = 10 --篩選條件 --sql99

--查詢職位是MANAGER,部門編號是10 的員工編號,姓名,薪資,部門名稱,所在城市 select empno,ename,sal,dname,cname from emp1 e,dept1 d,city c where e.deptno = d.deptno and d.cno = c.cno --連接條件 and job = MANAGER and d.deptno = 10 --篩選條件 --sql92

select empno,ename,sal,dname,cname from emp1 e join dept1 d on e.deptno = d.deptno --join一次 on一次 join city c on d.cno = c.cno --join一次 on一次 where job = MANAGER and d.deptno = 10 --篩選條件

-- 5:外連接 --5.1 左外連接 --5.2 右外連接 --5.3 全外連接

--查詢所有部門的員工信息 員工編號,姓名,部門名稱

--使用左外連接 select empno,ename,dname from emp e,dept d where e.deptno(+) = d.deptno --sql92

select empno,ename,dname from dept d left join emp e on e.deptno = d.deptno --sql99

--查詢所有的員工信息 員工編號,姓名,部門名稱

select empno,ename,dname from emp e,dept d where e.deptno = d.deptno(+) --sql92

select empno,ename,dname from dept d right join emp e on e.deptno = d.deptno --sql99

--查詢所有的部門和員工信息 員工編號,姓名,部門名稱 select empno,ename,dname from dept d full join emp e on e.deptno = d.deptno --sql99

子查詢

--問題引入 --如何查得所有比『CLARK』工資高的員工的信息 --分析 --1:先查詢CLARK的工資 select sal from emp where ename = CLARK --2:查詢表中所有人的工資,和CLARK的工資做大於比較 select sal from emp

--先查詢裡面(子查詢)的,後查詢外面(主查詢)的 --語法規則 / select 欄位 from 表名 where 條件欄位 操作符 (子查詢)/ select sal from emp where sal > (select sal from emp where ename = CLARK)

select sal from emp where (select sal from emp where ename = CLARK)< sal

--思考:查詢工資高於平均工資的僱員名字和工資。 select ename,sal from emp where sal>(select avg(sal) from emp)

--思考:查詢和SCOTT同一部門且比他工資低的僱員名字和工資。 select ename,sal from emp where deptno = (select deptno from emp where ename = SCOTT) --同一個部門 ? and sal<(select sal from emp where ename = SCOTT) --工資比SCOTT低的員工

select ename,sal from emp where deptno = 20 and sal<3000

select * from emp where job (select distinct job from emp)

--查詢工資最高的僱員名字和工資。 select ename,sal from emp where sal = (select max(sal) from emp)

--查詢職務和SCOTT相同,比SCOTT僱傭時間早的僱員信息 select * from emp where job = (select job from emp where ename = SCOTT) and hiredate<(select hiredate from emp where ename = SCOTT)

--查詢工資比SCOTT高或者僱傭時間比SCOTT早的僱員的編號和名字

select empno,ename from emp where sal>(select sal from emp where ename = SCOTT) or hiredate<(select hiredate from emp where ename = SCOTT)

--子查詢 多行子查詢:查詢結果有多條記錄

/ ALL 和子查詢返回的所有值比較 ANY 和子查詢返回的任意一個值比較 IN 等於列表中的任何一個 /

--查詢工資低於任何一個「CLERK」的工資的僱員信息。 --查詢職位是CLERK的工資

--低於最低工資 select empno,ename,sal,job from emp where sal< all(select sal from emp where job = CLERK)

select empno,ename,sal,job from emp where sal<(select min(sal) from emp where job = CLERK)

--查詢工資比所有的「SALESMAN」都高的僱員的編號、名字和工資。

select empno,ename,job,sal from emp where sal> all(select sal from emp where job = SALESMAN)

select empno,ename,job,sal from emp where sal>(select max(sal) from emp where job = SALESMAN)

--查詢部門20中職務同部門10的僱員一樣的僱員信息。

select ename,job,deptno from emp where job in(select job from emp where deptno = 10) and deptno = 20

select ename,job,deptno from emp where (job =MANAGER or job = PRESIDENT or job =CLERK) and deptno = 20

--查詢在僱員中有哪些人是經理人 select * from emp where empno in(select distinct mgr from emp);

--找出部門編號為20的所有員工中收入最高的職員 --單行子查詢 select * from emp where sal = (select max(sal) from emp where deptno = 20);

--多行子查詢 select * from emp where sal >=all (select sal from emp where deptno = 20) and deptno = 20

--查詢每個部門平均薪水的等級 部門編號,部門平均薪水,等級 --注意:子查詢可以放在from的後面,當做一個臨時的結果集表

select * from salgrade s,(select deptno,avg(sal) as 平均薪水 from emp group by deptno) t where t.平均薪水>=s.losal and t.平均薪水<=s.hisal

--查詢每個部門平均薪水的等級 部門編號,部門名稱,部門平均薪水,等級 select * from salgrade s, (select deptno,avg(sal) as 平均薪水 from emp group by deptno) t, dept d where d.deptno = t.deptno and t.平均薪水>=s.losal and t.平均薪水<=s.hisal

7資料庫的常用對象

-1資料庫的常用對象user

--庫--->包含多個用戶-->每個用戶可以創建多張表

--3個用戶 --用戶1--3張表 --用戶2--4張表 --用戶3--5張表

--超級管理員用戶--sys --普通管理員用戶--system --普通用戶--管理自己

--創建用戶 -- create user 用戶名 identified by 密碼 ? create user sxt identified by t1234 --授權 (授予角色,授予許可權) -- grant 角色名 to 用戶名 ? grant connect to sxt ? grant RESOURCE to sxt ? grant dba to sxt --角色:許可權的集合 直接授予角色,一個角色包含多個許可權 --CONNECT:臨時用戶 --RESOURCE:更為可靠和正式的用戶 -- DBA:資料庫管理員角色,擁有管理資料庫的最高許可權 --撤銷許可權 --revoke 角色名 from 用戶名 revoke connect from sxt; revoke dba from sxt;

-2資料庫的常用對象table

-用戶可以跨戶訪問嗎? --1:普通用戶之間不可以相互訪問 --2:管理員用戶可以訪問普通用戶的數據表 select * from 用戶名.表名; ?

select * from scott.emp;

--創建表 --建立一張用來存儲學生信息的表 --欄位包含學號、姓名、性別,年齡、入學日期、班級,email等信息

create table 表名( 欄位1 數據類型, 欄位2 數據類型, 欄位3 數據類型 .... )

create table student( sid number(3), sname varchar2(10), sex varchar2(6), age number(3), enterdate date, clazz varchar2(20), email varchar2(30) )

--刪除表 drop table student;

---查詢表 select * from student; --插入數據 insert into student values(101,張三,男,20,to_date(2018-09-01,YYYY-MM-DD),JAVA0221,[email protected]); insert into student values(101,李四,女,18,to_date(2018-09-01,YYYY-MM-DD),JAVA0221,[email protected]); insert into student values(102,null,女,18,to_date(2018-09-01,YYYY-MM-DD),JAVA0221,[email protected]); insert into student values(null,null,女,18,to_date(2018-09-01,YYYY-MM-DD),JAVA0221,[email protected]); insert into student values(103,王五,你,18,to_date(2018-09-01,YYYY-MM-DD),JAVA0221,[email protected]); insert into student values(104,王五,你,-200,to_date(2018-09-01,YYYY-MM-DD),JAVA0221,[email protected]); --提交 commit;

3oracle的5大約束

--問題1:學號重複且為空 primary key --問題2:名字為空了 not null --問題3:郵箱重複 unique --問題4:性別只能為男 or 女 check --問題5:年齡超出正常範圍 18-30 check

--如何解決上述問題,oracle提供了5大約束條件,來限制表的創建

-- 1:主鍵約束 唯一+非空 primary key ? --注意:一個表只能有1個主鍵,但是一個主鍵可以有多個欄位,稱為聯合主鍵 -- 2:非空約束 not null -- 3:唯一約束 unique 唯一 -- 4:檢查約束 check約束 -- 5:外鍵約束 foreign key --分為2種 --5.1 欄位級約束 references 關聯的表名(欄位名) --5.2 表記約束 constrants 約束名 foreign key(欄位名) references 關聯的表名(欄位名) --主表和子表 --舉例:班級表和學生表 ? -- 班級是主表,學生是子表 ? -- 創建表的時候,先創建主表,後創建子表

? --刪除主表記錄之前,必須先把子表的記錄刪光 ? --刪除主表之前,必須先把子表的刪掉 ? --一個可以有多個外鍵 ? ? --外鍵關聯3種情況 ? --1:RESTRICT方式:只有當依賴表中沒有一個外鍵值與要刪除的主表中主鍵值相對應時,纔可執行刪除操作。 ? --2:CASCADE方式:將依賴表中所有外鍵值與主表中要刪除的主鍵值相對應的記錄一起刪除 ? --3:SET NULL方式:將依賴表中所有與主表中被刪除的主鍵值相對應的外鍵值設為空值 重點掌握

--問題:約束加上後,添加數據的時候,約束的名稱沒有明確(哪一個欄位的約束出錯,不明確)

--約束分2中 --1:欄位級約束:直接把約束寫在每個欄位的後面,不能給約束起名,只能通過系統給名 --2:表記約束:在所有欄位下面寫約束,可以自定義約束名 --注意:not null只能是欄位級約束 --注意:默認值

--刪除表 drop table student --創建表 把約束加上 create table student( sid number(3), --primary key, -- 主鍵 sname varchar2(10) not null, --非空 sex varchar2(6) default 男,--check(sex = 男 or sex = 女), -- 檢查 age number(3), --check(age>=18 and age < = 30), --檢查 enterdate date, email varchar2(30),--unique, --唯一 cid number(3), --references clazz(cid), -- 外鍵約束 欄位級約束 ,沒有自定義名稱

--在所有的欄位後面給約束起名 constraints pk_student_id primary key(sid), constraints ck_student_sex check(sex = 男 or sex = 女), constraints ck_student_age check(age>=18 and age < = 30), constraints uk_student_email unique(email), constraints fk_clazz_cid foreign key(cid) references clazz(cid) on delete set null --on delete cascade -- 級聯刪除 )

insert into student values(101,張三,男,20,to_date(2018-09-01,YYYY-MM-DD),[email protected],1); insert into student values(102,李四,女,18,to_date(2018-09-01,YYYY-MM-DD),[email protected],1); insert into student values(103,王五,女,18,to_date(2018-09-01,YYYY-MM-DD),[email protected],1); insert into student values(104,趙六,null,18,to_date(2018-09-01,YYYY-MM-DD),[email protected],2); insert into student values(105,寶強,default,25,to_date(2018-09-01,YYYY-MM-DD),[email protected],3);

insert into student values(106,宋喆,男,25,to_date(2018-09-01,YYYY-MM-DD),[email protected],4);

insert into student(sid,sname,age,enterdate,clazz,email) values(106,馬蓉,25,to_date(2018-09-01,YYYY-MM-DD),JAVA0221,[email protected])

--查詢student select * from student;

--創建一個班級表 create table clazz(

cid number(3), cname varchar2(50) not null,

constraints pk_clazz_cid primary key(cid), constraints uk_clazz_cname unique(cname) )

--插入數據 insert into clazz values(1,java0816); insert into clazz values(2,java1009); insert into clazz values(3,java1219); insert into clazz values(4,java0221);

select * from clazz select * from student --刪除學號為101的學生 delete from student where sid = 101 --刪除班級編號為1的班級 delete from clazz where cid = 1; --將班級編號為1的學生全部刪除 delete from student where cid = 1

drop table clazz

8oracle的數據類型

--日期時間數據類型 --DATE:存儲日期和時間數據 --TIMESTAMP:比DATE更精確

--LOB數據類型 --BLOB:存儲二進位對象,如圖像、音頻和視頻文件 --CLOB:存儲字元格式的大型對象

create table temp( a char(12), b varchar2(12), c nvarchar2(10), d number(7,2), e date, f TIMESTAMP, g blob, h clob ) drop table temp;

insert into temp values(你好,你好,你你好,12311.12,10-1月-2018,10-1月-2018 10:23:12,010101011110101,asdasdasdasd)

select * from temp;

9數據表的操作

--修改表 --在基本表建立並使用一段時間後,可以根據實際需要對基本表的結構進行修改

--添加一列 性別

create table temp1( id varchar2(10), name varchar2(10) ) insert into temp1 values(101,張三); insert into temp1 values(102,李四); --添加一列 alter table 表名 add 欄位名 數據類型 alter table temp1 add sex varchar2(10); --添加多列 alter table 表名 add(欄位名1 數據類型1,欄位名2 數據類型2...); alter table temp1 add(age number(3),address varchar2(100)) --添加一列約束 alter table temp1 add constraints 約束名 約束類型; alter table temp1 add constraints pk_temp1_id primary key(id); alter table temp1 add constraints uk_temp1_name unique(name); --添加多列約束 alter table temp1 add constraints 約束名 約束類型; --alter table temp1 add constraints(pk_temp1_id primary key(id),uk_temp1_name unique(name));

--注意:新添加的列,不能設置為not null --注意:如果某一列有重複的數據,不能添加主鍵/唯一約束

--刪除一列 alter table 表名 drop column 列名 alter table temp1 drop column sex; alter table temp1 drop column name; --刪除多列 alter table 表名 drop(列名1,列名2...) alter table temp1 drop(age,address); --刪除一列約束 alter table 表名 drop constraints 約束名 alter table temp1 drop constraints pk_temp1_id --刪除多列約束 alter table 表名 drop constraints 約束名 -- alter table temp1 drop constraint(pk_temp1_id,uk_temp1_name);

--修改欄位的名字,類型

--修改一列數據 alter table 表名 modify(要修改的欄位名 數據類型); alter table temp1 modify(id number(5)); --修改多列數據 alter table 表名 modify(要修改的欄位名1 數據類型1,要修改的欄位名2 數據類型2...); alter table temp1 modify(id number(5),name varchar2(20)); select * from temp1;

--刪除表結構 drop table temp1;

--查看錶的結構 pl/sql 不能直接在sql窗口下查看 desc student;

--修改表名稱 rename 舊錶名 to 新表名 rename temp to temp1;

10oracle常用對象 序列 sequence

--oracle的專有對象,可以對某一個列做自增或者自減操作

--創建一個臨時表

create table temp( id number(3), name varchar2(20), sex varchar2(10), constraints pk_temp_id primary key(id) )

--為了插入數據的時候,保證數據的唯一性,避免寫入重複的id,可以給id這一列添加一個自增的序列

drop table temp; insert into temp values(seq_temp_id.nextval,張三,男);

select seq_temp_id.nextval from dual; select seq_temp_id.currval from dual; select * from temp; --序列的使用

--序列名.nextval 下一個值 --序列名.currval 當前值 --注意:使用序列,需要先序列名.nextval,後序列名.currval --創建一個自增長的序列,用於temp表的id這一列 create sequence seq_temp_id start with 100 --從100開始 increment by 5 --每次自增5

11oracle的常用對象 索引 index

--查詢成績表 --使用索引可以提高查詢效率 --主鍵這一列,會自動加索引 --可以給數據量較多的數據表手動添加索引 --主鍵的索引不能強制刪除 --刪除列之後, 這個列上的索引,自動刪除

--如何創建索引 create index index_student_sname on student(sname)

--查詢數據 select * from student where sname = 李逍遙

select * from sc; select * from sc where sid = 1 and cid = 10 ;

select s.*,rowid from student s;

--根據rowid查找查找數據

select * from student where sid = 2; select * from student where rowid = AAASPrAAEAAAAJvAAA

--通過DROP INDEX 命令刪掉一個索引. drop index index_student_sname; drop index pk_student_sid;

12視圖作用

--1:給複雜的sql查詢語句,封裝一個視圖,下次使用的時候,直接查詢視圖即可 --2:可以給表的查詢做許可權操作 -- 員工表 --編號 姓名 年齡 工資 獎金 部門

--舉例 查詢 李逍遙的所學的java課程,以及代課老師,以及分數

select s.sid,sname,cname,tname,score from student s,sc,course c,teacher t where s.sid = sc.sid and c.cid = sc.cid and t.tid = c.tid --連接條件 and s.sname = 李逍遙 and c.cname = java

--創建視圖 create view view_student as select s.sid,sname,cname,tname,score from student s,sc,course c,teacher t where s.sid = sc.sid and c.cid = sc.cid and t.tid = c.tid --連接條件 and s.sname = 李逍遙 and c.cname = java

--無需給簡單的查詢語句創建視圖 create view view_student1 as select * from student ----舉例 查詢 李逍遙的所學的java課程,以及代課老師,以及分數 select * from view_student

--創建一個員工表 create table emp as select * from scott.emp

--給普通員工創建一個視圖,只能看到員工表一部分數據 create view index_emp1 as select empno,ename,job,mgr from emp; --查詢視圖 select * from index_emp1;

--修改視圖的數據 --刪除編號為9999的員工--從視圖刪除 --修改視圖的同時,原表的數據動態修改 delete from index_emp1 where empno = 9999

--刪除編號為7788的員工--從原表刪除

--注意:對錶和視圖做操作,都會互相影響,實際開發的時候,我們應該將視圖設置為只讀視圖 delete from emp where empno = 7788 select * from emp; select * from index_emp1

--刪除視圖 drop view index_emp1;

--創建視圖 create or replace view view_emp as select * from emp;

--刪除表後,觀察視圖是否存在 --視圖存在,但是不起作用,視圖是基於表而存在的,視圖也是表,不過是一個基於原表的虛擬表 drop table emp; select * from view_emp;

--創建只讀視圖 create or replace view view_emp as select * from emp with read only

select * from view_emp;

delete from view_emp where empno = 9999; insert into view_emp(empno) values(10001)

create table dept as select * from scott.dept --統計各個部門的員工人數,平均工資,最高工資,最低工資

create or replace view view_emp1 as select dname as 部門名稱,count(*) as 員工人數,round(avg(sal),1) as 平均工資,max(sal) as 最高工資,min(sal) as 最低工資 from emp e ,dept d where e.deptno = d.deptno --連接條件 group by dname order by 員工人數;

select * from view_emp1

13oracle常用對象 事務

--事務的概念:事務是一個操作序列,這個序列是有是過程步驟的 --這些過程,要麼都做,要麼都不做,不能出現一半成功,一半失敗的情況 --事務是為了保證資料庫的完整性

--開啟事務 ,一條DML(insert,update,delete)語句,會自動開啟一個事務

select * from student;

--插入一條數據 insert into student values(12,張三,20,男);

--結束事務

--1:手動提交 commit; --2:手動回滾 rollback; --3:正常關閉窗口 自動提交 --4:系統崩潰或斷電時事務自動回退。 --5:執行當執行DDL(Create、Alter、Drop)語句事務自動提交。 create table a( a1 number(3) )

--修改學生編號為1的學生年齡 select * from student; update student set age = 20 where sid = 1

14三大範式

--創建用戶表 --用戶名,家庭地址 create table users( userName varchar2(20), address varchar2(100),

constraints pk_users_username primary key(username) )

insert into users values(sxt1001,湖北省武漢市江夏區廟山新村2街53#102); insert into users values(sxt1002,湖北省襄陽市樊城區廟山新村3街52#103); insert into users values(sxt1003,湖北省武漢市江夏區廟山新村1街54#104);

create table users2( userName varchar2(20), province varchar2(20), city varchar2(20), district varchar2(20), address varchar2(100), constraints pk_users_username1 primary key(username) )

insert into users2 values(sxt1001,湖北省,武漢市,江夏區,廟山新村1街54#104); insert into users2 values(sxt1002,湖北省,襄陽市,江夏區,廟山新村1街54#104); insert into users2 values(sxt1003,湖北省,武漢市,江夏區,廟山新村1街54#104); --統計武漢市的人數

select count(*) from users2 where city = 武漢市;

--資料庫表與表之間關係 -- 1-1 一對一 一個學號對應一個學生 key - value ? -- student ? -- id name age sex address

-- 1-n 一對多 在員工表中,多一列(部門編號,使用員工表的外鍵和部門表的主鍵做連接) ? 1個部門--多個員工 ? 1個班級--多個學生 ? 1個老師--多個學生 -- m-n 多對多 創建一個三方表 ? -- 學生表 主表 ? -- 課程表 主表 ? -- 學生選課表 studentcourse 子表 ? --多對對是有2個一對多組成 ? --學生編號和學生表中學生編號關聯,課程編號和課程表中的課程編號關聯) ? --多個學生--多個課程

--訂單表

商品編號 商品數量 --商品信息表 商品編號 商品名稱 價格 顏色 尺寸 --訂單明細表 商品編號 商品名稱 價格 顏色 尺寸 商品數量

15java連接JDBC

jdbc開發步驟 1:java程序 程序員寫 2:jdbc sun提供 3:驅動 資料庫廠商 4:資料庫 oracle,sql server,mysql

導入ojdbc6.jar包--->在項目新建lib文件夾 複製進去 ----->右鍵build path (user as Souse folder)-->找到oracle.jdbc.driver包下面的oracle.jdbc.driver.OracleDriver.class文件,右鍵copy qualified Name複製路徑全名

用java代碼操作sql語句代碼過程如下

// 1載入驅動
Class.forName("oracle.jdbc.driver.QracleDriver");
// 2獲取連接
Connection conn = DriverManager.getConnection("jdbc:oracle:thin:@127.0.0.1:1521:orcl", "dys", "Dys199463");
// 3獲取變異通道
Statement create = conn.createStatement();
// 4執行sql語句
int num = create.executeUpdate("update users set address=天健龍傲天中學 where userName=sxt1004");
// int num =create.executeUpdate("delete from users whereuserName=sxt1005");
// int num=create.executeUpdate("insert into users Values(sxt1007,南昌市天門大學第一學院)");
// 5判斷是否操作成功
if (num > 0) {
System.out.println("操作成功");
} else {
System.out.println("操作失敗");
}
// 6關閉通道
create.close();
// 7關閉連接
conn.close();

下面是一個註冊的小案例

Sequences添加seq_student_id序列 用於學號自增

public static void main(String[] args) throws ClassNotFoundException, SQLException, ParseException {
//1:載入驅動
Class.forName("oracle.jdbc.driver.OracleDriver");
//2:獲取連接
Connection conn = DriverManager.getConnection("jdbc:oracle:thin:@127.0.0.1:1521:orcl", "whsxt", "t1234");
//3:獲取編譯通道
Statement stmt = conn.createStatement();
//4:執行插入語句
Scanner sc = new Scanner(System.in);
/*System.out.println("請錄入學號");
int id = Integer.parseInt(sc.nextLine());*/
System.out.println("請錄入姓名");
String name = sc.nextLine();
System.out.println("請錄入性別");
String sex = sc.nextLine();
System.out.println("請錄入年齡");
int age = Integer.parseInt(sc.nextLine());
System.out.println("請錄入入學日期 格式 1999-12-12");
String date = sc.nextLine();
//將字元串轉為Date
DateFormat df = new SimpleDateFormat("yyyy-MM-dd");
//轉為java.util.Date
Date enterDate = df.parse(date);
//需要將java.util.Date轉為java.sql.Date
java.sql.Date enterDate2 = new java.sql.Date(enterDate.getTime());

System.out.println("請錄入郵箱");
String email = sc.nextLine();
System.out.println("請錄入愛好");
String hobby = sc.nextLine();

int num = stmt.executeUpdate("insert into student values(seq_id.nextval,"+name+","+sex+","+age+",to_date("+enterDate2+",yyyy-mm-dd),"+email+","+hobby+")");

//int num = stmt.executeUpdate("insert into student values("+id+","+name+","+sex+","+age+",to_date("+enterDate2+",yyyy-mm-dd),"+email+","+hobby+")");
//5:判斷是否註冊成功
if(num>0){
System.out.println("註冊成功");
}else{
System.out.println("註冊失敗");
}

//6:關閉通道
stmt.close();
//7:關閉連接
conn.close();
}

推薦閱讀:

相關文章