Oracle數據庫的物理結構
數據文件的后綴:.DBF
控制文件的后綴:.CTL
日志文件的后綴:.LOG
一個數據庫(數據庫實例orcl)由一個或者多個數據文件和控制文件和日志文件組成,但是一個數據庫至少有一個數據文件和控制文件和日志文件。
-- 使用命令查看數據庫中的數據文件。
select name from V$DATAFILE;
-- 使用命令查看數據庫中的控制文件。
select name from V$CONTROLFILE;
-- 使用命令查看數據庫中的日志文件。
select MEMBER from V$LOGFILE;
Oracle行注釋
-- 單行注釋
/*
多行注釋
*/
set pagesize; -- 每頁顯示多少行數據
set linesize; -- 每行占用多少個字符
set timing on; -- 顯示每個sql命令執行時間
-- 如何將緩存中的數據持久化到磁盤的數據文件中?
commit;
Oracle數據庫的邏輯結構
表空間(Tablespace)、段(Segment)、區間(Extend) 、塊(Block)、用戶、數據庫對象。
表空間
-- 創建表空間
-- create tablespace 表空間名稱 datafile '磁盤存在的路徑\數據文件.dbf' size 初始化空間大小;
create tablespace tablespace_name datafile 'D:\app\oracle\oradata\orcl\tablespace_name.dbf' size 64m;
-- 注意:創建表空間必須指定數據文件,數據文件的路徑必須真實存在 表空間大小一定要指定
-- 打開表空間自動擴展功能語法:
alter database datafile '磁盤存在的路徑\數據文件.dbf' autoextend on;
-- 關閉表空間自動擴展功能語法:
alter database datafile '磁盤存在的路徑\數據文件.dbf' autoextend off;
-- 查看數據文件另外的一個命令
select file_name,tablespace_name from dba_data_files;
-- 查看表空間命令,顯示數據庫(數據庫實例)所有的表空間
select tablespace_name from dba_tablespaces;
-- 刪除表空間語法
-- drop tablespace 表空間名稱;
drop tablespace tablespace_name;
用戶
-- 創建用戶並指定密碼
-- create user 用戶名 identified by 密碼;
create user username identified by t1234;
-- 創建用戶並且指定表空間
-- create user 用戶名 identified by 密碼 default tablespace 表空間名稱;
create user username identified by t1234 default tablespace table_space;
-- 切換用戶登錄
-- conn 用戶名/密碼;
conn username/t1234;
-- 刪除用戶
drop user 用戶名;
用戶授權和撤銷授權
-- 用戶授權
-- grant 權限列表 to 用戶;
-- CONNECT 連接權限 RESOURCE 訪問數據庫對象(資源)權限 DBA最高權限
grant CONNECT,RESOURCE,DBA to username;
-- 撤銷權限
-- revoke 權限列表 from 用戶;
revoke CONNECT,RESOURCE,DBA from username;
用戶上鎖與解鎖
-- 鎖定用戶
-- alter user 用戶名 account lock;
alter user 用戶名 account lock;
-- 用戶解鎖
-- alter user 用戶名 account unlock;
alter user 用戶名 account unlock;
數據庫對象
數據庫對象包括以下: 表空間(TableSpace)、表(Table)、視圖(View)、索引(Index)、序列(Sequnce)、存儲過程(stored procedure)、函數(Function)、觸發器(Trigger)。
SQL語法
工作中盡量大寫,提高sql語句執行效率。
SQL語言的基本概念
數據庫定義語言(DDL):是用於描述數據庫中要存儲的現實世界實體的語言。
——常用關鍵字:create(創建) alter(修改) drop(刪除)
數據庫操縱語言(DML):查詢數據庫及操作已有數據庫中的數據的計算機語言。
——常用關鍵字:insert(插入) update(更新) delete(刪除)
數據庫查詢語言(DQL):用於檢索表中所有數據,或特定范圍內的數據。
——常用關鍵字:select (查詢)
數據庫控制語言(DCL):用來設置或更改數據庫用戶或角色權限的語句。
——常用關鍵字:grant(授權) revoke(回收權限)
數據庫事物語言(TCL):定義為把一串一起執行的操作作為單個邏輯工作單元處理
——常用關鍵字:commit 語句完成顯式事務,並使所有的修改是持久有效的
rollback 語句終止當前事務,使數據庫返回到以前的狀態
Oracle數據類型
類型 | 含義 | 存儲描述 | 備注 |
---|---|---|---|
CHAR | 固定長度字符串 | 最大長度2000bytes | |
VARCHAR2 | 可變長度的字符串, | 最大長度4000bytes | 可做索引的最大長度749 |
NCHAR | 根據字符集而定的固定長度字符串 | 最大長度2000bytes | |
NVARCHAR2 | 根據字符集而定的可變長度字符串 | 最大長度4000bytes | |
DATE | 日期(日-月-年) | DD-MM-YY(HH-MI-SS),經過嚴格測試,無千蟲問題 | |
TIMESTAMP | 日期(日-月-年) | DD-MM-YY(HH-MI-SS:FF3),經過嚴格測試,無千蟲問題 | 與DATE相比較,TIMESTAMP有小數位秒信息 |
LONG | 超長字符串 | 最大長度2G,足夠存儲大部頭著作 | |
RAW | 固定長度的二進制數據 | 最大長度2000bytes | 可存放多媒體圖象聲音等 |
LONG RAW | 可變長度的二進制數據 | 最大長度2G | 可存放多媒體圖象聲音等 |
BLOB | 二進制數據 | 最大長度4G | |
CLOB | 字符數據 | 最大長度4G | |
NCLOB | 根據字符集而定的字符數據 | 最大長度4G | |
BFILE | 存放在數據庫外的二進制數據 | 最大長度4G | |
ROWID | 數據表中記錄的唯一行號 | 10bytes | *..*格式,*為0或1 |
NROWID | 二進制數據表中記錄的唯一行號 | 最大長度4000bytes | |
NUMBER(P,S) | 數字類型 | P為整數位,S為小數位 | |
DECIMAL(P,S) | 數字類型 | P為整數位,S為小數位 | |
INTEGER | 整數類型 | 小的整數 | |
FLOAT | 浮點數類型 | NUMBER(38),雙精度 | |
REAL | 實數類型 | NUMBER(63),精度更高 |
運算符
查詢條件 | 關鍵字 |
---|---|
比較 | =、>、<、>=、<=、!=、NOT、等比較運算符 |
確定范圍 | Between And、Not Between And |
確定集合 | In、Not In |
字符匹配 | Like、Not Like |
是否空值 | Is Null、Is Not Null |
多重條件 | And、Or |
數據定義語言(DDL)
創建表的語法:
create table 表名稱( 列名稱 數據類型, 列名稱 數據類型, ... 列名稱 數據類型 );-- 注意:任何數據庫都沒有{},每列名稱之間使用英文逗號分離-- 工作中一個表最好不要超過15列-- ; 表示創建表結束
例:
create table student( -- 學生表 stu_ID number(4), -- 學號 stu_NAME varchar2(10), -- 姓名 stu_birth date, -- 出生日期 stu_score number(7,2) -- 分數);
查看表是否創建成功
desc 表名稱; -- 查看表結構-- 例:desc student;
在sys用戶下可以查詢數據庫服務器創建的所有表名稱
-- owner 表示表所在的用戶(哪個用戶創建的)-- table_name 表名稱select owner,table_name from dba_tables;-- where owner='SCOTT' 查看SCOTT用戶下面有哪些表select owner,table_name from dba_tables where owner='SCOTT';
刪除表
語法
-- drop table 表名稱 ;drop table student;
修改表結構
-- 1.添加新列-- 語法:-- alter table 表名稱 add 列名稱 數據類型;alter table tb_students add student_sex varchar(2); -- student_sex 學生性別-- 2.列的重命名-- 語法:-- alter table 表名稱 rename column 舊列名稱 to 新列名稱;alter table tb_students rename column student_sex to stu_sex; -- student_sex 改為stu_sex-- 3.修改列的數據類型-- 語法:-- alter table 表名稱 modify 列名稱 數據類型;alter table tb_students modify stu_sex number(1); -- stu_sex列的數據類型修改為number 0男 1女-- 4.刪除一列-- 語法:-- alter table 表名稱 drop column 列名稱;alter table tb_students drop column stu_sex; -- 刪除stu_sex列-- 注意:rename 和 drop 后面一定要加上 column-- desc 表名稱 作用是查看表結構
數據查詢語言(DQL)
Data Query Language。檢索(查詢):從表中檢索(查詢)數據,特征:不會修改(改變)表的數據和表的結構, 讀。
select 關鍵字是DQL的核心。
查詢語法
-- select 列名稱1,列名稱2,...,列名稱n from 表名稱;-- select 檢索(查詢)-- from 從那張表檢索(查詢)數據select tablespace_name,block_size from dba_tablespaces;/* dba_tablespaces表是sys用戶下面的表,該表存儲了所有表空間的信息,不是由我們自己創建的,而是在安裝Oracle數據庫服務器的過程中幫我們創建的。 */-- 從dba_tablespaces表中選擇tablespace_name,block_size的數據進行檢索(查詢)-- 先執行from,后執行select-- 查詢所有列(select * from 表名)select * from student;-- 查詢指定列(select列1,列2…from 表名)select stu_id,stu_name from student;/* 打開黑窗口命令行執行select語句從數據文件中檢索數據,首先會查詢緩存中有沒有該命令對應的數據,如果有直接沖緩存中檢索(查詢)數據,如果沒有就會從數據文件中檢索(查詢)數據,將檢索(查詢)的數據放入緩存中。第二次執行select語句就會由於該數據在緩存中已經存在了,所以不會查詢磁盤的數據文件,而是直接查詢緩存。目的:少跟磁盤左I/O交互,因為磁盤讀取數據慢,緩存處理數據快 */
列別名和表別名
列別名
列別名:增強SQL語句的可讀性
select stu_id as 學號,stu_name as 姓名,stu_birth as 出生日期,stu_score as 分數 from student;-- as 可以省略,但在工作中不建議省略
表別名
表別名:多張表之間做聯合查詢能夠簡化書寫
select s.stu_id as 學號,s.stu_name as 姓名,s.stu_birth as 出生日期,s.stu_score as 分數 from student s;-- from emp e :e就是表別名 表別名不能有as關鍵-- 使用了表別名就可以在列上使用: s.stu_ID表示stu_ID是student表的列 此時的s就是student表的別名(小名稱)
where關鍵字
根據條件進行行過濾,where關鍵字后面跟條件,where關鍵字跟在from 表名稱之后。
select s.stu_id as 學號,s.stu_name as 姓名,s.stu_birth as 出生日期,s.stu_score as 分數 from student s where s.stu_id=101;
算術運算符
+ - * / :依次為加,減,乘,除。Oracle語法中沒有%,取模用mod()。
例:
-- 所有同學分數加5分select stu_score+5 分數 from student;-- 注意:不要再where后面寫算術運算符
比較運算符
操作符 | 含義 |
---|---|
= | 等於(不是==) |
> | 大於 |
>= | 大於等於 |
< | 小於 |
<= | 小於等於 |
<> | 不等於 |
例:
-- 查詢編號不為101的所有學生信息select stu_id as 學號,stu_name as 姓名,stu_birth as 出生日期,stu_score as 分數 from student where stu_id<>101;
邏輯運算符
操作符 | 含義 |
---|---|
AND | 與(交集) |
OR | 或(並集) |
NOT | 非(取反) |
例:
-- 查詢出生日期在2019-10-09並且分數高於80的學生select stu_id as 學號,stu_name as 姓名,stu_birth as 出生日期,stu_score as 分數 from student where stu_birth='2019-10-09' and stu_score>80;
集合查詢
關鍵字:in
例:
-- 查詢學生id為101和102的學生信息select stu_id as 學號,stu_name as 姓名,stu_birth as 出生日期,stu_score as 分數 from student where stu_id in (101,102);
過濾重復的行
關鍵字:distinct
例:
-- 查詢student表中所有學生編號,對編號進行去重select distinct stu_id from student;-- distinct 后面跟列名稱-- distinct 去重的參照物是行,首先查詢出結果集,然后根據每行進行比較,有沒有重復的數據,如果有去掉,如果沒有將其添加到新的結果集
模糊查詢
關鍵字:like
通配符 “%” 和 “_”:
%:表示任意個字符,包括零個;
_:表示一個任意字符;
例:
-- 查詢姓名以張開頭的學生select * from student where stu_name like '張%';-- 查詢姓名以四開頭的學生select * from student where stu_name like '%四';-- 查詢姓名第二個字為三的學生select * from student where stu_name like '_三%';
聚合函數
數據操縱語言(DML)
insert:向表中插入數據
-- 語法-- insert into 表名稱 values(值1,值2,值3...值n);insert into student values(101,'李四',to_date('2019-10-09','yyyy-MM-dd'),82); -- 向表插入數據-- 按指定列插入數據-- insert into 表名稱(列1,列2) values(值1,值2);insert into student(stu_id,stu_name,stu_sex,stu_birthday,stu_sal) values(109,'張三豐','男',to_date('2019-9-28','yyyy-MM-dd'),2500);-- 雖然完成了向表中插入數據,但是數據只是插入到Oracle的緩存中,並沒有持久化到磁盤的數據文件,如何將緩存中的數據持久化到磁盤的數據文件中?commit; -- commit;表示將緩存中的數據持久化到磁盤的數據文件中-- 設置每頁顯示的行數,設置每行的大小-- set pagesize 大小;-- set linesize 大小;set pagesize 30 ; -- 表示每頁顯示30行數據set linesize 300; -- 表示每行占用300個字符
delete:刪除表中的數據
-- delete from 表名稱;delete from student; -- (刪除整張表數據)/* 注意:delete只會刪除表中的數據,不會刪除表結構 在工作中刪除表中的數據通常需要添加一個條件 where關鍵字 表示行過濾 */delete from student where id=105; -- (刪除指定行數據)where后面的條件為true執行刪除
update:更新(修改)表中的數據
語法:
update 表名稱 set 列名稱=值;
例:
update student set stu_score = stu_score + 1; -- 所有學生的分數+1-- 注意:Oracle不是面向對象語言不能寫 +=update student set stu_score = stu_score + 1,stu_age = stu_age + 1; -- 所有學生分數+1,年齡+1-- 注意:如果由多個列要修改時,需使用英文逗號分隔-- 場景:將id為102的學生分數-3;update student set stu_score = stu_score - 3 where id=102;/* 注意:工作中update、delete執行更新和刪除表中的數據最好加上條件 工作中insert插入數據最好指定列名稱 */
小結:數據庫表中的數據會發生改變(插入、刪除、修改),所以執行完畢之后一定要 commit;
數據控制語言(DCL)
為用戶進行授權的,通常DCL是由DBA做的
grant:給用戶授予權限
語法
-- grant 權限列表 to 用戶;
grant CONNECT,RESOURCE to username;
revoke:撤銷用戶的授權
語法
-- grant 權限列表 from 用戶;
revoke CONNECT,RESOURCE from username;
-- CONNECT 表示連接的權限
-- RESOURCE 表示訪問資源的權限
事務控制語言(TCL)
事務控制語言:TCL: Transaction Controll Language
-
事務是最小的工作單元,它作為一個整體進行操作, 此工作單元中的語句要么全部成功,要么全部失敗不充許部分成功和部分失敗
-
保證事務的整體成功或失敗,稱為事務控制
-
事務的四大特性ACID :
原子性(Atomicity )、一致性(Consistency )、隔離性(Isolation)、持久性(Durability ) -
用於事務控制的語句有:
COMMIT - 提交並結束事務處理
ROLLBACK - 撤銷事務中已完成的工作
SAVEPOINT – 標記事務中可以回滾的點
update student where num=10;
savepoint s1;
insert into student where num=11;
rollback s1; --回退到了s1,也就是之后的插入數據操作撤銷了
commit;
Oracle連接數據庫
package com.lyang.oracle.jdbc;
import java.sql.Connection;
import java.sql.Date;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
/**
* Oracle連接數據庫查詢emp表
*
*/
public class JdbcOracle {
public static void main(String[] args) {
Connection conn = null;
Statement st = null;
ResultSet rs = null;
try {
Class.forName("oracle.jdbc.driver.OracleDriver");
String url = "jdbc:oracle:thin:@localhost:1521:orcl";
conn = DriverManager.getConnection(url, "scott", "t1234");
st = conn.createStatement();
String sql = "select empno,ename,job,mgr,hiredate,sal,comm,deptno from emp";
rs = st.executeQuery(sql);
while (rs.next()) {
int empno = rs.getInt(1);
String ename = rs.getString(2);
String job = rs.getString(3);
int mgr = rs.getInt(4);
Date hiredate = rs.getDate(5);
int sal = rs.getInt(6);
int comm = rs.getInt(7);
int deptno = rs.getInt(8);
System.out.println(empno + "\t" + ename + "\t" + job + "\t" + mgr +
"\t" + hiredate + "\t" + sal + "\t" + comm + "\t" + deptno);
}
} catch (Exception e) {
e.printStackTrace();
}finally {
try {
conn.close();
st.close();
rs.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
}