【正文】
求,要求設(shè)計(jì)一個(gè)網(wǎng)上購物程序(使用 powerdesiger 建立模型并編寫測(cè)試數(shù)據(jù)), 有如下的需求1. 管理員可以在后臺(tái)添加商品,每個(gè)商品屬于一個(gè)商品組2. 可以對(duì)管理員進(jìn)行分組,對(duì)每一組進(jìn)行分別授權(quán),即一個(gè)管理員組可以有多個(gè)管理員, 一個(gè)管理員組有多個(gè)權(quán)限,一個(gè)管理員可以在多個(gè)組。 3. 用戶可以自己購買商品,購買商品時(shí)要在訂單表中添加信息,一個(gè)用戶可以同時(shí)購買多個(gè)商品,用戶可以選擇自己所在的地區(qū)進(jìn)行商品的派送4. 用戶可以根據(jù)自己的購買積分,對(duì)商品進(jìn)行折扣52 / 62GROUP BY 和 HAVING 在介紹 GROUP BY 和 HAVING 子句前,我們必需先講講 sql 語言中一種特殊的函數(shù):聚合函數(shù),例如 SUM, COUNT, MAX, AVG 等。這些函數(shù)和其它函數(shù)的根本區(qū)別就是它們一般作用在多條記錄上。 SELECT SUM(population) FROM bbc 這里的 SUM 作用在所有返回記錄的 population 字段上,結(jié)果就是該查詢只返回一個(gè)結(jié)果,即所有國家的總?cè)丝跀?shù)。通過使用 GROUP BY 子句,可以讓 SUM 和 COUNT 這些函數(shù)對(duì)屬于一組的數(shù)據(jù)起作用。當(dāng)你指定 GROUP BY region 時(shí), 屬于同一個(gè) region(地區(qū))的一組數(shù)據(jù)將只能返回一行值.也就是說,表中所有除 region(地區(qū))外的字段,只能通過 SUM, COUNT 等聚合函數(shù)運(yùn)算后返回一個(gè)值. HAVING 子句可以讓我們篩選成組后的各組數(shù)據(jù). WHERE 子句在聚合前先篩選記錄.也就是說作用在 GROUP BY 子句和 HAVING 子句前.而 HAVING 子句在聚合后對(duì)組記錄進(jìn)行篩選。 讓我們還是通過具體的實(shí)例來理解 GROUP BY 和 HAVING 子句,還采用第三節(jié)介紹的 bbc 表?! QL 實(shí)例:一、顯示每個(gè)地區(qū)的總?cè)丝跀?shù)和總面積.SELECT region, SUM(population), SUM(area) FROM bbc GROUP BY region 先以 region 把返回記錄分成多個(gè)組,這就是 GROUP BY 的字面含義。分完組后,然后用聚合函數(shù)對(duì)每組中的不同字段(一或多條記錄)作運(yùn)算。二、 顯示每個(gè)地區(qū)的總?cè)丝跀?shù)和總面積.僅顯示那些面積超過 1000000 的地區(qū)。SELECT region, SUM(population), SUM(area) FROM bbc GROUP BY region HAVING SUM(area) 1000000 在這里,我們不能用 where 來篩選超過 1000000 的地區(qū),因?yàn)楸碇胁淮嬖谶@樣一條記錄。相反,HAVING 子句可以讓我們篩選成組后的各組數(shù)據(jù).53 / 62oracle 常見問題1..在打開 PL/SQL DEVELOP 的時(shí)候 回彈出: ORA12170: TNS: 連接超時(shí)關(guān)閉掉殺毒跟防火墻都無法解決:點(diǎn) Net Manager ?設(shè)置好主機(jī)名,也可以設(shè)置 IP 地址,但是每次都要重新設(shè)置。Ok?成功解決!54 / 622.查找 SQL/PL 生成 下一個(gè)序列號(hào)在 Oracle 庫中查詢出下個(gè)自動(dòng)生成的 id 號(hào)3. ORA00904 INVALID IDENTIFIER 解決辦法,字段名錯(cuò)誤ORA00904 invalid identifier 這個(gè)錯(cuò)誤是因?yàn)?字段名寫錯(cuò)了 檢查下字段名3. oracle 10g 安裝成功之后。scott 用戶被鎖定問題原因:默認(rèn) Oracle10g 的 scott 不能登陸。解決:(1)conn sys/sys as sysdba。//以 DBA 的身份登錄(2)alter user scott account unlock。// 然后解鎖(3)conn scott/tiger //彈出一個(gè)修改密碼的對(duì)話框,修改一下密碼就可以了具體操作步驟如下:C: sqlplus請(qǐng)輸入用戶名:sys輸入口令:sys as sysdba //注意:在口令這里輸入的密碼后面必須要跟上 as sysdba 才可以。SQL alter user scott account unlock。 用戶已更改.SQL mit。 提交完成.SQL conn scott/tiger更改 scott 口令新口令:tiger重新鍵入新口令:tiger口令已更改已連接。//完成。4. ORACLE 連接其他地址的庫在 ORACLE 安裝目錄下的:C:\oracle\product\\db_1\NETWORK\ADMIN 的 文件 Network Configuration File: C:\oracle\product\\db_1\work\admin\Comment [U20]: 這就是對(duì)應(yīng)地址55 / 62 Generated by Oracle configuration tools.ORCL = (DESCRIPTION = (ADDRESS = (PROTOCOL = TCP)(HOST = localhost)(PORT = 1521)) (CONNECT_DATA = (SERVER = DEDICATED) (SERVICE_NAME = orcl) ) )EXTPROC_CONNECTION_DATA = (DESCRIPTION = (ADDRESS_LIST = (ADDRESS = (PROTOCOL = IPC)(KEY = EXTPROC1)) ) (CONNECT_DATA = (SID = PLSExtProc) (PRESENTATION = RO) ) )orcl74= (DESCRIPTION = (ADDRESS_LIST = (ADDRESS = (PROTOCOL = TCP)(HOST = )(PORT = 1521)) ) (CONNECT_DATA = (SERVICE_NAME = orcl) ) ) 如果要連接 =jdbc:oracle:thin:@:1521:orcl=jdbc:oracle:thin::1521:orcl =zhmwc =zhgmccamp。$6. ORACLE權(quán)限問題在用 SCOTT用戶創(chuàng)建視圖的時(shí)候出現(xiàn)56 / 6257 / 62解決辦法是:首先在開始》運(yùn)行——》SQLPLUS,然后輸入 SYS/CHANGE_ON_INSTALL AS SYSDBA以 SYS 權(quán)限登陸進(jìn)去然后可以進(jìn)行操作:grant create any view to SCOTT。//把創(chuàng)建視圖的權(quán)限賦給 scott。在用 scott 登入:SELECT * FROM USER_SYS_PRIVS。這樣就可以知道當(dāng)前用戶的權(quán)限常用的賦權(quán)命令: CREATE USER TEST INDENTIFIED BY TEST。這樣就創(chuàng)建了一個(gè)用戶名密碼都為 TEST 的用戶 GRANT CREATE SESSION TO TEST。這樣 TEST 用戶就能成功登陸進(jìn)去3. 建表權(quán)限 GRANT CREATE TABLE TO TEST。4 .使用表空間權(quán)限 GRANT UNLIMITED TABLESPACE TO TEST。5. 查詢當(dāng)前用戶的系統(tǒng)權(quán)限:SELECT * FROM USER_SYS_PRIVS。這樣就可以知道當(dāng)前用戶的權(quán)限7. 撤銷權(quán)限 REVOKE CREATE TABLE FROM TEST。8. 創(chuàng)建用戶9. CREATE USER KEELTEST IDENTIFIED BY KEELTEST。58 / 6210. 分配所有權(quán)限 GRANT CREATE SESSION,CREATE TABLE,CREATE VIEW ,CREATE ANY INDEX TO SCOTT。11. GRANT UNLIMITED TABLESPACE TO SCOTT。12. Caused by: : ORA01461: can bind a LONG value only for insert into a LONG column這個(gè)錯(cuò)誤折騰了我好長一段時(shí)間:后來發(fā)現(xiàn)是驅(qū)動(dòng)器的問題Oracle 有兩個(gè) jdbc 的驅(qū)動(dòng)包把 換成 即可??!13 .如何取得表中第 6 到第 10 條記錄的值如何取得表中第 6 到第 10 條記錄的值第一種方法,使用 minus 語句: 59 / 62那么第一種方法就是取出前 5 條,再取出前 10 條,然后采用集合運(yùn)算的方法把前 10 條減去前 5 條就 OK了,SQL 語句如下: select * from t_report where rownum = 10minusselect * from t_report where rownum = 5。 另外一種方法,采用子查詢: 子查詢的這種方法相對(duì)比較復(fù)雜一點(diǎn),不過性能要比剛才的集合相減要好一些。這種方法首先在子查詢中得到前 10 條數(shù)據(jù),順路也取得前 10 條數(shù)據(jù)的 rownum 做為表中一個(gè)新的列,然后再一次查詢的時(shí)候取得剛才查詢的 rownum 大于 5 的那些數(shù)據(jù)。SQL 語句如下:select * from (select t.*,rownum R from subscriber_attr t where rownum = 10) where R 5 通過上面的語句,就得到了 6 到第 10 條數(shù)據(jù)了。注意:子查詢中的 rownum 必須要有別名(上邊語句中的 R),否則還是不會(huì)查出記錄來,這是因?yàn)閞ownum 不是某個(gè)表的列,如果不起別名的話,無法知道 rownum 是子查詢的列還是主查詢的列。PS:關(guān)于 rownum對(duì)于 rownum 來說它是 oracle 系統(tǒng)順序分配為從查詢返回的行的編號(hào),返回的第一行分配的是 1,第二行是 2,依此類推,這個(gè)偽字段可以用于限制查詢返回的總行數(shù),而且 rownum 不能以任何表的名稱作為前綴。如果想找到從第二行記錄以后的記錄,當(dāng)使用 rownum2 是查不出記錄的,原因是由于 rownum 是一個(gè)總是從 1 開始的偽列, Oracle 認(rèn)為 rownum n(n1 的自然數(shù))這種條件依舊不成立,所以查不到記錄。: Io 異常: The Network Adapter could not establish the connectionselect * from user 。查詢出來的結(jié)果不可以更新select * from jforum_users for update。 查詢出來的結(jié)果可以更新;user 表的 userId 跟 jforum_user_groups 表的 userID 關(guān)聯(lián)設(shè) user 表的 userID=403 在 jforum_user_groups 表設(shè) userID=403的 groudID=2。管理員select * from jforum_user_groups for update60 / 6261 / 6262 / 62: Io 異常: Connection refused(DESCRIPTION=(TMP=)(VSNNUM=169870336)(ERR=12505)(ERROR_STACK=(ERROR=(CODE=12505)(EMFI=4))