oracle基礎實戰筆記
本文包含以下內容:
1)Centos oracle 11g express安裝與使用;
2)oracle最基本的增insert into、刪delete、改update set、查select、Merge、distinct、drop操作等。
3)檢視作用;
4)Shell指令碼批量執行.sql檔案;
1.Linux oracle 安裝——CentOS6.5安裝Oracle Express Edition
PS:也有windows平臺的Oracle Express Edition。
可以結合:sqldeveloper.exe 視覺化工具查看錶。
2.注意事項:
Linux檢視oracle版本:
[[email protected] xe]# pwd
/u01/app/oracle/product/11.2.0/xe
3.centos 下操作:
0)連線
//切換到oracle使用者
[[email protected] dbs]# su oracle
//切換到sqlplus 操作
bash-3.2$ sqlplus /nolog
SQL*Plus: Release 11.2.0.2.0 Production on Thu Apr 14 15:23:37 2016
Copyright (c) 1982, 2011, Oracle. All rights reserved.
//輸入資料庫的使用者名稱&密碼
SQL> conn system/123456
Connected. (至此,連線成功)
此外使用:
sqlplus /nolog;
conn / as sysdba;
也有和sqlplus / as sysdba同樣的效果。
1)查詢dba使用者名稱:
SQL> select username from dba_users;
USERNAME
------------------------------
SYS
SYSTEM
ANONYMOUS
APEX_PUBLIC_USER
APEX_040000
XS$NULL
OUTLN
FLOWS_FILES
MDSYS
CTXSYS
XDB
USERNAME
------------------------------
HR
2)查詢表
SQL> select * from a_name;
ID NAME
---------- --------------------
CITY
--------------------------------------------------------------------------------
11 laoyang
beijing
22 zhang
yantai
3)插入&提交操作
//注意插入字元的表示,是單引號。
SQL> insert into a_name("ID", "NAME", "CITY") values(1, 'liu', 'dalian');
1 row created.
SQL> commit;
Commit complete.
4)更新表內容
SQL> update a_name set “CITY”=’shenzhen3’ where “ID”=1;
1 row updated.
SQL> select * from a_name;
ID NAME
---------- --------------------
CITY
--------------------------------------------------------------------------------
11 laoyang
beijing
22 zhang
yantai
1 liu
shenzhen3
5)刪除表
SQL> delete from a_name where “ID”=1;
1 row deleted.
SQL> select * from a_name;
ID NAME
---------- --------------------
CITY
--------------------------------------------------------------------------------
11 laoyang
beijing
22 zhang
yantai
6)order by 排序
desc:降序
asc:升序
SQL> select * from a_name order by "ID" desc;
ID NAME
---------- --------------------
CITY
--------------------------------------------------------------------------------
22 zhang
yantai
11 laoyang
beijing
7)**shell指令碼執行oracle指令
應用場景:批量oracle操作,單個執行很容易敲錯。
方法一:通過oracle SQL developer工具視覺化執行。
方法二:通過shell指令碼批量執行(如下):
#!/bin/bash
#--確保只執行oracle使用者執行
if [ `whoami` != 'oracle' ]
then
echo "Error: You must be oracle to execute."
exit 99
fi
# 獲取ORACLE_SID
ORACLE_SID=$ORACLE_SID
# ORACLE_SID=`cat /etc/oratab|grep ^$ORACLE_SID:|cut -f1 -d':'`
export ORACLE_SID
# 獲取ORACLE_HOME
# ORACLE_HOME=`cat /etc/oratab|grep ^$ORACLE_SID:|cut -f2 -d':'`
ORACLE_HOME=$ORACLE_HOME
export ORACLE_HOME
PATH=$ORACLE_HOME/bin:$PATH
export PATH
$ORACLE_HOME/bin/sqlplus system/123456 as sysdba
#連線
conn system/123456
#--spool 寫入檔案
#--spool /tmp/sql.txt;
#--執行sql語句
select * from a_name;
#--執行sql檔案
@/home/laoyang/oracle_test/test.sql
#--spool off
exit
#建立表sql
CREATE TABLE
TEST_T
(
ID VARCHAR2(50),
NO VARCHAR2(50),
T_NAME VARCHAR2(50),
S_NAME VARCHAR2(50),
SCORE VARCHAR2(50)
);
insert into TEST_T VALUES(1, 1, 'Peter', '張三', 60);
insert into TEST_T VALUES(2, 2, 'Mary', '李四', 99);
insert into TEST_T VALUES(3, 3, 'Tom', '王五', 76);
insert into TEST_T VALUES(4, 1, 'Peter', '小A', 59);
insert into TEST_T VALUES(5, 2, 'Mary', '小B', 60);
insert into TEST_T VALUES(6, 3, 'Tom', '小C', 99);
insert into TEST_T VALUES(7, 1, 'Peter', 'Zhang', 70);
insert into TEST_T VALUES(8, 2, 'Mary', 'Wang', 88);
insert into TEST_T VALUES(9, 3, 'Tom', 'Li', 90);
要求:
-計算每個班級的最高分數
排序語句:
select no 班級, max(score) 分數 from A_TEST_T1 group by no;
排序結果:
1 70
3 99
2 99
8)關聯子查詢 in 示例
要求:查詢表中分數最高的學生的名字和班級等全部資訊。
查詢語句:
select * from a_test_t1 where score in (select max(score) from a_test_t1);
9)關聯子查詢 exist 示例
要求:查詢表中分數小於60的學生資訊。
查詢語句:
select * from a_test_t1 t1 where exists (select 1 from a_test_t1 t2 where t2.score < 60 and t1.id = t2.id);
與下面的指令等價:
select * from a_test_t1 where score in (select score from a_test_t1 where score < 60);
10) 查看錶名(有哪些表)
select table_name from user_tables;
11)檢視的作用:
1)簡化查詢的結構,把子查詢定義成檢視,在另一個查詢裡用
2)限制資料訪問,遮蔽部分不願意給客戶看到的欄位
3)檢視建多了,如果原表的表結構改了,會增加維護工作
建立檢視
create view view_test_t as select id AAAA, no BBBB, t_name CCCC, s_name DDDD, score EEEE from a_test_t1 where score > 60;
SQL> create or replace view view_test_t(序號, 學號, 教師名字, 學生名字, 分數) as select id, no, t_name, s_name, score from a_test_t1 where score > 60;
View created.
//修改檢視,為檢視新增列名。
SQL> select * from view_test_t;
序號
--------------------------------------------------
學號
--------------------------------------------------
教師名字
--------------------------------------------------
學生名字
--------------------------------------------------
分數
--------------------------------------------------
2
2
12)minus 去除交集後剩餘部分。
如集合1{1,2,3}
集合2{2,3,4}
集合1 minus 集合2 = {1};
結合2 minus 集合1 = {4};
create table t111
(
id varchar2(2)
);
create table t222
(
id varchar2(2)
);
insert into t111 values ('1');
insert into t111 values ('2');
insert into t111 values ('3');
insert into t222 values ('2');
insert into t222 values ('3');
insert into t222 values ('4');
//返回1
(select * from t111)
MINUS
(select * from t222);
//返回4
(select * from t222)
MINUS
(select * from t111);
13)Merge合併操作
merge命令根據一張表或子查詢的連線條件對另外一張表進行查詢,連線條件匹配上的進行update,無法匹配的執行insert。
重點:這個語法僅需要一次全表掃描就完成了全部工作,執行效率要高於insert+update。
//建立tb_emp1表
SQL> create table tb_emp1
2 (
3 empno number not null,
4 ename varchar2(100),
5 job varchar2(100)
6 );
Table created.
//建立tb_emp2表
SQL> create table tb_emp2
2 (
3 empno number not null,
4 ename varchar2(100),
5 job varchar2(100)
6 );
Table created.
//向tb_emp1 表中插入資料
SQL> insert into tb_emp1 values(11, 'yang', 'engineer');
1 row created.
//向tb_emp2 表中插入資料, empno 與表1剛插入的相同。
SQL> insert into tb_emp2 values(11, 'zhang', 'perfoessor');
1 row created.
//合併操作
SQL> merge into tb_emp1 t1
2 using tb_emp2 t2
3 on (t1.empno = t2.empno)
4 when matched then
5 update set t1.ename=t2.ename
6 when not matched then
7 insert(empno, ename, job) values (t2.empno, t2.ename, t2.job);
1 row merged.
//查詢合併後結果,已經修改!
SQL> select * from tb_emp1;
EMPNO
----------
ENAME
--------------------------------------------------------------------------------
JOB
--------------------------------------------------------------------------------
11
zhang
engineer
//原tb_emp2不變
SQL> select * from tb_emp2;
EMPNO
----------
ENAME
--------------------------------------------------------------------------------
JOB
--------------------------------------------------------------------------------
11
zhang
perfoessor
##14)distinct使用
distinct作用:是去掉重複值,並將結果返回。
SQL> select distinct name from fruits;
NAME
----------
Oranges
Apple
Peach
//查詢個數
SQL> select count(*) from fruits;
COUNT(*)
----------
10
//查詢不重複的name的個數
SQL> select count(distinct(name)) from fruits;
COUNT(DISTINCT(NAME))
---------------------
3
15) 清除表內容&刪除表
清除整個表的內容
delete from 表名;
truncate table 表名;
注意:delete和truncate的區別:
【1】delete刪除的資料可以恢復,truncate不能恢復
【2】delete高水位線不會下降,truncate高水位線會下降(釋放表空間)。
PS:高水位:詳見:
刪除表
drop table 表名;
oracle 10g開始,表刪除後不是直接刪除而是去了回收站。
刪除回收站中指定表:purge table 表名;
清空回收站:purge recyclebin;
直接刪除(不會進回收站直接刪除):drop table 表名 purge;
舉例:
//清除表內容(注意:常犯錯的語句寫成:delete * from fruits; 沒有“*”,屬於select固定思維導致出錯)。
SQL> delete from fruits;
10 rows deleted.
//查詢表(表依然存在)
SQL> select * from fruits;
no rows selected
//刪除表
SQL> drop table fruits;
Table dropped.
//表已不存在,會報錯。
SQL> select * from fruits;
select * from fruits
*
ERROR at line 1:
ORA-00942: table or view does not exist