Oracle编程入门经典 第2章 SQLPlus和基本查询
- 怎樣使用SQL*Plus工具連接數據庫以及執行查詢
- 怎樣配置SQL*Plus,以格式化查詢結果
- SQL語句的不同種類
- 怎樣在數據庫上編寫查詢來查看數據
- 怎樣修改存儲在數據庫中的數據
2.1 SQL*Plus簡介
SQL*Plus是一個用于連接Oracle數據庫的工具,具有可以滿足Oracle用戶和管理員需求的大量功能,包括:
- 在數據庫中執行SQL和PL/SQL
- 更新數據庫中的數據
- 執行數據查詢
- 將查詢結果集格式化為報表
- 建立、編輯、檢索和執行SQL腳本
- 幫助Oracle用戶調整SQL查詢
- 管理數據庫
- 描述數據庫中的表和PL/SQL對象
- 將數據從一個數據庫復制到另一個數據庫
- 向用戶發送消息,接受這些用戶的輸入
2.1.1 SQL、PL/SQL和SQL*Plus之間的區別
SQL:結構化查詢語言,或者是用來將數據放入數據庫,從數據庫檢索數據,控制事務處理以及管理數據庫的語言。
PL/SQL:Oracle的過程化編程語言,用戶可以使用它編寫在數據庫中執行的定制程序以及過程代碼。
SQL*Plus:是用戶可以用來編寫SQL和PL/SQL腳本的接口,即一個接口工具。
以賬戶(即用戶名稱):scott,默認密碼(即口令):tiger 登錄數據庫(創建數據庫,會自動分配一個演示賬號scott)
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 | SQL*Plus: Release 9.2.0.1.0 - Production on?星期六 12月 29 10:34:34 2012 Copyright (c) 1982, 2002, Oracle Corporation. All?rights reserved. 連接到: Oracle9i Enterprise Edition Release 9.2.0.1.0 - Production With?the Partitioning, OLAP and?Oracle Data Mining options JServer Release 9.2.0.1.0 - Production SQL> select?* from?dept; DEPTNO DNAME LOC ---------- -------------- ------------- 10 ACCOUNTING NEW YORK 20 RESEARCH DALLAS 30 SALES CHICAGO 40 OPERATIONS BOSTON SQL> begin 2 for?cur in?(select?* from?DEPT) loop 3 dbms_output.put_line(cur.dname || ' is the department name now.'); 4 end?loop; 5 end; 6 / PL/SQL 過程已成功完成。 SQL> |
2.1.2 啟動SQL*Plus
1. 命令行模式的SQL*Plus
- Unix:$ORACLE_HOME/bin/sqlplus
- Windows:%ORACLE_HOME5/bin/sqlplus.exe
這個目錄應該在用戶的PATH環境變量中。
- SYS是數據詞典的所有者,只應用于管理的目的。SYS的默認密碼是CHANGE_ON_INSTALL。
- SYSTME是一個管理員賬號。SYSTEM的默認密碼是MANAGER。
- SCOTT是一個演示賬號。SCOTT的默認密碼是TIGER。
試驗:連接Oracle
(1) 在DOS或者XTERM中,在提示符下輸入sqlplus,打開一個SQL*Plus會話。
(2) 使用用戶名SCOTT和密碼TIGER登錄。
工作原理
2. 通過網絡連接
配置C:\oracle\ora92\network\ADMIN的文件sqlnet.ora
| 1 2 3 4 5 6 7 8 9 | # SQLNET.ORA Network Configuration File: C:\oracle\ora92\network\admin\sqlnet.ora # Generated by?Oracle configuration tools. # NAMES.DEFAULT_DOMAIN = Infomation # SQLNET.AUTHENTICATION_SERVICES= (NTS) NAMES.DIRECTORY_PATH= (TNSNAMES, ONAMES, HOSTNAME) |
啟動配置助理Oracle Net Configuration Assistant,如下圖所示:
2.2 快速而簡單地查詢數據庫
試驗:
啟動SQL*Plus,使用密碼TIGER,作為SCOTT連接數據庫(或以win+R,輸入sqlplus)。
| 1 2 3 4 5 6 7 8 9 10 11 12 13 | SQL> select?table_name from?user_tables; TABLE_NAME ------------------------------ BONUS DEPT EMP SALGRADE |
工作原理
USER_TABLES是Oracle數據詞典中的一個視圖。當SQL*Plus中遇到排版亂序(如行不夠顯示)特殊問題的時候,可以有三種選擇:
- 忍受它。
- 查詢少量的列。
- 格式化結果(用戶可以讓標題每10、100、10000行重復一次或者根本不重復)。
2.2.1 格式化用戶結果
1. COLUMN
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 | SQL> select?ename,sal from?emp where?ename like?'A%' 2 / ENAME SAL ---------- ---------- ALLEN 1600 ADAMS 1100 SQL> column?sal format $9,999.99 SQL> select?ename,sal from?emp where?ename like?'A%' 2 / ENAME SAL ---------- ---------- ALLEN $1,600.00 ADAMS $1,100.00 SQL> describe user_objects 名稱 是否為空? 類型 ----------------------------------------- -------- ---------------- OBJECT_NAME VARCHAR2(128) SUBOBJECT_NAME VARCHAR2(30) OBJECT_ID NUMBER DATA_OBJECT_ID NUMBER OBJECT_TYPE VARCHAR2(18) CREATED DATE LAST_DDL_TIME DATE TIMESTAMP?VARCHAR2(19) STATUS VARCHAR2(7) TEMPORARY?VARCHAR2(1) GENERATED VARCHAR2(1) SECONDARY VARCHAR2(1) |
2. PAUSE
| 1 2 3 4 5 6 7 | SQL> set?pause on 一頁之后,停止滾屏 SQL> set?pause off 全部顯示(一頁的大小默認PAGESIZE是14) |
3. PAGESIZE
試驗:設置用戶頁面大小
從數據詞典的ALL_OBJECTS視圖中選擇ROWNUM和OBJECT_NAME。
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 | SQL> set?pagesize 10 SQL> select?rownum,object_name from?all_objects where?rownum<20 2 / ROWNUM OBJECT_NAME ---------- ------------------------------ 1 /1005bd30_LnkdConstant 2 /10076b23_OraCustomDatumClosur 3 /10297c91_SAXAttrList 4 /103a2e73_DefaultEditorKitEndP 5 /10501902_BasicFileChooserUINe 6 /105072e7_HttpSessionBindingEv 7 /106ba0a5_ArrayEnumeration ROWNUM OBJECT_NAME ---------- ------------------------------ 8 /106faabc_BasicTreeUIKeyHandle 9 /10744837_ObjectStreamClass2 10 /1079c94d_NumberConstantData 11 /10804ae7_Constants 12 /108343f6_MultiColorChooserUI 13 /10845320_TypeMapImpl 14 /10948dc3_PermissionImpl ROWNUM OBJECT_NAME ---------- ------------------------------ 15 /1095ce9b_MultiComboBoxUI 16 /109a284b_OracleXMLStaticQuery 17 /109cbb8e_SpanShapeRendererSim 18 /10a45bfe_ProfilePrinterErrors 19 /10a793fd_LocaleElements_iw 已選擇19行。 19條記錄,2頁,這里顯示屏幕大小占10行。 |
3. LINESIZE
LINESIZE默認為80。通過此方式,用戶不會因為輸出數據超過了窗口的右邊限制而遺失數據。
4. FEEDBACK
查詢結果末尾輸出N行。
| 1 2 3 4 5 6 7 8 9 10 11 12 13 | SQL> show feedback 用于6或更多行的 FEEDBACK ON SQL> select?empno,ename,job from?emp where?rownum<7; SQL> set?feedback off SQL> select?empno,ename,job from?emp where?rownum<7; SQL> set?feedback 3 SQL> select?empno,ename,job from?emp where?rownum<3; |
5. NUMFOFRMAT
| 1 2 3 4 5 | NUMFORMAT的默認值是10。 SQL> set?numformat 9999999.99 SQL> select?sal from?emp; |
6. LONG
LONG的默認值是80.如果用戶要查詢具有LONG列的表或者視圖,那么就只會顯示這個特定列的前80個字符。如果使LONG列更長,就可以顯示這個列中的更多數據。
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | SQL> select?text from?all_views where?view_name='USER_TABLES'; TEXT --------------------------------------------------------------------- select?o.name, decode(bitand(t.property, 4194400), 0, ts.name, null), decode(bitand(t.propert SQL> set?pagesize 1000; SQL> set?long 10000; SQL> select?text from?all_views where?view_name='USER_TABLES'; |
2.3 什么是SQL
SQL不是Oracle的專有技術;它是關系數據庫管理系統的標準語言(最早是由IBM在二十世紀70年代建立,并于隨后被ANSI/ISO標準化組織采納,并被進一步提煉和升華。
SQL-92 ANSI標準的SQL標準中共有四個層次:
(1) 入門層次。大多數供應商所構建的SQL引擎都會符合層次1.
(2) 過濾層次。隨著特性要求的增加,過濾層次介于入門層次和中間層次之間。
(3) 中間層次。中間層次的SQL-92兼容層次要求在數據庫中提供大量超過了入門或者過濾兼容性的新特性。這些特性包括但不局限于如下內容:
- 動態SQL
- 用于參照完整性的級聯刪除
- DATE和TIME數據類型
- 域
- 可變長度字符串
- CASE表達式
- 數據類型之間的CAST函數
(4) 完全。這是最高和最終級別的ANSI SQL-92兼容層次。它向中間層次的標準又增加了更多的特性,這些特性包括但不局限于如下內容:
- 連接管理
- BIT字符串數據類型
- 可延遲完整性約束
- FROM子句中的派生表
- CHECK子句中的子查詢
- 臨時表
以下的列表展示了用戶在使用Oracle的時候將會使用不同類型的SQL:
- 數據操作語言(DML)
- 數據定義語言(DDL)
- 事務處理控制語句
- 會話控制語句
- 系統控制語句
2.4 表中內容
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | DESCRIBE <TABLE_NAME> or?DESC?<TABLE_NAME> 試驗:描述表 SQL> describe dept; 名稱 是否為空? 類型 ----------------------------------------- -------- ------------- DEPTNO NOT?NULL?NUMBER(2) DNAME VARCHAR2(14) LOC VARCHAR2(13) |
2.5 數據操作語言
2.5.1 查詢
SELECT句子有:
- WITH
- SELECT
- FROM
- WHERE
- GROUP BY
- HAVING
- ORDER BY
2.5.2 WHERE子句
| 1 | select?<columns> from?<data table> where?<conditional_expression>; |
- A=B
- B
- A<B
- A!=B;A<>B
- BETWEEN A AND B
- A LIKE B
- A NOT <條件表達式>
1. 二元操作符
AND
2. 操作符和條件的優先級
操作優先級:
- :=、-。
- *、/。
- +、-,||。
條件優先級:
- =、!=、<、>、<=、>=。
- IS [NOT] NULL、LIKE、[NOT] BETWEEN、[NOT] IN、EXISTS。
- NOT。
- AND。
- OR。
3. 使用WHERE子句聯接表
| 1 | select?a.*,b.* from?a,b where?a.ID=b.ID |
4. 理解NULL
NULL是一個用來描述沒有定義的內容的術語。NULL列意味著沒有向列賦值。
在Oracle中,當執行IF COL_A=<某個值>這樣的條件操作時,可能的返回值是TURE、FALSET UNKNOWN。
是否為空,用IS NULL或IS NOT NULL判斷。
5. ORDER用戶結果
| 1 | order?by?<columns,columns..> |
6. GROUP BY和HAVING
GROUP BY 子句可以用于在查詢結果集中對記錄進行分組,以匯總數據或者為整個組顯示單選的匯總信息。
HAVING用戶可以隨同GROUP BY子句提供一個附加的子句,來過濾GROUP BY查詢所返回的行組。這個HAVING子句只能夠用于使用了GROUP BY子句的查詢,并且通常會包含一個SQL集函數,例如AVG、SUM、MAX等。
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 | SQL> select?empno,avg(sal) from?emp group?by?empno having?avg(sal)>=1000; EMPNO AVG(SAL) ---------- ---------- 7499 1600 7521 1250 7566 2975 7654 1250 7698 2850 7782 2450 7788 3000 7839 5000 7844 1500 7876 1100 7902 3000 7934 1300 已選擇12行。 |
2.5.3 聯接
笛卡爾積
| 1 | SQL> select?t1.empno,t2.dname,t2.loc,t1.ename from?emp t1,dept t2 where?t1.deptno=t2.deptno; |
1. 表別名
表別名(以前稱為相關名稱)是在FROM子句中用于各個表的“簡短名稱”,它們可以唯一地標識數據源,而且可以使用縮寫。
2. 列表名
查詢中的列也可以被賦予別名。
3. Oracle 9i 中的ANSI聯接
用戶能夠執行的不同類型的聯接如下所示:
- 自然聯接
- 內連接
- 外聯接
- 左聯接
- 右聯接
- 完全聯接
4. 自然聯接
使用自然聯接兩個表的時候,Oracle就會將第一個表中的那些列與第二個表中具有相同名稱的列進行聯接。
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 | SQL> select?empno,dname,loc,ename,sal from?emp natural join?dept where?sal>1000; EMPNO DNAME LOC ENAME SAL ---------- -------------- ------------- ---------- ---------- 7499 SALES CHICAGO ALLEN 1600 7521 SALES CHICAGO WARD 1250 7566 RESEARCH DALLAS JONES 2975 7654 SALES CHICAGO MARTIN 1250 7698 SALES CHICAGO BLAKE 2850 7782 ACCOUNTING NEW YORK CLARK 2450 7788 RESEARCH DALLAS SCOTT 3000 7839 ACCOUNTING NEW YORK KING 5000 7844 SALES CHICAGO TURNER 1500 7876 RESEARCH DALLAS ADAMS 1100 7902 RESEARCH DALLAS FORD 3000 7934 ACCOUNTING NEW YORK MILLER 1300 已選擇12行。 |
自然聯接是一個理論上很好,但是實際應用性很差的特性示例。各個表中的聯接列都必有要具有相同的名稱。這將會強制設計者將要聯接表的相關列命名為與所聯接的表具有相同的名稱。
5. 內聯接
內聯接就像自然聯接一樣,要在FROM子句中使用聯接條件。雙表中其中一個條關鍵聯接列沒有值,則不顯示該記錄。
| 1 | Select?<columns> from?<data table> inner?join?<data table> where?<conditional_expression> |
6. 外聯接
外聯接擴展了內聯接的結果。外聯接的結果將會是所有滿足聯接條件的行,以及存在于一個表中的一些行,它們在其他表中沒有相應的行來滿足聯接條件。
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 | Select?<columns> from?<data table> left/right?outer?join?<data table> on?<conditional_expression> SQL> select?empno,dname,loc,ename,sal from?emp left?outer?join?dept on?emp.deptno=dept.deptno; EMPNO DNAME LOC ENAME SAL ---------- -------------- ------------- ---------- ---------- 7934 ACCOUNTING NEW YORK MILLER 1300 7839 ACCOUNTING NEW YORK KING 5000 7782 ACCOUNTING NEW YORK CLARK 2450 7902 RESEARCH DALLAS FORD 3000 7876 RESEARCH DALLAS ADAMS 1100 7788 RESEARCH DALLAS SCOTT 3000 7566 RESEARCH DALLAS JONES 2975 7369 RESEARCH DALLAS SMITH 800 7900 SALES CHICAGO JAMES 950 7844 SALES CHICAGO TURNER 1500 7698 SALES CHICAGO BLAKE 2850 7654 SALES CHICAGO MARTIN 1250 7521 SALES CHICAGO WARD 1250 7499 SALES CHICAGO ALLEN 1600 |
7. 自聯接
在用戶建立的一些表中,用戶可能會擁有所謂的自引用外鍵。這意味著一個列可以是相同表主鍵的一個外鍵。
2.5.4 集合操作符
通過使用四個集合操作符UNION、UNIONALL、INTERSECT和MINUS,Oracle提供將兩個或者多個SQL查詢結合進一個單獨的語句的能力。
使用集合操作符的查詢稱為復合查詢(compound query)。Oracle提供了一些編寫復合查詢時需要遵循的指南:
- 在構成復合查詢的各個單獨的查詢中,SELECT表中值的數量和數據類型必須相匹配。
- 用戶不許在復合查詢所包含的任何單獨的查詢中規定ORDER BY子句。
- 用戶不許在BLOB、LONG這樣的大數據對象上使用集合操作符。
- 用戶不許在集合操作符SELECT列表中使用嵌套或者數組這樣的集合。
1. UNION
UNION語句可以將第一個查詢中的所有行與第二個查詢的所有行相加,消除重復行并且返回結果。
| 1 2 3 4 5 6 7 8 9 10 11 | SQL> select?empno,ename,job from?emp where?ename like?'F%'?union?select?empno,ename,job from?emp where?ename like?'A%'; EMPNO ENAME JOB ---------- ---------- --------- 7499 ALLEN SALESMAN 7876 ADAMS CLERK 7902 FORD ANALYST |
2. UNION ALL
UNION ALL語句與標準的UNION語句工作方式基本相同,只是不會從列表中濾除重復行。
| 1 2 3 4 5 6 7 8 9 10 11 | SQL> select?empno,ename,job from?emp where?ename like?'F%'?union?all?select?empno,ename,job from?emp where?ename like?'A%'; EMPNO ENAME JOB ---------- ---------- --------- 7902 FORD ANALYST 7499 ALLEN SALESMAN 7876 ADAMS CLERK |
3. INTERSECT
INTERSECT這個集合操作符會獲取兩個查詢,對值進行匯總,并且返回同時存在于兩個結果集中的記錄。
| 1 2 3 4 5 6 7 8 9 | SQL> select?empno,ename,job from?emp where?ename like?'F%'?or?ename like?'A%'?intersect?select?empno,ename,job from?emp where?ename like?'A%'; EMPNO ENAME JOB ---------- ---------- --------- 7499 ALLEN SALESMAN 7876 ADAMS CLERK |
4. MINUS
MINUS集合操作符會返回所有從第一個查詢中的記錄,但是沒有從第二個查詢中返回的那些記錄。
| 1 2 3 4 5 6 7 | SQL> select?empno,ename,job from?emp where?ename like?'F%'?or?ename like?'A%'?minus select?empno,ename,job from?emp where?ename like?'A%'; EMPNO ENAME JOB ---------- ---------- --------- 7902 FORD ANALYST |
2.6 其它DML語句
2.6.1 INSERT語句
| 1 | SQL> insert?into?dept values(50,'INFORMATION','CHINA'); |
2.6.2 UPDATE語句
| 1 | SQL> update?dept set?DNAME='OPERATION'?where?deptno=40; |
2.6.3 DELETE語句
| 1 | SQL> delete?from?dept where?deptno=40; |
2.7 提交和回滾
在Oracle中,在用戶通知Oracle完成之前,用戶對數據所做的改變(例如,INSERT、UPDATE、DELETE)都不會永久改變。這可以使用COMMIT的SQL語句完成。
當用戶在數據庫中改變數據的時候,用戶可能會發現有的時候會因為這樣或者那樣的原因,需要撤銷已經進行的改變。用戶可以使用ROLLBACK語句。
試驗:提交改變
另打開一個會話(即打開2個會話),用相同帳戶登錄,第一個會話插入一條記錄,第二個會話查詢。
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 | SQL> insert?into?dept values(50,'OPERATIONS','BOSTON'); 已創建 1 行。 SQL> select?* from?dept; DEPTNO DNAME LOC ---------- -------------- ------------- 10 ACCOUNTING NEW YORK 20 RESEARCH DALLAS 30 SALES CHICAGO 40 OPERATIONS BOSTON 50 OPERATIONS BOSTON SQL> |
第一個會話未COMMIT前,第二個會話的記錄:
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 | SQL*Plus: Release 9.2.0.1.0 - Production on?星期一 12月 31 08:47:08 2012 Copyright (c) 1982, 2002, Oracle Corporation. All?rights reserved. 連接到: Oracle9i Enterprise Edition Release 9.2.0.1.0 - Production With?the Partitioning, OLAP and?Oracle Data Mining options JServer Release 9.2.0.1.0 - Production SQL> select?* from?dept; DEPTNO DNAME LOC ---------- -------------- ------------- 10 ACCOUNTING NEW YORK 20 RESEARCH DALLAS 30 SALES CHICAGO 40 OPERATIONS BOSTON SQL> |
第一個會話:
| 1 | SQL> commit; |
第二個會話的記錄:
SQL> select * from dept;
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | DEPTNO DNAME LOC ---------- -------------- ------------- 10 ACCOUNTING NEW YORK 20 RESEARCH DALLAS 30 SALES CHICAGO 40 OPERATIONS BOSTON 50 OPERATIONS BOSTON SQL> |
工作原理
在我們的第一個會話沒有提交事務處理之前,不能在第二個會話中看到對多張表所做的改變。一旦使用COMMIT語句在我們的第一個會話中完成了事務處理,那么我們就能夠立即在第二個會話中看到數據。
2.8 回滾
回滾事務和提交事務相似,即使用ROLLBACK便可對未提交的事務進行回滾。
2.9 小結
文章根據自己理解濃縮,僅供參考。
摘自:《Oracle編程入門經典》 清華大學出版社?http://www.tup.com.cn/
from:?http://www.cnblogs.com/yongfeng/archive/2013/01/06/2846983.html
總結
以上是生活随笔為你收集整理的Oracle编程入门经典 第2章 SQLPlus和基本查询的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Oracle编程入门经典 第1章 了解O
- 下一篇: Oracle编程入门经典 第3章 建立以