一. docker 模式下進入數據庫
ubuntu@jiang:~$ sudo docker ps -a sudo: unable to resolve host jiang CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES f096e625bcd3 oracleinanutshell/oracle-xe-11g "/bin/sh -c '/usr/sb…" About an hour ago Up About an hour 22/tcp, 8080/tcp, 0.0.0.0:1521->1521/tcp compassionate_lamportubuntu@jiang:~$ sudo docker exec -it f096e625bcd3 /bin/bash sudo: unable to resolve host jiang root@f096e625bcd3:/#
二.
1. 打開終端窗口并執行oraenv?命令以設置環境變量。
2. 執行以下語句以系統管理員身份連接到數據庫:
sqlplus sys / <password> as sysdba;
3.默認情況下,HR模式已鎖定。執行以下語句以解鎖HR模式。
ALTER USER hr IDENTIFIED BY hr ACCOUNT UNLOCK; # 演示用戶
4.行以下命令以連接到HR?模式:
connect hr/hr
SQL> connect hr/hr
Connected.
5.?DESCRIBE命令提供了一個指定的表或視圖的描述。表和視圖的描述包含以下信息:
- 列名
- 是否允許每列的空值(NULL或NOT NULL)
- 列的數據類型,例如?DATE,NUMBER,?VARCHAR2?
- 柱的精度,例如VARCHAR2(50)
語法:DESC [RIBE] <table?>
執行以下命令以查看EMPLOYEES表的說明:
DESCRIBE EMPLOYEES;
SQL> desc employeesName Null? Type----------------------------------------- -------- ----------------------------EMPLOYEE_ID NOT NULL NUMBER(6)FIRST_NAME VARCHAR2(20)LAST_NAME NOT NULL VARCHAR2(25)EMAIL NOT NULL VARCHAR2(25)PHONE_NUMBER VARCHAR2(20)HIRE_DATE NOT NULL DATEJOB_ID NOT NULL VARCHAR2(10)SALARY NUMBER(8,2)COMMISSION_PCT NUMBER(2,2)MANAGER_ID NUMBER(6)DEPARTMENT_ID NUMBER(4)
三.表操作
查詢表
1. select 語句
語法:SELECT {* | [DISTINCT] column | expression [alias],...}?
??? ? FROM?????<table>;
1). 查詢表的所有數據
SELECT * FROM departments; //
SQL> SELECT * FROM departments;DEPARTMENT_ID DEPARTMENT_NAME MANAGER_ID LOCATION_ID ------------- ------------------------------ ---------- -----------10 Administration 200 170020 Marketing 201 180030 Purchasing 114 1700
?
2).??SELECT?語句中指定列名來顯示表中的特定數據列
select JOB_ID,JOB_TITLE FROM jobs;
SQL> select JOB_ID,JOB_TITLE FROM jobs;JOB_ID JOB_TITLE ---------- ----------------------------------- AD_PRES President AD_VP Administration Vice President
2. 限制數據
1. where
修改SELECT語句。執行以下查詢以將行數限制為DEPARTMENT_ID 60:
SELECT * FROM departments WHERE department_id = 60;
2.order by 排序子句
升序
SELECT LAST_NAME, JOB_ID, HIRE_DATE FROM employees WHERE JOB_ID='SA_REP' ORDER BY HIRE_DATE;
降序
SELECT LAST_NAME, JOB_ID, HIRE_DATE FROM employees WHERE JOB_ID='SA_REP' ORDER BY HIRE_DATE DESC;
三. 創建架構
示例:您將創建一個名為ONLINE_SHOPPE的模式。該模式描繪了一個與客戶群和商品一起運營的在線商店。有關客戶的信息存儲在CUSTOMERS表中,有關商品的信息存儲在COMMODITIES表中,訂單詳細信息存儲在ORDERS表中。
1. 創建用戶
數據庫管理員執行許多任務?其中一個更常見的任務是創建數據庫用戶并為其分配唯一的用戶名。用戶使用用戶名和密碼登錄數據庫后,可以發出數據庫SQL語句來創建對象,查詢對象和管理數據庫。創建用戶是一種創建模式的方法,?您將執行CREATE USER語句以創建和配置數據庫用戶。
語法:CREATE USER <USER> IDENTIFIED BY <password>;
1).?執行以下語句以管理員身份連接到數據庫,并創建名為ONLINE_SHOPPE的用戶。
CONNECT sys/<password>?as sysdba;
CREATE USER online_shoppe IDENTIFIED BY online; //創建用戶online-shoppe 密碼為online
SQL>CREATE USER online_shoppe IDENTIFIED BY online;User created.
在Oracle數據庫中創建了名為ONLINE_SHOPPE的模式。
2. 分配權限
當多個用戶訪問數據庫對象時,您可以使用特權控制對象的授權。權限控制用戶是否可以修改另一個用戶擁有的對象。通過以下方式授予或撤銷它們:
- 實例管理員
- 具有ADMIN權限的用戶
- 對象的所有者 ??
通常,有兩種類型的權限:
- 系統特權:對任何對象(例如表,視圖和索引)執行特定操作的權限。只有實例管理員或具有ADMIN?權限的用戶才能分配或撤消系統權限。
- 對象權限:對對象執行特定操作或訪問其他用戶對象的權限。對象的所有者擁有該對象的所有對象權限,并可以將該對象的對象權限分配給其他數據庫用戶。
以下是一些基本的系統和對象權限:
系統權限:
- 創建數據庫中任何用戶擁有的表,視圖或索引
- 更改數據庫中的表,視圖或索引
- 刪除數據庫中的表,視圖或索引
?
對象特權:
- 將值插入表中
- 為表創建外鍵依賴項
- 從表中選擇
- 更新表格
您可以使用GRANT語句為用戶和角色分配權限。要分配權限,必須為您分配ADMIN OPTION?或GRANT ANY PRIVILEGE系統特權。
語法:GRANT <grant_privilege> TO <user>;
?
?1).?
使用CREATE USER?語句創建用戶時,默認情況下用戶的權限域為空。管理員根據用戶將來可能執行的任務為用戶分配權限。ONLINE_SHOPPE?用戶建立會話,創建表,并針對表寫入DML語句。執行以下語句,為ONLINE_SHOPPE用戶分配所需的權限:
GRANT CREATE SESSION to online_shoppe;
GRANT CREATE TABLE to online_shoppe;
GRANT UNLIMITED TABLESPACE to online_shoppe;
GRANT SELECT ANY TABLE to online_shoppe;
GRANT UPDATE ANY TABLE to online_shoppe;
GRANT INSERT ANY TABLE to online_shoppe;
GRANT DROP ANY TABLE to online_shoppe;
grant create any trigger to user_name;
2.創建表
?
在ONLINE_SHOPPE?模式中創建表之前,您應該了解表和完整性約束的概念。
- 表:數據庫中數據存儲的基本單位。在表中,數據存儲在行和列中。您可以使用表名,一組列,數據類型和寬度定義表。??
- 完整性約束:表中列的規則。您可以指定這些規則以在定義它們的列中強制實施數據完整性。Oracle數據庫的基本約束包括:
?
語法:CREATE TABLE [schema。] table?
????????? (column datatype [DEFAULT expr] [,...]);
執行以下步驟以在架構中創建CUSTOMERS,?COMMODITIES和ORDERS表。
1).?連接到ONLINE_SHOPPE架構并創建CUSTOMERS表,并將CUSTOMER_ID?列作為主鍵。
connect ONLINE_SHOPPE/online; #連接到視圖CREATE TABLE customers(customer_id VARCHAR2(4),customer_name VARCHAR2(20),address VARCHAR2(60),contact VARCHAR2(20), CONSTRAINT cust_id_pk PRIMARY KEY(customer_id) ); #customer_id作為主鍵約束,別名為cust_id_pk
2). 創建COMMODITIES與表COMMODITY_ID?列作為主鍵和UNIT_PRICE?列作為一個非空列。
CREATE TABLE commodities(commodity_id VARCHAR2(4),commodity_name VARCHAR2(20),unit_price NUMBER(8,2) NOT NULL,CONSTRAINT comm_id_pk PRIMARY KEY(commodity_id) );
3).?使用以下命令創建ORDERS表:
-
ORDER_ID列作為主鍵
-
COMMODITY_ID和CUSTOMER_ID?作為外鍵
-
UNITS和TOTAL_COST為NOT NULL值
-
檢查數字列上的約束以接受大于零的值
CREATE TABLE orders(order_id VARCHAR2(4),customer_id VARCHAR2(4),commodity_id VARCHAR2(4),units NUMBER(8,2) NOT NULL, #整數部分6位數,小數部分2位數total_cost NUMBER(8,2) NOT NULL,CONSTRAINT ordr_id_pk PRIMARY KEY(order_id),CONSTRAINT ordr_cust_fk FOREIGN KEY (customer_id)REFERENCES customers(customer_id),CONSTRAINT ordr_comm_fk FOREIGN KEY (commodity_id)REFERENCES commodities(commodity_id),CONSTRAINT check_unit CHECK(units > 0), #約束檢查 CONSTRAINT check_totl CHECK(total_cost > 0) );
3.插入,修改,刪除記錄
1).插入數據:執行INSERT?語句以將數據行添加到數據庫表。
語法:INSERT INTO table [(column [,column ...])]?
??? ???? VALUES(value [,value ...]);
執行以下語句以將數據插入CUSTOMERS,COMMODITIES和ORDERS?表。
INSERT INTO customers VALUES ('C001', 'BDAVIS', 'Boston', '650.551.4876'); INSERT INTO customers VALUES ('C002', 'SSTEPHEN', 'ST.Louis', '650.501.9321'); INSERT INTO customers VALUES ('C003', 'DCARTER', 'California', '650.507.6632');INSERT INTO commodities VALUES ('M001', 'DVD Player', 109); INSERT INTO commodities VALUES ('M002', 'Cereal', 03); INSERT INTO commodities VALUES ('M003', 'Scrabble', 29);INSERT INTO orders VALUES ('R001', 'C003', 'M002', 50, 150); INSERT INTO orders VALUES ('R002', 'C001', 'M003', 30, 87); INSERT INTO orders VALUES ('R003', 'C003', 'M001', 6, 654);
2).?修改數據:使用UPDATE?語句修改數據庫表中的數據行。執行以下語句將DVD播放器的單價從109美元更改為129美元:
UPDATE commodities SET unit_price = 129 WHERE commodity_name = 'DVD Player';
select * from commodities where UNIT_PRICE=129;
?
3).?刪除數據:使用DELETE?語句從數據庫表中刪除數據行。執行以下語句以刪除ORDERS表中的第一條記錄:
DELETE FROM orders WHERE order_id ='R001';
4.撤銷和保存記錄(事務)
1). 執行COMMIT語句以保存您在上一節中執行的數據操作事務。
承諾;

