Oracle 語法及使用


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邏輯和物理數據結構

Oracle數據庫的邏輯結構

  表空間(Tablespace)、段(Segment)、區間(Extend) 、塊(Block)、用戶、數據庫對象。

詳見ORACLE數據庫存儲結構簡介

表空間

-- 創建表空間
-- 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

  1. 事務是最小的工作單元,它作為一個整體進行操作, 此工作單元中的語句要么全部成功,要么全部失敗不充許部分成功和部分失敗

  2. 保證事務的整體成功或失敗,稱為事務控制

  3. 事務的四大特性ACID :
    原子性(Atomicity )、一致性(Consistency )、隔離性(Isolation)、持久性(Durability )

  4. 用於事務控制的語句有:

    ​ 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();
			}
		}
	}
}


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM