1. 程式人生 > >Oracle 基礎知識 詳解

Oracle 基礎知識 詳解

DDL : 資料庫模式定義語言,關鍵字:createDML : 資料操縱語言,關鍵字:Insert、delete、updateDCL : 資料庫控制語言 ,關鍵字:grant、removeDQL : 資料庫查詢語言,關鍵字:select結構化查詢語言 (Structured Query Language, SQL),Oracle 中的 SQL 不區分大小寫只有在文字數字值得時候才會檢查注 : 當建立表或列名的時候使用雙引號括起來就可以建立大小寫敏感的列名或表名,但是不推薦這樣做SQL*Plus 是 Oracle 的一種操作資料庫資料和對資料庫執行即時查詢的工具,甚至還可以作為程式碼生成器來使用邏輯判斷 : = > >= < <= != ^= <>!= ^= <> 這3個都表示不等於注 : 在進行資料型別比較時,一定要考慮編碼情況,VARCHAR2 和 CHAR 是字元比較,如果列資料型別為 NUMBER 則 12 > 9,如果是字元比較則 9 > 12 因為字元 9 比字元 1要大DESCRIBE : 查詢表結構SQL> describe newspaper;LIKE 執行模式匹配 : _表示一個字元  %表示任意多個字元NULL 表示該列是否存在資料,如果沒有資料,就說明該列是 nullIS NULL,IS NOT NULLIN : 在某幾個指定項中NOT IN : 不在幾個指定項中BETWEEN AND : 在指定範圍之間NOT BETWEEN AND : 不在指定範圍之間AND : 同事滿足兩邊的條件OR : 只滿足其中一邊的條件優先順序 : () 優先順序最高,乘除次之,加減法最後,AND 的優先順序高於 OR
使用 CREATE TABLE 關鍵字建立表SQL> CREATE TABLE trouble(city VARCHAR2(13) NOT NULL,sample_date DATE NOT NULL,noon NUMBER(3,1),midnight NUMBER(3,1),precipitation NUMBER);表明和列名必須以由字母、數字和下劃線,長度為1~30個,並且名稱必須唯一,不使用雙引號括起來時不考慮字母大小寫,使用雙引號括起來時就要考慮大小寫,建議不要括起來否則可能會給開發人員和使用者造成麻煩在設計表時需要考慮字元(CHAR 和 VARCHAR2)的最大寬度,並設定 NUMBER 精度注 : 1> 使用寬的 VARCHAR2 儲存資料不會浪費空間,但是會對預設的 SQL*Plus 列格式產生影響
       2> NUMBER(3,1) 3表示儲存數字位數,1表示小數點右邊的位數 小數部分的長度比較大會進行四捨五入來達到指定精度定義約束 : 表新增的約束越多那麼維護資料的工作就越少,但更新資料花的時間就越長1> 候選鍵(condidation key) : 是一列或多列的組合,其唯一地標識表中的一行SQL> CREATE TABLE trouble(     city VARCHAR2(13) NOT NULL,     sample_date DATE NOT NULL,     noon NUMBER(4,1),     midnight NUMBER(4,1),
     precipitation NUMBER,CONSTRAINT trouble_uq UNIQUE(city,sample_date)     );建立 UNIQUE 約束時,將建立唯一地索引來強制值得唯一性。在主鍵約束中,主鍵的列中至少有一列必須是 NOT NULL2> 主鍵(primary key) : 具有特殊性質的候選鍵之一,可以僅有一個主鍵,並且主鍵列不能包含 NULL 值SQL> CREATE TABLE trouble(     city VARCHAR2(13),     sample_date DATE,     noon NUMBER(4,1),     midnight NUMBER(4,1),     precipitation NUMBER,CONSTRAINT trouble_pk PRIMARY KEY(city,sample_date)     );# 對於但主鍵,可以使用如下方式定義SQL> CREATE TABLE author(     author_name VARCHAR2(50) PRIMARY KEY,     comments VARCHAR2(100)     );3> 指定索引表空間 : UNIQUE約束和 PRIMARY KEY 約束建立索引,索引預設儲存在表空間中SQL> CREATE TABLE author2(     author_name VARCHAR2(50),     comments VARCHAR2(100),CONSTRAINT author2_pk PRIMARY KEY(author_name) USING INDEX TABLESPACE USERS     )注 : 在大多數預設安裝中,會建立 USERS 表空間,他是預設表空間    <1> 外來鍵(foreign key) : 也叫完整性約束,指明外來鍵值對應另一個表中主鍵的實際值SQL> CREATE TABLE bookshelf(     title VARCHAR2(100) PRIMARY KEY,     publisher VARCHAR2(20),     category_Name VARCHAR2(20),     rating VARCHAR2(2),CONSTRAINTbookshelf_fk FOREIGN KEY(category_Name) FERENCES category(category_name));    <2> CHECK約束 : 指定某個表示式,表示式對於表中的每一行資料都必須始終為真SQL> CREATE TABLE rating_with_check(     rating NUMBER(1) CHECK(rating<=8),     rating_description VARCHAR2(50)     );4> 命名約束 : 可以對約束命名,如果約束名使用一種有效的命名模式,能更好地識別和管理約束。約束名應該標識出它所作用的表和它所表示的約束型別。建立時如果沒有指定約束名稱,Oracle 會生成名稱大多以 SYS_C##### 的形式因此最好自己命名刪除表 : 使用 DROP TABLE table_name 即可SQL> DROP TABLE trouble;使用 TRUNCATE 可以高效的刪除表中的所有資料並回收空間,而不從資料庫中刪除刪除表的定義從  Oracle10g 開始,刪除表仍保留表空間,可以在 "回收站" 中來訪問,如果要從回收站中清除,使用 PURGE 子句SQL> DROP TABLE trouble PURGE;如果表已經刪除,可以從 "回收站" 中清除所佔的空間SQL> PURGE TABLE trouble;清除 "回收站" 中所有內容SQL> PURGE RECYCLEBIN;截斷表SQL> TRUNCATE TABLE trouble;更改表新增或更改列的規則1> 可隨時增加字元列寬度2> 可隨時增加 NUMBER 列的數字位數3> 可隨時增加或減少 NUMBER 列中的小數位數,對於減少的情況需要表為空如果表中每一行的某一列都為 NULL,可作如下更改1> 可以更改該列的資料型別2> 可以減少字元列的寬度3> 減少 NUMBER 列的數字位數注 : 新增或更改列,更改後的列的每一行資料必須滿足更改後列的資料限定,否則將會更改失敗新增列語法 : alter table  表名  add (欄位  欄位型別)  [ default  '輸入預設值']  [null/not null]在空表中可以直接新增非空列SQL> ALTER TABLE trouble ADD(     condition VARCHAR2(9) NOT NULL DEFAULT 'no',     wind NUMBER(3)     );在有資料的表中新增非空列會出現 table must be empty to add mandatory (NOT NULL) column 錯誤,因為新新增的列為空,可以先不新增 NO NULL 增加完列後修改這列使之有資料然後再修改列增加 NO NULLSQL> ALTER TABLE trouble ADD(     condition VARCHAR2(9),     wind NUMBER(3)     );SQL> UPDATE trouble SET condition='no';SQL> ALTER TABLE trouble MODIFY(condition VARCHAR2(9) NOT NULL);更改列SQL> DESCRIBE trouble;Name          Type         Nullable Default Comments------------- ------------ -------- ------- --------CITY          VARCHAR2(13)                           SAMPLE_DATE   DATE                                   NOON          NUMBER(4,1)  Y                         MIDNIGHT      NUMBER(4,1)  Y                         PRECIPITATION NUMBER       Y                         CONDITION     VARCHAR2(9)                            WIND          NUMBER(3)    Y                         SQL> ALTER TABLE trouble MODIFY(city VARCHAR2(17));SQL> DESCRIBE trouble;Name          Type         Nullable Default Comments------------- ------------ -------- ------- --------CITY          VARCHAR2(17)                           SAMPLE_DATE   DATE                                   NOON          NUMBER(4,1)  Y                         MIDNIGHT      NUMBER(4,1)  Y                         PRECIPITATION NUMBER       Y                         CONDITION     VARCHAR2(9)                            WIND          NUMBER(3)    Y                         設定表只讀設定表只讀這樣就可以限制表的 INSERT、UPDATE 和 DELETE 操作SQL> INSERT INTO trouble(city,sample_date) VALUES('武漢',SYSDATE);1 row insertedSQL> ALTER TABLE trouble READ ONLY;Table alteredSQL> INSERT INTO trouble(city,sample_date) VALUES('成都',SYSDATE);INSERT INTO trouble(city,sample_date) VALUES('成都',SYSDATE)ORA-12081: update operation not allowed on table "C##CHENSHUN"."TROUBLE"# 恢復表可讀可寫SQL> ALTER TABLE trouble READ WRITE;Table alteredSQL> INSERT INTO trouble(city,sample_date) VALUES('成都',SYSDATE);1 row inserted刪除列刪除列比新增或修改列更復雜,因為 Oracle 必須執行一些額外工作。刪除表中一列很簡單,複雜的是恢復列佔用的空間。將該列標記為 "unused" 稍後再刪除,不會影響效能。如果立即刪除,該操作會影響效能。可以使用 ALTER TABLE命令SQL> SELECT* FROM trouble;CITY              SAMPLE_DATE  NOON MIDNIGHT PRECIPITATION CONDITION WIND----------------- ----------- ----- -------- ------------- --------- ----Pleasant Lake     2011-3-21    40.0     -1.3           3.6 no        Pleasant Lake     2011-9-23    92.9     79.6       1.00003 no        Pleasant Lake     2011-12-22  -17.4    -10.4           2.4 no        武漢               2018-1-29 1                                        成都               2018-1-29 1                                        SQL> ALTER TABLE trouble DROP COLUMN wind; # 刪除多列 ALTER TABLE trouble DROP (wind,condition);Table alteredSQL> SELECT * FROM trouble;CITY              SAMPLE_DATE  NOON MIDNIGHT PRECIPITATION CONDITION----------------- ----------- ----- -------- ------------- ---------Pleasant Lake     2011-3-21    40.0     -1.3           3.6 noPleasant Lake     2011-9-23    92.9     79.6       1.00003 noPleasant Lake     2011-12-22  -17.4    -10.4           2.4 no武漢               2018-1-29 1                              成都               2018-1-29 1                              標記列為 UNUSED,此時該列無法讀取但空間不會釋放,除非使用 DROP 刪除列SQL> SELECT * FROM trouble;CITY              SAMPLE_DATE  NOON MIDNIGHT PRECIPITATION CONDITION----------------- ----------- ----- -------- ------------- ---------Pleasant Lake     2011-3-21    40.0     -1.3           3.6 noPleasant Lake     2011-9-23    92.9     79.6       1.00003 noPleasant Lake     2011-12-22  -17.4    -10.4           2.4 no武漢               2018-1-29 1                              成都               2018-1-29 1                              SQL> ALTER TABLE trouble SET UNUSED COLUMN condition;Table alteredSQL> SELECT * FROM trouble;CITY              SAMPLE_DATE  NOON MIDNIGHT PRECIPITATION----------------- ----------- ----- -------- -------------Pleasant Lake     2011-3-21    40.0     -1.3           3.6Pleasant Lake     2011-9-23    92.9     79.6       1.00003Pleasant Lake     2011-12-22  -17.4    -10.4           2.4武漢               2018-1-29 1                成都               2018-1-29 1                SQL> ALTER TABLE trouble DROP UNUSED COLUMNS;Table altered根據一個表建立另一個表,同時拷貝對應的資料SQL> CREATE TABLE rain_table AS SELECT city,precipitation FROM trouble WHERE city IS NOT NULL;Table createdSQL> SELECT * FROM rain_table;CITY              PRECIPITATION----------------- -------------Pleasant Lake               3.6Pleasant Lake           1.00003Pleasant Lake               2.4武漢               成都               建立索引組織表索引有兩個主要用途 :1> 強制唯一性 : 在建立 PRIMARY KEY 或 UNIQUE 結束時,Oracle 建立索引來強調索引列的唯一性2> 改善效能 : 當某個查詢使用索引時查詢效能將顯著改善根據表的主鍵列值對資料進行排序,索引組織表儲存資料時就像整個表儲存在一個索引中。普通索引只儲存索引列,而索引組織表則在索引中儲存表中的所有列# 經常通過 city,sample_date 建立索引那麼在這兩個欄位上建立索引非常合適SQL> CREATE TABLE trouble_iot(     city VARCHAR2(13),     sample_date DATE,     noon NUMBER(4,1),     midnight NUMBER(4,1),     precipitation NUMBER,     CONSTRAINT trouble_iot_pk PRIMARY KEY(city,sample_date) ORGANIZATION INDEX     );如果索引對應的列資料頻繁更改,那麼就使用普通表檢視檢視不是為了方便檢視,也不是看起來像新表,而是可以重新命名,同時可以像表一樣進行處理,可用於多張表級聯查詢建立檢視 :  CREATE VIEW [檢視名] AS 檢視名SQL> CREATE OR REPLACE VIEW newsView AS SELECT feature,section,page FROM newspaper WHERE page IN(SELECT page FROM newspaper WHEREsection='M') ORDER BY page;檢視檢視結構SQL> DESCRIBE newsView;檢視可以像普通表一樣查詢,其對多表的查詢被隱藏注 : 1> 檢視不包含任何資料,表包含資料,儘管可以建立包含資料的 “物化檢視”,但它們是真實的表,而不是檢視       2> 在查詢表資料的時候,查詢的欄位以及少選擇條件中的欄位必須在檢視中,否則會導致查詢資料失敗修改檢視的基表,檢視仍然可見但是檢視也會發生對應的改變可以通過檢視修改基表中的資料,建立只讀是檢視就無法修改SQL> CREATE OR REPLACE VIEW rein_read_only AS SELECT * FROM trouble WITH READ ONLY;SQL> INSERT INTO rein_read_only VALUES('北京',SYSDATE,1,2,3);INSERT INTO rein_read_only VALUES('北京',SYSDATE,1,2,3)ORA-42399: cannot perform a DML operation on a read-only view資料型別包含 字母、數字、空格以及其它符號 (如標點符號、特殊字元) 的串稱為字串CHAR 定長字串,有利於查詢,插入的字元小於指定長度,將使用空格填充,在進行資料比較時會先比較空格長度是否相等 再進行比較注 : CHAR 使用空格填充,填充的位置是在字串結尾填充VARCHAR 和 VARCHAR2 變長字串,能很好的節省空間,這兩個關鍵字是同義的,在以後的 ORacle 版本中會有所變化應儘量使用 VARCHAR2串函式|| : 將兩個串連線在一起,"|" 符號被稱為豎線或管道符CONCAT : 連線兩個字串,功能和 || 相同,只接收兩個引數SQL> SELECT FEATURE||'-'||SECTION||'-'||PAGE FROM newspaper;SQL> SELECT FEATURE || '-' || SECTION || '-' || PAGE FROM newspaper; # 和上一句效果等同SQL> SELECT CONCAT(CONCAT(CONCAT(CONCAT(FEATURE, '-'), SECTION), '-'), PAGE) FROM newspaper;INITCAP : 所有字串首字母大寫LOWER : 轉換成小寫UPPER : 轉換成大寫# 首字母大寫SQL> select FEATURE, INITCAP(FEATURE) from newspaper where PAGE=8;FEATURE         INITCAP(FEATURE)--------------- ----------------Winw            WinwFEATURE point   Feature Point# 將字串轉換成 大寫 小寫SQL> SELECT FEATURE,UPPER(FEATURE),LOWER(FEATURE) FROM newspaper;LENGTH : 字串長度SQL> SELECT FEATURE,LENGTH(FEATURE) FROM newspaper;SQL> SELECT FEATURE FROM newspaper ORDER BY LENGTH(FEATURE); # 按字元長度遞增排序SQL> SELECT FEATURE FROM newspaper WHERE LENGTH(FEATURE) < 10; # 獲取小於 10 個字元的資料LPAD : 指定字元長度的空間,多餘的空間在左邊使用指定字元填充,如果字元長度超過指定長度字串尾部多餘的資料將會被擷取,預設使用空格填充也就是沒有第3個引數RPAD : 指定字元長度的空間,多餘的空間在右邊使用指定字元填充,如果字元長度超過指定長度字串尾部多餘的資料將會被擷取,預設使用空格填充也就是沒有第3個引數SQL> SELECT FEATURE,LPAD(FEATURE, 10, '.'),RPAD(FEATURE, 10, '-') FROM newspaper;FEATURE         LPAD(FEATURE,10,'.')                     RPAD(FEATURE,10,'-')--------------- ---------------------------------------- ----------------------------------------Births          ....Births                               Births----Memo            ......Memo                               Memo------Cat             .......Cat                               Cat-------KK              ........KK                               KK--------FEATURE point   FEATURE po                               FEATURE po5 rows selectedLTRIM : 去掉字串左邊的字元,如果操作的是多行字串,會將多行字串的每一行進行處理,接收兩個引數,第二個引數可接收多個字元RTRIM : 去掉字串右邊的字元,如果操作的是多行字串,會將多行字串的每一行進行處理,接收兩個引數,第二個引數可接收多個字元TRIM : 擷取兩邊的字串,只接收一個引數,且只能設定一個字元SQL> SELECT FEATURE,LTRIM(FEATURE, 'BS'),RTRIM(FEATURE, 'sr'),TRIM('B' FROM FEATURE) FROM newspaper;FEATURE         LTRIM(FEATURE,'BS') RTRIM(FEATURE,'SR') TRIM('B'FROMFEATURE)--------------- ------------------- ------------------- --------------------Births          irths               Birth               irthsBridge          ridge               Bridge              ridgeSky             ky                  Sky                 SkyScape           cape                Scape               ScapeWinw            Winw                Winw                WinwDesk            Desk                Desk                DeskBoss            oss                 Bo                  ossMember          Member              Membe               MemberMemo            Memo                Memo                MemoCat             Cat                 Cat                 CatKK              KK                  KK                  KKFEATURE point   FEATURE point       FEATURE point       FEATURE point12 rows selectedSUBSTR : 擷取字串,第二個引數指定開始地方 (基於1)如果是負數則從末尾開始計算,如果沒有第三個引數那麼將擷取剩餘引數,如果由第三個引數則表示指定擷取字串的長度SQL> SELECT FEATURE,SUBSTR(FEATURE, 2),SUBSTR(FEATURE, 2, 4) FROM newspaper;FEATURE         SUBSTR(FEATURE,2)                                        SUBSTR(FEATURE,2,4)--------------- -------------------------------------------------------- -------------------Births          irths                                                    irthBridge          ridge                                                    ridgMemo            emo                                                      emoCat             at                                                       atKK              K                                                        KFEATURE point   EATURE point                                             EATU6 rows selected注 : 對於 CHAR 型別,由於其是定長會使用空格填充,若其位置使用負數,將會從列的末尾確定開始位置,而不是從字串末尾開始確定數值處理在 Oracle 中,數值列可以沒有任何值,此時的值是 NULL  而不是 0,是空值,這在計算中相當有意義加減乘除SQL> SELECT name,above,below,empty,(above+below) AS plus,(above-below) AS subtr,(above*below) AS times, (above/below) AS divided FROM math;NAME              ABOVE      BELOW      EMPTY       PLUS      SUBTR      TIMES    DIVIDED------------ ---------- ---------- ---------- ---------- ---------- ---------- ----------Whole Number         11        -22                   -11         33       -242       -0.5Low Decimal       33.33     -44.44                -11.11      77.77 -1481.1852      -0.75Mid Decimal        55.5      -55.5                     0        111   -3080.25         -1High Decimal     66.666    -77.777               -11.111    144.443 -5185.0814 -0.8571428TO_NUMBER : 將 CHAR 或 VARCHAR2 轉換成 NUMBERNULL : 任何與 NULL 運算的結果都是 NULL,可以看做未知SQL> SELECT name,above,below,empty,above+empty AS plus,above-empty AS subtr,above*empty AS times,above/empty AS divided FROM math;NAME              ABOVE      BELOW      EMPTY       PLUS      SUBTR      TIMES    DIVIDED------------ ---------- ---------- ---------- ---------- ---------- ---------- ----------Whole Number         11        -22                                             Low Decimal       33.33     -44.44                                             Mid Decimal        55.5      -55.5                                             High Decimal     66.666    -77.777                                             NVL : 該函式接收兩個引數,當第一個引數不為 NULL 是為該值,當其為空時為第二個值,且兩個引數型別要一致SQL> SELECT name,NVL(name, 'empty'),NVL(empty, 0) FROM math;NVL2 : 接收3個引數,當第一個引數不為 NULL 時返回 第二個引數,當第一個引數為 NULL 時返回 第三個引數SQL> SELECT NVL2(name, 1, 2),NVL2(empty, 1, 2) FROM math;NVL2(NAME,1,2) NVL2(EMPTY,1,2)-------------- ---------------             1               2             1               2             1               2             1               2ABS : 接收一個引數獲取絕對值SQL> SELECT name,below,ABS(below) FROM math;CEIL : 獲取大於或等於指定值的最小整數FLOOR : 獲取小於或等於指定值得最大整數SQL> SELECT CEIL(1.2),CEIL(-0.3) FROM math;SQL> SELECT FLOOR(1.2),FLOOR(-0.3) FROM math;MOD : 求模運算,就是整除後的餘數,接收的兩個引數都是正整數,對於第一個引數不是整數的情況將會使用 FLOORREMAINDER : 和 MOD 功能一樣,只是在對於第一個引數不是整數的情況將會使用 ROUND 方法SQL> SELECT MOD(100, 10),MOD(22,23),MOD(10,3) FROM math;MOD(100,10) MOD(22,23)  MOD(10,3)----------- ---------- ----------          0         22          1SQL> SELECT MOD(7.5, 3),REMAINDER(7.5, 3) FROM math;MOD(7.5,3) REMAINDER(7.5,3)---------- ----------------       1.5              1.5SQL> SELECT MOD(4.5, 3),REMAINDER(4.5, 3) FROM math;MOD(4.5,3) REMAINDER(4.5,3)---------- ----------------       1.5             -1.5POWER : 乘方函式SQRT : 平方根函式SQL> SELECT POWER(3,2),POWER(4,3) FROM math;POWER(3,2) POWER(4,3)---------- ----------         9         64SQL> SELECT SQRT(64),SQRT(49) FROM math;  SQRT(64)   SQRT(49)---------- ----------         8          7聚集函式聚集函式和陣列函式是用於統計的函式,對於 NULL 值採用忽略的方式計算AVG : 平均值COUNT : 資料條數,可作用於字元列,另外該函式在計算時不管指定的是否為 NULL 都會計算MAX : 最大值MIN : 最小值SUM : 所有值之和SQL> SELECT AVG(noon),COUNT(noon),MAX(noon),MIN(noon),SUM(noon) FROM comfort;AVG(NOON) COUNT(NOON)  MAX(NOON)  MIN(NOON)  SUM(NOON)---------- ----------- ---------- ---------- ----------54.8285714           7       99.8       -7.2      383.8SQL> SELECT (MAX(noon) - MIN(noon)) AS swing FROM comfort WHERE city='SAN FRANCISCO';     SWING----------      11.4SQL> SELECT COUNT(DISTINCT city),COUNT(city),COUNT(*) FROM comfort; # 使用 DISTINCT 來獲取不同值COUNT(DISTINCTCITY) COUNT(CITY)   COUNT(*)------------------- ----------- ----------                  2           8          8DISTINCT 關鍵在在除 COUNT 函式以外的其它函式很少使用聚合函式 RANK 和 DENSE_RANK 主要的功能是計算一組數值中的排序值在 9i版本之前,只有分析功能(analytic),即從一個查詢結果中計算每一行的排序值,是基於 order_by_clause子句中的value_exprs指定欄位的,語法 :          rank() over([query_partition_clause] order_by_clause)          dense_rank() over([query_partition_clause] order_by_clause)在 9i版本新增加了合計功能(aggregate),即對給定的引數值在設定的排序查詢中計算出其排序值。這些引數必須是常數或常值表示式,且必須和 ORDER BY子句中的欄位個數、位置、型別完全一致,語法 :          RANK ( expr [, expr]... ) WITHIN GROUP ( ORDER BY expr [ DESC | ASC ] [NULLS { FIRST | LAST }] [, expr [ DESC | ASC ] [NULLS { FIRST | LAST }]]...區別 :1> DENSE_RANK 在並列關係是,相關等級不會跳過,RANK 則跳過2> RANK() 是跳躍排序,有兩個第二名時接下來就是第四名(同樣是在各個分組內),DENSE_RANK()是連續排序,有兩個第二名時仍然跟著第三名RANKSQL> create table xgj(col1 NUMBER,col2 NUMBER);SQL> INSERT INTO xgj(col1, col2) VALUES(1,1);SQL> INSERT INTO xgj(col1, col2) VALUES(2,1);SQL> INSERT INTO xgj(col1, col2) VALUES(3,2);SQL> INSERT INTO xgj(col1, col2) VALUES(3,2);SQL> INSERT INTO xgj(col1, col2) VALUES(3,1);SQL> INSERT INTO xgj(col1, col2) VALUES(4,1);SQL> INSERT INTO xgj(col1, col2) VALUES(4,2);SQL> INSERT INTO xgj(col1, col2) VALUES(5,2);SQL> INSERT INTO xgj(col1, col2) VALUES(5,2);SQL> INSERT INTO