您好,登錄后才能下訂單哦!
下面是Oracle表管理的部分,用到的測試表是oracle數據庫中scott用戶下的表做的測試,有的實驗也用到了hr用戶的數據,以下這些東西是我的麥庫上存的當時學Oracle的學習筆記今天拿出來和大家分享一下,轉載請注明出處,下面用的Oracle的版本是10g,用的時WinServer2003的操作系統,可能有些命令和Oracle11g的有所不同,但大部分是一樣的,接下來還會陸續的分享一下Oracle中對數據庫的管理,對表的管理,還有Oracle中的存儲過程和PL/SQL編程。用到的Oracle的管理工具是PL/SQL Developerl和SQL PLUS,歡迎大家批評指正。
1.表名和列名的命名規則:
1.必須以字母開頭
2.長度不能超過30個字符
3.不能使用oracle的保留字命名
4.只能使用字母數字下劃線,$或#;
2.oracle的數據類型
1.字符型:
char 定長 最長2000字符(因為是定長的,在做查詢時是多位同時比較,其好處是查詢速度特快)
demo: char(10) 存放‘ab’占倆個字符后面空著的8個字符用空格補全,所以存了2個字符也占10個字符的空間;
varchar2 變長 最大是4000字符(查詢速度較慢,因為是變長,查詢比較是是一位一位的比較)
demo:varchar2(10) 存放‘ab’,就占2個字符;
clob(character large object) 字符型大對象,最大是4G
2.數字類型:
number 的范圍 10的-38次方---10的38次方可以表示小數也可以表示整數
number(5,2)表示有5位有效數字,兩位小數;范圍 -999.99 -- 999.99
number(5) 表示有5位整數,范圍:-99999-99999;
3.日期類型:
date 包括年月日和時分秒
timestamp 時間戳(毫秒級)
在oracle中默認的日期格式是“DD-MON-YY” 如“01-5月-1992”,如果沒有月則添加不成功;
修改date的格式:
alter session set nls_date_fomat = "yyyy-mm-dd";
4.大數據(存放媒體)
blob 二進制數據 可以存放圖片/聲音/視頻 最大是4G普通的存放媒體數據一般在數據庫中存放的是所放的文件夾路徑當為了安全性時才會把媒體文件放在數據庫中;
3.oracle中創建表
1 sql>create table student( --創建名為student的數據庫表2 name varchar2(20), --名字10個變長3 idcar char(18), --×××18個定長字符4 sex char(2), --性別2個定長字符5 grade number(5,2) --成績為浮點數,有效5位小數位為2位;6 )
4.oracle中往已有的表中新增列;
sql>alter table student add(classid number(2));
5.修改已有字段的長度
sql>alter table student modify(name varchar2(10));
6.刪除表中的已有字段
sql>alter table student modify(name varchar2(10));
7.表的重命名;
sql>rename student to std;
9.往表中插入數據:
1.省略字段名
sql>insert into student values('name','231','男',234.89);
2.給部分字段賦值
sql>insert into student(name,idcar) values('TOM','123');
3.查詢idcard字段為空的學生
sql>select * from student where idcard is null;
10.修改表中的數據:
sql>update student set name='cat' where id=1;
11.oracle中的回滾:(要養成創建保存點的習慣)--commit后所有的保存點都沒有了
1.回滾之前先創建保存點 sql>savepoint pointName; 2.刪除表中的記錄 sql>delete from student;; 3.回滾 sql>rollback to pointName; truncate table student; --刪除表中的所有的數據,不寫日志,無法回滾,刪除速度極快;
Oracle中的select語句的練習,這也是難點
1.emp表中的內關聯查詢:給出每個雇員的名字以及他們經理的名字, 使用表的別名;
sql>select a.ename,b.ename from emp a,emp b where a.mgr=b.empno;
2.去除重復的行,重復的行的意思是行的每個字段都相同; distinct
sql>select distinct emp.job,emp.mgr from emp;
3.查詢SMITH的薪水,職位和部門:
SQL> select emp.ename as 姓名,emp.sal as 薪水, emp.job as 工作,dept.dname as 部門2 from emp,dept where emp.ename='SMITH' and emp.deptno=dept.deptno; 姓名 薪水 工作 部門---------- --------- --------- --------------SMITH 800.00 CLERK RESEARCH
4.打開顯示sql語句運行時間
sql>set timing on;
5.查詢SMITH的年工資;--nvl 處理為null的字段,在表達式里如果有一個值為null則結果就為null用nvl()函數處理為空的字段,例如nvl(comm,0):如果為null則用0替換;
select emp.ename "名字", emp.sal*12+nvl(emp.comm,0)*12 "年薪" from emp where name='SMITH';
6.模糊查詢like %代替多個字符,_代替一個字符;
select * from emp where emp.ename like 'S%';
7.or的升級in查詢
select * from emp where emp.empno in(7369,7788);
8.查詢工資高于500或者是崗位是manager同時名字以J開頭的雇員
SQL> select * from emp where (emp.sal>500 or emp.job='MANAGER') and emp.ename like 'J%';
9.按照工資從低到高排序 order by語句; desc是降序(從高到低),asc是升序(從低到高 默認)
SQL>select * from emp order by emp.sal asc;
10.按照部門號升序(asc),員工號降序(desc)
SQL>select * from emp order by emp.deptno ,emp.empno desc;
11.使用列的別名排序:按年薪降序(desc)
SQL>select emp.sal*12 "年薪" from emp order by "年薪" desc;
數據的分組————min,max,avg,sum,count;
1.查詢員工的最高工資和最低工資; min()和max() 的使用
select max(sal) "最高工資", min(sal) "最低工資" from emp;
2.查詢所有員工的工資總和和平均工資 sun() 和 avg() 的使用;
SQL> select sum(sal) "工資總和", avg(sal) "平均工資" from emp;
3.查詢員工的總人數:
SQL> select count(*) from emp;
4.把最高工資的員工的信息輸出(用到了子查詢)
SQL>select * from emp where sal=(select max(sal) from emp);//ERROR 不能使用分組函數 error: select * from emp where sal = max(sal);--error;error: select ename,max(sal) from emp; -error;
select 后面若有分組函數子可以跟分組函數
5.顯示工資高于平均工資的員工信息:
SQL>select * from emp where sal=(select max(sal) from emp);//ERROR 不能使用分組函數 error: select * from emp where sal = max(sal);--error;error: select ename,max(sal) from emp; -error;
group by 和 having子句
group by 用于對查詢的結果進行分組統計
having子句用于限制分組顯示結果
1.顯示每個部門的平均工資和最高工資;
select avg(sal),max(sal),deptno from emp group by deptno;
2.顯示每個部門的每種崗位的平均工資和最高工資
SQL> select avg(sal),max(sal),deptno,job from emp group by deptno,emp.job order by deptno;
3.顯示平均工資小于2000的部門號和他們的平均工資:
SQL> select emp.deptno,avg(sal) from emp group by emp.deptno having avg(sal)<2000; DEPTNO AVG(SAL)------ ----------30 1566.66666
分組函數只能出現在選擇列表,having,order by子句中
如果select中同時有group by ,having ,order by 則三者的順序為group by ,having, order by;
多表查詢:
1.顯示雇員名,雇員工資,所在部門名稱;
SQL> select emp.empno,emp.sal,dept.dname from emp,dept where emp.deptno=dept.deptno;
2.顯示部門號為10的雇員名,雇員工資,所在部門名稱
SQL> select emp.empno,emp.sal,dept.dname from emp,dept where emp.deptno=10 and emp.deptno=dept.deptno;
3.顯示雇員名,雇員工資,工資的級別;
SQL> select emp.ename,emp.sal,salgrade.grade from emp,salgrade where emp.sal between salgrade.losal and salgrade.hisal;
子查詢: SQL中執行順序是從右到左執行
1.查詢與SMITH在同一部門的所有員工;
SQL> select * from emp where emp.deptno=( select emp.deptno from emp where emp.ename='SMITH');
2.查詢和部門10的工作相同的員工的信息
SQL> select * from emp where emp.job in( select emp.job from emp where emp.deptno=10);
3.顯示工資比部門號為30的所有員工的工資都高的員工信息;(用 all() 或 max()實現)
SQL> select * from emp where sal>all( select sal from emp where emp.deptno=30); 或者(下面的效率要高的多) SQL> select * from emp where sal>( select max(sal) from emp where emp.deptno=30);
4.顯示工資比部門號為30的一個員工的工資都高的員工信息;
SQL> select * from emp where sal>any( select sal from emp where emp.deptno=30); 或者(下面的效率要高的多) SQL> select * from emp where sal>( select min(sal) from emp where emp.deptno=30);
返回多字段的子查詢:
1.查詢與SMITH在同一部門并且職位也相同的員工信息;
SQL> select * from emp where (deptno,job)=( select deptno,job from emp where ename='SMITH');
2.查詢員工比自己部門的平均工資高的員工信息;(把查詢出的信息當作一張表起一個別名)
SQL> select * from emp a,( select deptno,avg(sal) mysal from emp group by deptno) a2 where a.deptno = a2.deptno and a.sal>a2.mysal;
在from中使用子查詢時查詢的結果會當作一個視圖來對待,因此也叫做內嵌視圖
必須給內嵌視圖命一個別名
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。