2). 執行以下語句以刪除訂單ID為R002的行,并查詢ORDERS?表以確保刪除該記錄。
DELETE FROM orders WHERE order_id ='R002';?SELECT * FROM orders;

輸出顯示記錄已成功刪除。?
3). 執行以下語句以撤消刪除訂單ID為R002的行,??并查詢表以顯示記錄:
ROLLBACK;?
SELECT * FROM orders;

之前的DELETE語句已回滾。
注意:使用COMMIT?語句永久保存事務后,無法撤消事務。
5. 刪除表
DROP TABLE?語句以從數據庫中刪除表及其數據
語法:DROP TABLE <table>;
1).?執行DROP TABLE語句以刪除CUSTOMERS表。?
DROP TABLE customers;
?
SQL> DROP TABLE ONLINE_SHOPPE.orders;
Table dropped.
由于CUSTOMER_ID?列上的引用完整性約束,將顯示錯誤消息。
2).??包括CASCADE CONSTRAINTS子句以刪除表及其參照完整性約束。
DROP TABLE customers CASCADE CONSTRAINTS;
6. 撤銷權限
執行REVOKE?語句以撤消用戶和角色系統特權。要撤消系統特權或角色,必須使用ADMIN OPTION為您分配特權。
1).?以SYS用戶身份連接到數據庫,并撤消ONLINE_SHOPPE的CREATE SESSION權限。
CONNECT sys/<password> as sysdba;
REVOKE CREATE SESSION FROM online_shoppe;
SQL> REVOKE CREATE SESSION FROM online_shoppe;Revoke succeeded.
2).?以ONLINE_SHOPPE身份連接到數據庫。
CONNECT online_shoppe/online;
?
您無法連接,因為您沒有CREATE SESSION權限。
?
?