前言:本博客花費作者大量時間,轉載請聲明,原文章出自:http://yuemu.blog.51cto.com
一.oracle常用命令
1 show user;
查看登陸用戶
2.conn[ect]
conn system/密碼@orcl conn sys/密碼@orcl as sysdba(sysoper)
切換用戶
3.disc[onnect]
斷開連接。
4.passw[ord] 用戶
以高級用戶重置低級用戶密碼
5.exit
退出數據庫
二.文件操作命令
1.start
調用外部的腳本
在C盤存放了 select * from dept; 的語句,並保存爲dept.sql。
sql>start d:\dept.sql
2.edit
說明:該命令可以編輯指定的腳本。
sql>edit d:\dept.sql
在打開sql腳本文件裏去編輯sql腳本.
3.spool
說明:該命令可以將sqlplus屏幕上的內容輸入到特定的文件裏
sql>spool d:\dept.sql sql>select *from dept; sql>spool off
注意:當spool off 後,方把所有輸入寫入到外部dept.sql裏
4.&
解釋:可以替代變量,變量的值有交互時由用戶輸入
sql>select* from dept DNAME='&DNAME';
sql>根據提示輸入相應的值
三.用戶管理
sys system(管理員)
scott(普通用戶)
1.創建用戶(sys system 用戶)
格式:create user name identified by passwd
sql>create user edu identified by system
注意:創建的edu並不能通過conn立刻登陸,需要進行下面一步
2.賦予用戶相應的權限
grant create session to edu
sql>conn edu/password
則可以登錄
綜合場景
創建一個用戶ware,然給後他分配權限,可以讓ware登陸數據庫,創建表,可以操作自己創建的表。
回收角色。最後刪除用戶
1.使用system創建ware用戶,密碼設置爲system
create user ware identified system;
2.要想讓ware登陸數據庫,需要給其connect,resource權限;
grant connect to ware; grant resource to ware;
3.使用ware用戶登錄.
conn ware/system
4.ware創建一張表.
create table users(id number)insert into users values (1);select * from users;
5.刪除ware用戶
drop user ware [cascade]
注意:當ware擁有自己的數據對象時,加上選項cascade,一併把該用戶擁有數據對象刪除
權限賦予
案例,創建WARE用戶,讓其能夠查看SCOTT用戶的emp表,
1.使用system創建ware用戶,密碼設置爲system
create user ware identified system;
2.要想讓ware登陸數據庫,需要給其connect,resoure權限。
grant connect to waregrant resource to ware
3.使用scott用戶登錄系統
sql>conn scott/passwordsql>grant select on emp to ware;
或
sql>conn system/passwordsql>grant select on scott.emp to ware
4.使用ware登陸
sql>conn ware/systemsql>select* from scott.emp
用戶profile口令管理(限制用戶惡意登陸)
1.可以把profile想象成一個數據對象(文件,規則)
語法格式:sql>create profile 規則名 limit failed_login_attempts 3 password_lock_time 2;
案例:
允許某用戶,最多嘗試登陸3次,如果3次未登錄成功,則鎖定該用戶,鎖定用戶不能登陸系統。
sql>conn system/passwordsql>create profile user1 limit failed_login_attempts 3 password_lock_time 2;sql>alter user scott profile user1;sql>conn scott/xxx@rocl(連續輸錯3次密碼賬號鎖定)
解鎖:
sql>alter user scott account unlock;
用戶profile口令管理(限制密碼的使用期限)
語法:
sql>create profile 規則名 limit password_life_time 10 password_grace_time 2
案例:
對一個賬號的密碼做出限制,最多使用10天,寬限期爲2天,到時候密碼必須更改。
sql>create profile user2 limit password_life_time 10 password_grace_time 2;sql>alter user scott profile user2;
此時修改oracle服務器的時間,往後延遲10天與12天,13天查看使用scott登陸的提示信息。
sql>conn scott/system@orcl;(10天出現還有2天必須改密碼) sql>conn scott/system@orcl;(10天之後提示改密碼)
刪除profile
drop profile 規則名 [cascade];
四.oracle 數據類型
三大類:文本,數值,時間
1.char(size)
存放定長的字符串,最大存放2000個字符。例如char(32),存放32個字符(超出不行,不夠32位,用空格補齊)
sql>create table stu01(name char(32)); sql>insert into stu01 values('qidong'); sql>select * from stu01; sql>select name,dump(name) from stu01;
2.varchar2(size)
解釋:變長,最大可以存放4000個字符。
舉例:
sql>create table stu02(name varchar2(16));sql>insert into stu02 values('leo');sql>select * from stu02;sql>select name,dump(name) from stu02;
總結:比如存放了‘leo’的3個字符,實際存放在數據庫中,就佔用了3個字符,其餘的字符就被回收了。
說明:char好處是查詢與檢索速度較快
3.nchar(size) nvarchar2(size)
說明:n代表的意思編碼格式爲unicode編碼,無論中文或英文都以一個字符來存放數據,
舉例:
比如“a”,佔用是一個字符。
比如“祁”,佔用一個字符。
而char與varchar2裏,則不是。
“a”佔用一個字符。“祁”佔用兩個字符。
原因:
nchar一個空間用兩個字符,而char一個空間就是一個字節。
案例:
sql>create table soft_oracle(name nchar(2));sql>insert into soft_oracle values(‘ab’);
結果正確
sql>insert into soft_oracle values(‘abc’);
結果錯誤
sql>insert into soft_oracle values(‘數據’);
結果正確
4.clob(size)變長
說明:字符型的大對象,最大8TB,
應用場景:如果varchar2不夠用了,使用clob
5.blob(size)變長
說明:二進制數據,可以存放圖片/聲音等, 8tb
但是,實際過程中很少把圖片與聲音放在數據庫裏面
6.number (p,s) 變長
1.number 可以存放整數,可以存放小數。
2.number(p,s)
說明:
p表示有效位,s表示小數位,範圍p[1,38] s[-84,127]
案例1:
number(5,2)
sql>create table test1 (price number(5,2));sql>insert into test1 values (-999.99);
結果:-999.99
sql>insert into test1 values (575.34);
結果:575.34
sql>insert into test1 values (575.345);
結果:575.35
sql>insert into test1 values (1000);
結果失敗,超過範圍,1000整數位超過3 位
案例2:
number(5)==number(5,0)
表示的範圍:-99999~99999
案例3:
123.89 number
結果:123.89
案例4:
123.89 number(3)
結果:124
案例5:
123.89 number(6,2)
結果123.89
案例6:
123.89 number(6,1)
結果:123.9
案例7:
123.89 number(4,2)
結果:報錯,長度超出了有效長度(4)
案例8:
123.89 number(6,-2)
結果:100
總結:
1.實際過程中如果項目明確要求了精確到多少位,number類型裏面應該寫明有效位和小數位,當不明確的時候直接爲number,不標明有效位和小數位
2.number 是變長。
3.p爲有效位(從左邊第一個非0的數值開始)s位小數位。
7.date日期類型
說明:oracle dd-mm-yy
案例:
sql>create table test1(birth date);sql>insert into test('2011-11-11')
結果是錯誤
sql>insert into test1 (01-1月-14');
結果正確
案例:銀行裏建的開卡信息
字段 | 字段類型 |
ID | number |
name | varchar2(64) |
sex | char(2) |
birth | date |
money | number(10,2) |
修改表中字段
Alter
格式:
alter table tablename
add (字段名 字段類型)------------------------------------------- 添加字段
alter table tablename
modify (字段名 字段類型) --------------------------------------修改字段
alter table tablename
drop column 字段名 ---------------------------------------------刪除字段
五.sql基礎語法
insert
注意事項
1.插入的數據應與字段的數據類型相同。
insert into 表名 (字段名1,字段名2) values(數據1,數據2)
sql>insert into test1(id) values(10);
正確
sql>insert into test1(id) values('abc');
錯誤
2.數據的大小應該在列的規定範圍之內
sql>create table tset2(name varchar2(2)); sql>insert into test2(name) values('aabb');
錯誤
3.在values中列出數據位置必須與字段列的數據類型排列相對應
4.字符和日期數據包含''中。
5.插入空值,不指定或null.
update
格式:
update 表名 set 列名=值 where 條件
案例1:
update語法可以用新值更新原有表中的各列:
sql>update stu set sex='女' where id=1;
update語句中,set子句指示要修改哪些列和賦予哪些值
給所有用戶的錢都增長1.2倍
sql>update stu set money=money*1.2 sql>update stu set money=money*1.2 where 1=1
當更新所有的行的時候,where可以省略(where1=1代表所有行都滿足條件)
delete
基礎語法:
delete from 表名 where 條件
注意事項:
1.如果不使用where子句時,將表中所有數據全部刪除。
2. 如果要刪除某列的值,delete是不可以做到
3.刪除整個表的drop 表名。
4.使用delete的時候,一定考慮表之間的參照完整性。
案例:
刪除某一行記錄
sql>delete from stu where name='aaa';
5.truncate table 表名;
sql> truncate table stu;
注意:1.一旦使用了truncate 表中的數據不可恢復。
2.當確定表中的數據沒用時,truncate刪除效率更快
rollback
回滾的使用
sql>savepoint 回滾點名字sql>delete from stu;sql>select * from stu;
無結果
sql>rollback to 回滾點名字sql>select * from stu;
發現刪除的數據又回來了。
六.select語句
基本語法:
select [distinct] *(或字段名) from 表名 where;
1.select 指定查詢哪些列;
2.distinct 去掉重複行;
舉例:
1.查看錶結構
sql>desc 表名;
2.查詢所有列
sql>select * from emp;
3查詢指定列
sql>select ename,sal from emp;
4.取消重複行(所有列數據都一樣)
sql>select distinct deptno,job from emp;
算術表達式
1.使用算術表達式
案例:顯示每個員工的年工資
sql>select ename,sal*12 from emp;
2.給列起別名
sql>select ename as"姓名", sal*12 as"年薪" from emp;sql>select ename "姓名", sal*12 "年薪" from emp;sql>select ename 姓名, sal*12 年薪 from emp;
3如何處理null值
案例:員工1年能掙多少錢
sql>select ename,sal*12+comm*12 from emp;
結果異常,有員工工資爲空。
sql>select ename,sal*12+nvl(comm,0)*12 from emp;
nvl 函數:nvl(comm,0) 如果comm爲空null則返回0,否則返回自身
4.如果鏈接字符串(||)
sql>select ename ||'的薪水是'|| (sal*12+nvl(comm,0)*12) from emp;
七.where子句
如何顯示工資高於3000的員工,
sql>select * from emp where sal>3000;
如何查找1982.1.1後入職的員工
sql>select * from emp where to_char(hiredate,'yyyy-mm-dd')>'1982/1/1';
如何查找1981年後入職的員工
sql>select * from emp where to_char(hiredate,'yyyy')>'1981';
如何顯示工資在2000至2500之間。
sql>select * from emp where sal>=2000 and sal<=2500;
或
sql>select * from emp where sal between 2000 and 2500;
like(模糊查詢)
%表示任意0到多個字符,_表示的是任意單個字符
1.如何顯示首字母爲s的員工的姓名和工資
sql>select ename,sal from emp where ename like 's%'
2.如何顯示第3個字符爲大寫o的員工信息
sql>select ename,sal from emp where ename like '___O%'
in
1.如何顯示empno 7369,7499,7521的僱員信息
sql>select * from emp where empno=7369 or empno=7499 or empno=7521;
或
sql>select * from emp where empno in (7369,7499,7521);
使用is null 的操作符
1.如何顯示沒有上級的僱員信息
sql>select * from emp where mgr is null;
使用邏輯操作符號
1.查詢工資高於500或爲manager的僱員,同時滿足他們的首字母爲大寫J;
sql>select * from emp where (sal>500 or job='manager') and (ename like 'J%');
Order by (排序)
1.如何按照工資的從低到高的順序顯示僱員的信息
sql>select * from emp order by sal[asc];
2.按照部門號升序而僱員入職時間爲降序排列
sql>select * from emp order by deptno,hiredate desc;
使用列的別名
1.
sql>select ename,sal*13 as"年薪" from emp order by "年薪";
2.
select ename,sal*13+nvl(comm,0)*13 as "年薪" from emp;
八.複雜查詢
複雜查詢:複雜查詢就是要顯示多張表的數據;
max\min\avg\sum\count 聚合函數
1.如何顯示所有員工的最高工資和最低工資
sql>select max(sal) from emp; sql>select min(sal) from emp;
2.查詢該公司最大年工資的人
sql>select max(sal*13+nvl(comm,0)*13) "年薪" from emp;
返回值爲65000
注意:如果結果裏面有2人年薪達到65000,max只返回一個,這個是隨機的
3.顯示所有員工的平均工資和工資總和
select avg(sal),sum(sal) from emp;
AVG如果列表值有空,不能統計過來
sql>select avg(comm) from emp;
注意:avg只統計了4個人,實際共14個人
用
select sum(comm)/count(*) from emp; 或select avg(nvl(comm,0)) from emp;
統計多少人有獎金,並算出獎金平均值
sql>select count(comm) from emp;
注意:count統計的是非空的值
其他深度要求
請顯示工資最高的員工的姓名,工作崗位
思路:
1.先查詢工資最高的工資是多少
select max(sal) from emp;
2.在查詢等於max(sal)
select ename,job from emp where sal=( select max(sal) from emp;);
3.請顯示工資高於平均工資的員工信息
sql>select ename,job,sal from emp where sal>(select avg(sal) from emp);
group by 和 having 子句
group by :用於對查詢的結果進行分組統計
having:和where 差不多,在group by 中使用。
如何顯示每個部門的平均工資和最高工資
1.先分組(使用group by)
group by depnto
2,在分組結果上進行篩選。
sql>select depnto,avg(sal),max(sal) from emp group by depnto;
顯示每個部門的每種崗位的平均工資和最低工資
sql>select deptno,avg(sal),max(sal) from emp group by deptno,job;
①.顯示部門平均工資低於2000的部門號和它的平均工資;
思路:確定子查詢
1.查詢各個部門平均工資;
2.在1的執行結果裏,挑選出低於2000的
sql>select deptno,avg(sal) from emp group by deptno having avg(sal)<2000;
九.多表查詢
需求:實際過程中經常使用多表聯合查詢
1.顯示僱員的名字,工資及所在部門的名字。
sql>select emp.ename,emp.sal,dept.deptno from emp,dept where emp.deptno=dept.deptno;
注意:當使用多表聯合查詢時,如果不帶任何條件(where)會出現笛卡爾積
規定:多表查詢的條件(where)是至少不能少於表的個數-1
2.如何顯示部門號爲10的部門名稱,員工名和工資
sql>select emp.ename,emp.sal,dept.dname from emp,dept where emp.deptno=dept.deptno and dept.deptno=10;
3.顯示各個員工的名字,工資,及工資的級別
sql>select ename,sal,grade from emp,salgrade where emp.sal between losal and hisal;
4.擴展
顯示僱員名稱,僱員的工資及 所在部門的名字,並按部門排序
select ename,sal,dept.name from dept,emp where dept.deptno=emp.deptno order by dept.dname;
自身連接
顯示員工的上級姓名
比如:顯示'SMITH'的上級
sql>select ename from emp empno=( select mgr from emp where ename='SMITH');
擴展要求:
顯示各個員工的姓名和他的上級領導的名字
sql>select a.ename,b.ename from emp a,emp b where a.mgr=b.empno;
以上結果,發現沒有king(因爲king沒有上級)如果讓king出現,使用左連接或右連接。
十.子查詢
定義:子查詢是指嵌入在其它sql語句中的select語句,嵌套查詢:
單行子查詢:
是指只返回一行數據的子查詢語句
如何顯示與SMITH同一部門 的員工
1.先查詢SMITH在哪個部門
sql>select deptno from emp where ename='SMITH'
2.在查詢該部門的所有員工
sql>select * from emp where deptno=(sql>select deptno from emp where ename='SMITH');
如果不顯示SMITH
sql>select * from emp where deptno=(sql>select deptno from emp where ename='SMITH') and ename!='SMITH';
多行子查詢
是指返回多行數據的子查詢:
如何查詢和部門號爲10員工所參加的工作崗位相同工作崗位的僱員的名字,崗位,工資,部門號。
1.查詢出10號部門有哪些工作崗位
sql>select job from emp where deptno=10;
2.顯示和10號部門從事崗位的僱員信息
sql>select * from emp where job in (sql>select job from emp where deptno=10);
ALL
如何顯示工資比30號部門最高工資高的員工信息
1.查詢30號部門工資最高
sql>select max(sal) from emp where deptno=30;
2.查詢比30號最高工資還高僱員的信息
select * from emp where sal>(sql>select max(sal) from emp where deptno=30);
或
select * from emp where sal > all(select sal from emp where deptno=30);
ANY
如何顯示工資比30號部門最低工資低
的員工信息
select * from emp where sal >any(select sal frpm emp where deptno=30)
多列子查詢
如何查詢與SMITH的部門和崗位完全相同的所有僱員信息。
1.查詢SMITH所在部門和所從事的工作崗位
sql>select job,deptno from emp where ename='SMITH'
2.查詢與SMITH同部門,同崗位的員工信息
sql>select * from emp where job =(select job from emp where ename='SMITH') and deptno=(select deptno from emp where ename='SMITH');
推薦使用方式
select * from emp where(job,deptno)=(select job,deptno from emp where ename='SMITH');
單行子查詢是返回單列,單數據,多行子查詢是返回單列多行數(都針對單列而言);而多列子查詢則是查詢返回多個數據的子查詢語句
FROM
在from子句中使用子查詢
如何顯示高於自己所在部門平均工資的員工信息
1.查詢各個部門的平均工資
sql>select deptno,avg(sal) from emp group by deptno;
2.把1產生的結果當成一個臨時表對待,再進行加工
sql>select * from emp,(select deptno,avg(sal) avgsal from emp group by deptno) T1 where T1.deptno=emp.deptno and emp.sal>T1.avgsal;
查詢各個部門工資最高的員工信息
sql>select * from emp T1,(select deptno,max(sal) maxsal from emp group by deptno) T2 where T1.deptno=T2.deptno and T1.sal=T2.maxsal;
顯示每個部門的信息和人員數量
1.先統計一下各個部門有多少人
select deptno,count(*) from emp group by deptno;
2.把1當成臨時表(從這個臨時表可以獲取每個部門多少人)然後結合dept表,完成查詢。
select * from dept t1,(select deptno,count(*) from emp group by deptno) t2 where t1.deptno=t2.deptno;
總結:FROM子句中使用子查詢時,該子查詢會被作爲一個臨時表來對待。必須給予查詢指定別名
十一.分頁查詢
重點:分頁查詢是必須掌握的一個要點
select * from emp;
如果想要第4行至第6行的內容?
選擇小於6行的數據
select empno,ename,rownum from emp where rownum<=6;
顯示4到6行數據
select * from (select rownum n,empno,ename,hiredate from emp where rownum<=6) t1 wheret1.n>=4
總結:
第1次篩選:rownum<=6 當成臨時表
第2次篩選; rownum>=4
一.請按入職時間的先後進行排序,查詢7到10行的數據
select * from (select rownum n,empno,ename,hiredate from emp where rownum<=10) t1 wheret1.n>=7 order by hiredate
十二.內鏈接與外連接
內鏈接
內鏈接實際上就是利用where子句對兩張表形成的笛卡兒積進行篩選
內鏈接:是最常用的一種連接方式
案例:顯示員工的信息和部門名字
方法1:
select emp,empno emp.ename,dept.dname from emp,dept where emp.deptno=dept.deptno;
方法2:s
elect emp,empno emp.ename,dept.dname from emp inner join dept onemp.deptno=dept.deptno;
格式:select 列名 from 表1 inner join 表2
on 條件
外連接
外連接:左外連,右外鏈,完全連接
1.左外連接:如果左側的表完全顯示,就是左外連接
2.右外連接:如果右側的表完全顯示,就是右外連接
3.完全連接:如果表完全顯示,就是完全連接
左連接
案例:顯示所有人成績,如果沒有成績,也要顯示該人的姓名和id ,該同學成績爲空
方法1:
select stu.id,stu.name,exam.grade from stu left join exam onstu.id=exam.id
方法2:
select stu.id,stu.name,exam.grade from stu,exam where stu.id=exam.id(+);
右連接
案例:顯示所有成績,如果沒有名字匹配,則顯示空
方法1:select stu.id,stu.name,exam.grade from sturight joinexam onstu.id=exam.id
方法2: select stu.id,stu.name,exam.grade from stu, exam where stu.id(+)=exam.id;
完全連接
案例:顯示所有成績,所有人
select stu.id,stu.name,exam.grade from stu full joinexam onstu.id=exam.id