選擇題15題 每題2分,共30分
判斷題10題 每題1分 共10分
填空題10個空 每空1分 共10分
簡答題4題 每題5分 共20分
應用題3題 每題10分 共30分java
一、ORACLE服務器的監聽器配置文件叫什麼? tnsname.ora是幹什麼用的?程序員
listener.ora 主要記錄了服務別名和對應的信息
#你所要鏈接的時候輸入得TNSNAME ORCL = (DESCRIPTION = (ADDRESS_LIST = #下面是這個TNSNAME對應的主機,端口,協議 (ADDRESS = (PROTOCOL = TCP)(HOST = 127.0.0.1)(PORT = 1521)) ) (CONNECT_DATA = #使用專用服務器模式去鏈接須要跟服務器的模式匹配,若是沒有就根據服務器的模式自動調節 (SERVER = DEDICATED) #對應service_name,SQLPLUS>;show parameter service_name; 進行查看 (SERVICE_NAME = orcl) ) ) #下面這個相似 SALES = (DESCRIPTION = (ADDRESS_LIST = (ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.188.219)(PORT = 1521)) ) (CONNECT_DATA = (SERVER = DEDICATED) (SERVICE_NAME = sales) ) )
二、ORACLE文本初始化參數文件和服務器初始化參數文件的正確理解
初始化參數文件是oracle實例運行所須要的參數配置文件,oracle實例啓動是必須先從參數文件中讀取數據。spring
初始化參數文件分爲pfile跟spfile。 一、pfile也叫文本初始化參數文件。 oracle9i之前版本只有這種參數文件,內容是純文本的能夠直接進行編輯。 oracle在安裝每個庫是都會創建一個pfile文件,默認名字是init<SID>.ora,SID爲數據庫實例名。 在windows環境下通常該文件是放在oracle_homedatabase目錄下,UNIX的環境下通常是裝在oracle_homedbs目錄下。 例如在windows2000的環境下d:oracleora92databaseinit<SID>.ora,可是在92010的版本中因爲採用的是spfile爲默認的參數文件, 因此只能在oracle_baseadmin<SID>pfile目錄先才能找到pfile文件的一個備份, 如:init.ora.4212004195359,能夠直接用文本編輯,另外在oracle_homeadminsamplepfile能夠找到一個pfile的參考備份文件,DBA能夠利用它創建新的初始化文件。 由於修改初始化參數文件必須先關閉數據庫,這樣會使數據庫性能降低,並且有時候中斷是不能容忍的,並且DBA要在遠程啓動數據庫就必須在客戶端保存一個pfile文本的副本, 若是內容不一致的話就可能啓動不了數據庫,在8i之後引入了動態參數的設置可是pfile不能直接保存, 所以在數據庫從新啓動後原先修改的數據還會丟失,在92010之後的版本就引入了spfile這種新的參數文件。 二、spfile也叫服務器初始化參數文件,它是二進制的沒法用文本進行修改。在9i中它的默認位置是oracle_homedatabase,默認文件名是spfile<SID>.ora。 服務器參數文件 服務器文件SPFILE(Server Parameter File)是二進制文件,用來記錄Oracle數據庫的基本參數信息(數據庫名、控制文件所在路徑、日誌緩衝大小)。 數據庫實例在啓動以前,Oracle首先會讀取SPFILE參數文件中設置的各類參數,並根據這些初始化參數來配置和啓動實例。 數據庫啓動時oracle會自動在默認目錄oracle_homedatabase下搜索初始化參數文件,搜索順序爲: spfile<SID>.ora oracle數據庫建立時自動創建的spfile文件 spflie.ora oracle缺省的spfile文件 init<SID>.ora oracle數據庫建立時自動創建的pfile文件 init.ora oracle缺省的pfile文件 若是不但願時候默認的初始化參數文件,DBA能夠在startup命令指定相應的初始化參數文件,如: SQL>startup pfile=d:oracleadmin<SID>pfileinit<SID>.ora pfile中還有兩個特殊的關鍵字:ifile跟spfile ifile是用來指定另一個pfile文件的,例如在d:oraclepflie中的init.ora初始化參數文件中有這樣的參數設置: ifile="c:oraclepfileinit001.ora" 那麼執行:startup pfile=d:oraclepflieinit.ora 就至關於執行:startup pfile=c:oraclepfileinit001.ora spfile關鍵字也同樣只不過是用來執行spfile文件的而已。 建立初始化參數文件 建立pfile文件 能夠直接複製一個pfile文件,而後直接經過syartup pfile=這樣來啓動數據庫,或者是用sysdba的身份登錄sql*plus執行如下命令: SQL>create pfile='.:....init.ora' from spfile='.:....spfile.ora' 或者是執行不帶參數的: SQL>create pfile from spfile 該命名將在oracle_homedatabase下建立一個pfile默認名字是init<SID>.ora 建立spfile文件 因爲spfile是二進制文件因此不能直接複製粘貼的,能夠用這個命令來經過pfile創建新的spfile SQL>create spfile='.:....spfile.ora' from pfile='.:....init.ora' 配置初始化參數文件 經過命令: SQL>alter system set 參數名=參數值 spoce=spfile|memory|both 在oracle11g中的oracle_home的database目錄下不存在pfile文件init<SID>.ora,由於oracle11g啓動時默認加載的是spfile文件spfile<SID>.ora文件。 可是在oracle的D:\app\Administrator\admin\orclyg\pfile目錄下存在oracle university installer生成的pfile的一個模板文件init.ora.XXXX, 若是須要pfile文件的狀況下,能夠根據數據庫的須要經過修改該模板文件生成對應的pfile而後使用startup命令重啓數據庫同時加載指定的修改過的pfile文件。 使用create命令不管是建立pfile仍是建立spfile生成的文件都是放在oracle_home/database目錄下
三、ORACLE系統管理員的名字(sys) conn / as sysdbasql
SYS模式 SYS是一個Oracle管理員用戶或根用戶;因爲它具備全能的性質,你應儘可能避免做爲SYS註冊到系統中工做。 SYSTEM模式 也是在數據庫建立時安裝的,是用於DBA任務的缺省賬戶。 SYSTEM也對全部的數據庫對象擁有徹底的權限,並且許多第三方工具軟件依賴於SYSTEM模式的存在及特權。 Oracle數據庫的另外一管理員用戶SYSTEM的缺省口令是MANAGER,而且像SYS賬戶的口令同樣,在數據庫建立後應該當即被更改
四、ORACLE服務器由哪兩個部分組成 (實例+數據庫文件)數據庫
Oracle數據庫用於存儲和檢索信息,是數據的集合。包括邏輯結構和物理結構。
Oracle實例是指數據庫服務器的內存及相關處理程序。編程
五、ORACLE數據庫的文件構成以及各類文件的做用 (數據文件)*windows
(1)數據文件:數據庫中的數據在物理上都保存在一些操做系統文件中,這些操做系統的文件就是數據文件,一般是後綴名爲.dbf的文件。 (2)控制文件:每一個Oracle數據庫都有相應的控制文件,是一個二進制文件,它定義了數據庫的狀態。 (3)重作日誌文件:用於記錄數據庫所作的所有變動(如增長、刪除、修改),以便在系統發生故障時,用它對數據庫進行恢復。
六、經常使用數據字典表要了解 (dba_users, dba_tables, user_tables,user_sequences,user_views, user_constraints)緩存
Oracle數據字典主要分爲五類: dba_: 包含數據庫實例的全部對象信息; v$_: 當前實例的動態視圖,包含系統管理和系統優化所使用的視圖; user_: 記錄用戶對象信息; gv_: 分佈式環境下全部實例的動態視圖,包含系統管理和系統優化使用的視圖; all_: 記錄用戶的對象信息與被受權訪問的對象信息。
數據字典名稱 | 說明 |
---|---|
dba_tablespaces | 關於表空間的信息 |
dba_ts_quotas | 全部用戶表空間限額 |
dba_free_space | 全部表空間中的自由分區 |
dba_segments | 描述數據庫中全部段的存儲空間 |
dba_extents | 數據庫中全部分區的信息 |
dba_tables | 數據庫中全部數據表的描述 |
dba_sequences | 全部用戶序列信息 |
dba_constraints | 全部用戶表的約束信息 |
dba_indexs | 數據表中全部索引的描述 |
dba_users | 關於數據庫中全部用戶的信息 |
user_tables | 關於當前用戶的表信息 |
user_sequences | 關於當前用戶的序列 |
user_views | 關於當前用戶的視圖 |
user_constraints | 關於當前用戶的約束 |
七、ORACLE常見的幾個進程的做用(dbwr,lgwr,ckpt...)
oracle進程名 | 做用 |
---|---|
pmon (Process Monitor) | 進程監視器;進程非正常中斷後,作清理工做 |
dbwr (Database Write) | 數據庫書寫器;該服務器進程在緩衝存儲區中記錄全部的變化和數據 |
LGWR(Log Write) | 日誌書寫器;把重作日誌緩衝存儲區中的數據寫入到重作日誌文件中 |
ckpt(Checkpoint) | 檢查點;同步化數據庫的文件,把日誌文件寫入到數據庫中。 |
八、瞭解ORACLE分區表
定義: 當表中的數據量不斷增大,查詢數據的速度就會變慢,應用程序的性能就會降低,這時就應該考慮對錶進行分區。 表進行分區後,邏輯上表仍然是一張完整的表,只是將表中的數據在物理上存放到多個表空間(物理文件上),這樣查詢數據時,不至於每次都掃描整張表。 優勢: a.改善查詢性能:對分區對象的查詢能夠僅搜索本身關心的分區,提升檢索速度。 b.加強可用性:若是表的某個分區出現故障,表在其餘分區的數據仍然可用。 c.維護方便:若是表的某個分區出現故障,須要修復數據,只修復該分區便可。 d.均衡I/O:能夠把不一樣的分區映射到磁盤以平衡I/O,改善整個系統性能。 缺點: 分區表相關,已經存在的表沒有方法能夠直接轉化爲分區表。不過oracle提供了在線重定義表的功能。
九、瞭解各類約束(主鍵約束,外鍵約束,惟一約束,檢查約束,默認約束...)
約束 | 做用 |
---|---|
primary key(主鍵) | 該列不但不能重複並且不能爲NULL |
foreign key(外鍵) | 外鍵約束要定義在從表上,主要則必須具備主鍵約束或是unique約束 |
unique(惟一) | 列,不重複 |
check(檢查性約束) | 限制列數據的有效範圍,以最大限度的保證列數據的有效; |
not null(非空) | 必須爲列提供,數據不能爲NULL。約束只能在列級定義,不能在表級定義 |
默認約束(default) | 沒有顯式提供數據插入時,以默認值填充; |
十、oracle 11g, 12c (g:網格運算,c:雲計算)
g是「Grid」縮寫,支持網格計算,即,多臺結點服務器利用高速網絡組成一個虛擬的高性能服務器,負載在整個網格中均衡 c是「Cloud」縮寫,支持雲計算,一種可以方便地,按需從網絡訪問共享的可配置資源的可配置計算資源或服務池模型,資源或服務,設計網絡,服務器,存儲,應用和IT服務。
十一、oracle網絡拓補結構(本地訪問,外機訪問)
十二、瞭解oracle三種進程: 客戶端進程(sqlplus,toad,plsqldev),服務器進程,後臺進程(dbwr,lgwr,ckpt...) *
Oracle SQL Developer 免費,通常開發使用足矣,經常使用。 PL/SQL DEVELOPER 比較適合開發人員,界面簡單易用,經常使用。 Toad 比較專業一些,適合DBA人員使用,功能強大,主要是數據分析(Toad for Data Analysts 2.7),使用也是很容易上手的 DBWR 數據寫入進程主要是將內存中的髒數據塊回寫到數據文件中。 髒數據塊是指高速數據緩衝區中被修改過的數據塊,這些數據塊的內容與數據文件的數據塊內容不一致。 CKPT 檢查點進程能夠看作一個事件,當檢查點事件發生時,CKPT會要求DBWR將某些髒數據塊回寫到數據文件。 LGWR 日誌寫入進程用於將重作日誌緩衝區中的數據寫入重作日誌文件。 Oracle首先將用戶所作的修改日誌信息寫入日誌文件,而後再將修改結果寫入數據文件。
Oracle 服務器結構(體系結構)
Oracle服務器主要由instance、database、PGA、前臺進程組成 instance SGA SGA使用操做系統內存資源 後臺進程 後臺進程須要CPU與內存資源 database database包含data files、control files、redo log file,database存放在硬盤中。 PGA PGA是個非共享的內存區域,用於管理用戶進程的私有資源 前臺進程 用戶進程 服務器進程
邏輯存儲結構
邏輯存儲結構是Oracle數據存儲結構的核心內容,對Oracle全部操做都會涉及邏輯存儲結構。 邏輯結構是一種層次結構,主要有表空間(tablespace)、段(Sement)、區間(Extent)和數據塊(Data Blocks)等概念組成。 它是面向用戶的,當用戶使用Oracle設計數據庫時,其使用的就是邏輯存儲結構。
物理存儲結構
Oracle數據庫物理存儲結構由多種物理文件組成, 主要有數據文件、控制文件、日誌文件(重作日誌、歸檔日誌、警告日誌)、參數文件、口令文件、密碼文件、警告文件、跟蹤文件等。
1三、瞭解登陸的時候,使用sqlplus /nolog是爲何?
這樣登陸在安全性上來講是很差的 能夠直接使用ps命令來直接看到這個用戶的用戶名和密碼: ps -ef | grep sqlplus;
1四、瞭解oracle各類對象: 表,索引,約束,序列,視圖,存儲過程,函數
表 oracle中的表就是一張存儲數據的表。 索引 若是要在表中查詢指定記錄,在沒有索引時必須遍歷整表,有索引時只要在索引中找到符合查詢條件的索引字段值,就能夠經過保存在索引中的ROWID快速找到表中對應的記錄。 -- 在goods表的goods_click_num列創建索引clicknum_idx。 create index clicknum_idx on goods(goods_click_num); -- 調用查詢語句 select * from goods where goods_click_num=100; 約束 主鍵約束(primary key) 非空約束(not null) 惟一約束(unique) 外鍵約束(foreign key) 檢查性約束(check) 序列 序列(sequence) 是Oracle提供的用於生成一系列惟一數字的數據庫對象。 它會自動生成順序遞增或者遞減的序列號,以實現自動提供惟一的主鍵值。 序列能夠在多用戶併發環境中使用,而且能夠爲全部用戶生成不重複的順序數字,而不須要任何額外的I/O開銷。 create sequence seq_test_id; 查看當前值與下一個值 select seq_test_id.currval, seq_test_id.nextval from dual; insert into t_test(id, name) values (seq_test_id.nextval, 'le'); 刪除序列 drop sequence seq_test_id; 查詢當前用戶的序列信息 select * from user_sequences; select seq_test_id.nextval from dual; //當在當前會話中調用過一次nextval以後,currval在緊接着的調用中就能夠生效了;currval是一個會話綁定的方法 select seq_test_id.currval from dual; 視圖 oracle視圖能夠理解爲數據庫中一張虛擬的表,他是經過一張或者多張基表進行關聯查詢後組成一個虛擬的邏輯表。 查詢視圖,本質上是對錶進行關聯查詢。 視圖的自己是不包含任何數據,只是一個查詢結果,當基表的數據發生變化時,視圖裏面的數據也會跟着發生變化。 create view goods as select * from goods; 存儲過程 create sequence seq_emp_no; create procedure sp_new_emp is begin insert into tbl_employee values(seq_emp_no.nextval,'mary',23); end; / create or replace procedure sp_add_emp(emp_name in varchar,emp_age in int) is begin if emp_age>=18 and emp_age<=60 then insert into tbl_employee values(seq_emp_no.nextval,'mary',23); dbms_output.put_line('員工'||emp_name||'信息構建完畢!'); else dbms_output.put_line('員工'||emp_name||'不符合錄取條件,被拒絕了!'); end if; end sp_add_emp; exec sp_add_emp('emp',23); 函數 create or replace function getScopedSum(begin_scope in number, end_scope in number) return number is v_sum number := 0; begin for v_i in begin_scope .. end_scope loop v_sum := v_sum + v_i; end loop; return(v_sum); end getScopedSum; select getscopedsum(1,100) from dual;
1五、理解DBWR和LGWR這兩個進程的做用
DBWR 數據寫入進程主要是將內存中的髒數據塊回寫到數據文件中。 髒數據塊是指高速數據緩衝區中被修改過的數據塊,這些數據塊的內容與數據文件的數據塊內容不一致。 LGWR 日誌寫入進程用於將重作日誌緩衝區中的數據寫入重作日誌文件。 Oracle首先將用戶所作的修改日誌信息寫入日誌文件,而後再將修改結果寫入數據文件。
1六、理解ORACLE的表組織方式。
1個表空間能夠創建在1個文件上,也能夠創建在多個文件上。
1七、懂的表空間概念,可以建立表空間
Oracle使用表空間將相關的邏輯結構組合在一塊兒,表空間是數據庫最大邏輯劃分區域,一般用來存放數據表、索引、回滾段等數據對象。 任何數據對象在建立時都必須指定存儲在某個表空間中。 表空間與數據文件相對應,一個表空間由一個或多個數據文件組成,一個數據文件只屬於一個表空間。 -- 建立數據表空間 create tablespace mytbs datafile '/u01/app/oracle/oradata/orcl/data_tmall.dbf' size 100m;
1八、懂的如何建立用戶,並在構建用戶的過程當中給這個用戶指定數據表空間和臨時表空間,知道如何受權給這個用戶。
-- 建立數據表空間 create tablespace mytbs datafile '/u01/app/oracle/oradata/orcl/data_tmall.dbf' size 100m; -- 建立臨時表空間 create temporary tablespace mytemp tempfile '/u01/app/oracle/oradata/orcl/my_temp.dbf' size 100m; -- 建立一個用戶,並指定專有的永久表空間和臨時表空間 create user le identified by 123 default tablespace mytbs temporary tablespace mytemp -- 受權給用戶鏈接數據庫和使用資源權限 grant connect,resource,dba to le;
1九、ORACLE數據庫的啓動過程 (1.啓動實例 2.掛接數據庫 三、打開數據庫)
1 NOMOUNT:啓動數據庫實例, 此時讀取參數文件,可是不加載數據庫; 2 MOUNT:啓動數據庫實例,加載數據庫,可是數據庫處於關閉狀態; 3 OPEN: 啓動數據庫實例,加載並打開數據庫; 4 FORCE: 終止實例並重啓數據庫,這種模式在數據庫關閉或者啓動遇到問題時使用,這種方式不到萬不得已時不要使用,會有數據丟失;
20、用來監控ORACLE進程的進程是什麼? (SMON, PMON)
系統監控進程(SMON) 數據庫系統啓動時執行恢復工做的強制性進程 實例啓動時若有須要,系統監控進程(system monitor process,SMON)將負責進行恢復(recovery)工做。 此外,SMON 還負責清除系統中再也不使用的臨時段(temporary segment),以及爲數據字典管理的表空間(dictionary managed tablespace)合併相鄰的可用數據擴展(extent)。 進程監控進程(PMON) 用於監控其餘進程的狀態,當有進程啓動失敗時,PMON會清除失敗的用戶進程,釋放用戶進程所用的資源。 當一個用戶進程(user process)失敗後,進程監控進程(process monitor,PMON)將對其進行恢復。 PMON 進程負責清理數據緩衝區(database buffer cache)並釋放用戶進程使用的資源。
2一、理解ORACLE段的類型
段segment 數據段是與數據庫對象相對應,通常一個數據庫對象對應一個數據段。 多個extent是對應一個數據段,每一個數據段實際上就是數據庫一個對象的表明。
2二、理解經常使用的ORACLE啓動命令
開啓數據庫
一、startup
二、startup nomount
三、startup mount
四、startup open
關閉數據庫 shutdown immediate
2三、全部的SQL CRUD指令,組合查詢,子查詢,模糊查詢,聚合函數,分組以及分組基礎上的行過濾(having)
CRUD指令
crud是指在作計算處理時的增長(Create)、讀取查詢(Retrieve)、更新(Update)和刪除(Delete)幾個單詞的首字母簡寫 INSERT INTO 語句能夠有兩種編寫形式。 第一種形式無需指定要插入數據的列名,只需提供被插入的值便可: INSERT INTO table_name VALUES (value1,value2,value3,...); 第二種形式須要指定列名及被插入的值: INSERT INTO table_name (column1,column2,column3,...) VALUES (value1,value2,value3,...); SELECT DISTINCT 語法 去重 SELECT DISTINCT column_name,column_name FROM table_name; UPDATE 語法 UPDATE table_name SET column1=value1,column2=value2,... WHERE some_column=some_value; 請注意 UPDATE 語句中的 WHERE 子句! WHERE 子句規定哪條記錄或者哪些記錄須要更新。若是您省略了 WHERE 子句,全部的記錄都將被更新! DELETE 語法 DELETE FROM table_name WHERE some_column=some_value; 請注意 DELETE 語句中的 WHERE 子句! WHERE 子句規定哪條記錄或者哪些記錄須要刪除。若是您省略了 WHERE 子句,全部的記錄都將被刪除!
組合查詢
執行多個查詢(多條SELECT語句),並將結果做爲單個查詢結果集返回。這些組合查詢一般稱爲並或複合查詢 有兩種狀況須要使用組合查詢: 在單個查詢中從不一樣的表返回相似結構的數據 對單個表執行多個查詢,按單個查詢返回數據 使用UNION 可用UNION操做符來組合數條SQL查詢。利用UNION,可給出多條SELECT語句,將它們的結果組合成單個結果集。 假如須要價格小於等於5的全部物品的一個列表,並且還想包括供應商1001和1002生產的全部物品(不考慮價格)。 SELECT vend_id, prod_id, prod_price FROM products WHERE prod_price <= 5 UNION SELECT vend_id,prod_id,prod_price FROM products WHERE vend_id IN (1001,1002); UNION必須由兩條或以上的SELECT語句組成,語句之間用關鍵字UNION分隔(所以,若是組合4條SELECT語句,將要使用3個UNION關鍵字) UNION中的每一個查詢必須包含相同的列、表達式或彙集函數(不過各個列不須要以相同的次序列出)。 列數據類型必須兼容: 類型沒必要徹底相同,但必須是DBMS能夠隱含地轉換的類型(例如,不一樣的數值類型或不一樣的日期類型)。 對組合查詢結果排序 SELECT語句輸出用ORDER BY子句排序。在用UNION組合查詢時,只能使用一條ORDER BY 子句,它必須出如今最後一條SELECT語句以後。 SELECT vend_id, prod_id, prod_price FROM products WHERE prod_price <= 5 UNION SELECT vend_id, prod_id, prod_price FROM products WHERE vend_id IN (1001,1002) ORDER BY vend_id, prod_price;
子查詢
子查詢就是嵌套在主查詢中的查詢 子查詢運算符 分類: –ALL運算符 和子查詢的結果逐一比較,必須所有知足時表達式的值才爲真。 –ANY運算符 和子查詢的結果逐一比較,其中一條記錄知足條件則表達式的值就爲真。 –EXISTS/NOT EXISTS運算符 EXISTS判斷子查詢是否存在數據,若是存在則表達式爲真,反之爲假。NOT EXISTS相反。 在子查詢或相關查詢中,要求出某個列的最大值,一般都是用ALL來比較,大意爲比其餘行都要大的值即爲最大值。 SELECT * FROM t_student WHERE student_subject='C語言' AND student_score>=ALL ( SELECT student_score FROM t_student WHERE student_subject='C語言' ) ;
模糊查詢
LIKE 操做符 LIKE 操做符用於在 WHERE 子句中搜索列中的指定模式。 SELECT column_name(s) FROM table_name WHERE column_name LIKE pattern; 通配符 在 SQL 中,通配符與 SQL LIKE 操做符一塊兒使用。 SQL 通配符用於搜索表中的數據。 通配符 描述 % 匹配任意0個或多個字符 _ 匹配任意單個字符 [charlist] 匹配字符列中的任何單一字符 [^charlist]或[!charlist] 匹配不在字符列中的任何單一字符 -- 將會把name爲「張三」,「三腳貓」,「唐三藏」找出 Select * FROM user Where name LIKE '%三%'; -- 只找出「唐三藏」,只找出name長度爲3,第2位爲'三'的數據 Select * FROM user Where name LIKE '_三_'; -- 將找出「張三」、「李三」、「王三」 Select * FROM user Where name LIKE '[張李王]三'; -- 將找出不姓「張」、「李」、「王」的「趙三」、「孫三」等 Select * FROM user Where name LIKE '[^張李王]三';
聚合函數
經常使用聚合函數 求個數:count 求總和:sum 求最大值:max 求最小值:min 求平均值:avg
分組
SELECT site_id, SUM(access_log.count) AS nums FROM access_log GROUP BY site_id;
分組基礎上的行過濾
SELECT site_id, SUM(access_log.count) AS nums FROM access_log GROUP BY site_id having SUM(access_log.count)>10
2四、懂的刪除用戶以及其全部建立的對象
-- 級聯刪除 drop user tester cascade;
2五、ORACLE分頁要能熟練寫出來(分頁公式)
select * from ( select rownum rn, a.* from ( select * from tbl_student order by stu_mark ) a where rownum<=6 ) where rn>=4 //ORACLE分頁公式 select * from ( select rownum rn, a.* from (SQL CLAUSE) a where rownum<=:endScope ) where rn>=:beginScope
2六、之前講過的全部SQL題 ****
2七、理解ORACLE SGA,知道SGA中有哪些部件。
SGA是全部用戶進程共享的一塊內存區域, 主要由 高速緩衝區(Database buffer cache)、 共享池(Shared Pool)、 重作日誌緩存區(Redo log buffer cache)、 Java池(Java Pool)、 大池(Large Pool)、 流池(Streams Pool)等組成。 SGA隨着instance啓動而加載到內存中,instance關閉時,SGA也會跟着消失。 一、shared pool(共享池) a、library cache (SQL的執行計劃緩存在這裏) b、data dictionary cache (dd cache的訪問是很是頻繁的,不作緩存將對性能形成巨大影響) 二、database buffer cache (數據高速緩衝區) 最重要的,最大的真正的數據信息緩存。 數據文件中的數據和即將保存到數據文件中的數據所有緩存在這裏。 三、redo log buffer(重作日誌緩衝區) 記錄全部對數據庫中的數據塊的改變 四、Large Pool (大型池) 最主要用途就是供RMAN備份和共享鏈接模式。 五、java pool(Java池) oracle支持JAVA語言進行編程和書寫存儲過程,這個POOL主要是對JAVA對象進行緩存。 六、Streams Pool(流池) 流池用於在數據庫與數據庫之間進行信息共享。
2八、理解dba_users、dba_tables和user_tables的區別
dba_users:系統裏全部用戶的信息,須要DBA權限才能查詢 dba_tables : 系統裏全部的表的信息,須要DBA權限才能查詢 user_tables: 當前用戶名下的表的信息
2九、知道ORACLE的開發公司是誰
甲骨文公司(Oracle)
30、知道索引的做用是什麼以及如何構建索引
加快查找速度
若是要在表中查詢指定記錄,在沒有索引時必須遍歷整表,有索引時只要在索引中找到符合查詢條件的索引字段值,就能夠經過保存在索引中的ROWID快速找到表中對應的記錄。
索引創建以後,是由oracle自動決定是否使用索引的,創建完索引,直接使用查詢語句便可;
-- 在goods表的goods_click_num列創建索引clicknum_idx。 create index clicknum_idx on goods(goods_click_num); -- 調用查詢語句 select * from goods where goods_click_num=100;
3一、可以描述ORACLE存儲過程的優缺點
不用存儲過程,存在的問題:
一、須要反覆構建鏈接和釋放鏈接,效率低
二、網絡延遲大,網絡負載大
三、安全性不夠,數據庫設計細節被暴露
四、用人成本高,管理成本高
五、若是SQL寫的很差,極可能命中率很低,致使編譯開銷大
優勢:
1.存儲過程可使得程序執行效率更高、安全性更好。 由於過程創建以後 已經編譯而且儲存到數據庫,直接寫sql就須要先分析再執行所以過程效率更高,可是直接寫sql語句會帶來安全性問題,如:sql注入 2.創建過程不會很耗系統資源,由於過程只是在調用才執行。 3.存儲過程能夠用於下降網絡流量,存儲過程代碼直接存儲於數據庫中,因此不會產生大量T-sql語句的代碼流量。 4.使用存儲過程使您可以加強對執行計劃的重複使用。 由此能夠經過使用遠程過程調用 (RPC) 處理服務器上的存儲過程而提升性能。 RPC 封裝參數和調用服務器端過程的方式使引擎可以輕鬆地找到匹配的執行計劃,並只需插入更新的參數值。 5.可維護性高,更新存儲過程一般比更改、測試以及從新部署程序集須要較少的時間和精力。 6.代碼精簡一致,一個存儲過程能夠用於應用程序代碼的不一樣位置。 7.加強安全性: a、經過向用戶授予對存儲過程(而不是基於表)的訪問權限,它們能夠提供對特定數據的訪問; b、提升代碼安全,防止 SQL注入(但未完全解決,例如,將數據操做語言--DML,附加到輸入參數); c、SqlParameter 類指定存儲過程參數的數據類型,做爲深層次防護性策略的一部分,能夠驗證用戶提供的值類型(但也不是萬無一失,仍是應該傳遞至數據庫前獲得附加驗證)。
缺點就是:
一、不可移植,若是更換數據庫,必須從新寫過。SQL有標準,而存儲過程沒有。
二、大量的利用過程,會對服務器壓力比較大。
表結構:
一、表名:g_cardapply
字段(字段名/類型/長度):
applyno varchar8;//申請單號(關鍵字)
applydate date; //申請日期
state varchar2;//申請狀態
二、表名:g_cardapplydetail
字段(字段名/類型/長度):
applyno varchar8;//申請單號(關鍵字)
name varchar30;//申請人姓名
idcard varchar18;//申請人身份證號
state varchar2;//申請狀態
其中,兩個表的關聯字段爲申請單號。
-- 建立工卡表 create table g_cardapply( apply_no varchar2(8), apply_date date not null, state varchar2(2) not null, constraint PK_APPLY_NO PRIMARY KEY (apply_no) ); -- 建立工卡申請明細表,apply_no便是主鍵又是外鍵,咱們稱爲主外鍵重合,是一種經典的一對一設計方案 create table g_cardapplydetail( apply_no varchar2(8) , apply_name varchar2(30) not null, idcard char(18) not null, state varchar2(2) not null, constraint PK_APPLY_DETAIL_NO PRIMARY KEY (apply_no), constraint FK_CARDAPPLY_DETAIL foreign key (apply_no) references g_cardapply(apply_no) ); -- oracle字符串轉日期,必須使用to_date函數,而後作好日期格式的適配 insert into g_cardapply values('00000010',to_date('2011-11-12','yyyy-mm-dd'),'01'); insert into g_cardapply values('00000011',to_date('2011-11-13','yyyy-mm-dd'),'01'); insert into g_cardapply values('00000012',to_date( '2011-11-14','yyyy-mm-dd'),'02'); insert into g_cardapply values('00000013',to_date('2011-11-15','yyyy-mm-dd'),'03'); insert into g_cardapply values('00000014',to_date('2011-11-16','yyyy-mm-dd'),'03'); insert into g_cardapplydetail values('00000010','mary', '440401430103082','01'); insert into g_cardapplydetail values('00000011','david ', '440401430103083','01'); insert into g_cardapplydetail values('00000012','mary', '440401430103082','02'); insert into g_cardapplydetail values('00000013','mike ', '440401430103084','03'); insert into g_cardapplydetail values('00000014','mary', '440401430103082','03'); commit;
題目:
一、查詢身份證號碼爲440401430103082的申請日期
-- 內關聯 select a.apply_date from g_cardapply a inner join g_cardapplydetail b on a.apply_no=b.apply_no and b.idcard='440401430103082'; select a.apply_date from g_cardapply a inner join g_cardapplydetail b on a.apply_no=b.apply_no where b.idcard='440401430103082';
二、查詢同一個身份證號碼有兩條以上記錄的身份證號碼及記錄個數
select idcard,count(*) from g_cardapplydetail group by idcard having count(*)>=2;
三、將身份證號碼爲440401430103082的記錄在兩個表中的申請狀態均改成07
update g_cardapplydetail set state='07' where idcard='440401430103082'; -- 子查詢 update g_cardapply set state='07' where apply_no in ( select apply_no from g_cardapplydetail where idcard='440401430103082' ); commit;
四、刪除cardapplydetail表中全部姓李的記錄
-- 模糊查詢 delete from g_cardapplydetail where apply_name like '李%';
有一個工廠,很是繁忙,同時在進行多個訂單的生產任務。
每一個訂單都有本身的訂單編號(WORKORDER_ID),每一個訂單要生產的物品要拆分紅多個工序,這些工序並行進行,每一個工序都有本身的編號STEP_NBR。
測試數據以下:
create table projects( workorder_id varchar2(10) not null, step_nbr int not null, step_status char(1) not null, constraint PK_PROJECTS PRIMARY KEY (workorder_id,step_nbr) ); insert into projects values('ww023',0,'C'); insert into projects values('ww023',1,'W'); insert into projects values('ww023',2,'W'); insert into projects values('ww024',0,'W'); insert into projects values('ww024',1,'W'); insert into projects values('ww025',0,'C'); insert into projects values('ww025',1,'C');
C-完成 W-等待
請編寫SQL語句,找出STEP_NBR=0,其 STEP STATUS='C',同時本訂單其它工序STEP_STATUS均爲W的訂單,好比對以上數據的分析結果就是:
WORKORDER ID
-----------------
ww023
要求:至少實現2種寫法(多寫更好),語句越短越好。
-- 一解: -- 條件1: where step_nbr=0 and step_status='C' -- 條件2: 'W'= ALL ( select step_status from projects where step_nbr> = 1 ) select workorder_id from projects p where p.step_nbr=0 and p.step_status='C' and 'W'= ALL ( select step_status from projects where step_nbr>=1 and workorder_id=p.workorder_id ); -- 二解: select workorder_id from projects p where step_status='C' group by workorder_id having sum(step_nbr)=0;
Northwind商貿公司,業務日益發展,公司OA系統正不斷推出新版本以緊跟公司的發展。
在OA系統中,有一員工角色表,狀況以下:
create table roles( emp_name varchar2(20) not null, emp_role char(1) not null, constraint pk_roles primary key(emp_name,emp_role) ); insert into roles values('陳城','W'); insert into roles values('劉海','D'); insert into roles values('劉海','O'); insert into roles values('田亮','O'); insert into roles values('王曉剛','D'); insert into roles values('張玲','S'); insert into roles values('張天明','D'); insert into roles values('張天明','O');
數據:
EMP_NAME EMP_ROLE
-------------------- --------
陳城 W
劉海 D
劉海 O
田亮 O
王曉剛 D
張玲 S
張天明 D
張天明 O
其中: W – 搬運工人 D – 主任 O – 高級職員 S – 祕書
OA開發組的SQL程序員張明獲得了上級的一個任務:
領導要求獲得的高級職員信息表以下:
EMP_NAME COMBINE_ROLE
-------------------- ------------
劉海 B
田亮 O
王曉剛 D
張天明 B
題目:
1)只列出主任和高級職員的信息
2)若是便是高級職員又是主任,用B表示其角色,其它信息不用再顯示(只一條記錄)。
你能不能用單條SQL語句幫助張明實現這個查詢?
-- 一解: select emp_name, case when count(*)=1 then max(emp_role) else 'B' end as emp_role from roles where emp_role in ('D','O') group by emp_name; -- 二解: select emp_name, substr('DOB',sum(instr('DO',emp_role)),l) combine_role from roles where emp_role in ('D','O') group by emp_name; -- 三解: select emp_name,'B' combine_role from roles where emp_role in ('D','O') group by emp_name having count(*)=2 union select emp_name,max(emp_role) combine_role from roles where emp_role in ('D','O') group by emp_name having count(*)=1 ;
最近,通過你的努力,你獲得了一份工做,成爲了百貨公司的一位經理。
到位後,你發現你的銷售數據庫中有兩張表,一個是商店促銷時間的日曆,另外一個是在促銷期間的銷售額列表。
你須要編寫一個查詢,告訴咱們在每次促銷中哪位職員的銷售額最高,這樣能夠給那個職員發績效獎金。
-- 商店促銷時間的日曆 create table promotions ( promo_name varchar2(50) not null primary key, -- 促銷活動名稱 start_date date not null, -- 開始時間 end_date date not null, -- 終止時間 check(start_date<=end_date) ); -- 促銷期間的銷售額表 (注意:該表只是保存促銷期間的銷售額) create table sales ( ticket_nbr int not null primary key, --銷售票據編號 (自增) clerk_name varchar2(20) not null, --銷售員姓名 sale_date date not null, --銷售日期 sale_amount number(9,2) not null --銷售金額 ); insert into promotions values('spring sales',to_date('2009-2-1','yyyy/mm/dd'),to_date('2009-2-15','yyyy/mm/dd')); insert into promotions values('worker sale',to_date('2009-5-1','yyyy/mm/dd'),to_date('2009-5-4','yyyy/mm/dd')); insert into promotions values('children sale',to_date('2009-6-1','yyyy/mm/dd'),to_date('2009-6-1','yyyy/mm/dd')); insert into promotions values('national day sale',to_date('2009-10-1','yyyy/mm/dd'),to_date('2009-10-7','yyyy/mm/dd')); create sequence seq_nbr; insert into sales values(seq_nbr.nextval,'david',to_date('2009-2-1','yyyy/mm/dd'),30); insert into sales values(seq_nbr.nextval,'tom',to_date('2009-2-1','yyyy/mm/dd'),73); insert into sales values(seq_nbr.nextval,'mary',to_date('2009-2-1','yyyy/mm/dd'),110); insert into sales values(seq_nbr.nextval,'tom',to_date('2009-2-2','yyyy/mm/dd'),190); insert into sales values(seq_nbr.nextval,'mary',to_date('2009-2-2','yyyy/mm/dd'),30); insert into sales values(seq_nbr.nextval,'david',to_date('2009-2-2','yyyy/mm/dd'),92); insert into sales values(seq_nbr.nextval,'mary',to_date('2009-2-3','yyyy/mm/dd'),130); insert into sales values(seq_nbr.nextval,'david',to_date('2009-2-3','yyyy/mm/dd'),90); insert into sales values(seq_nbr.nextval,'tom',to_date('2009-2-3','yyyy/mm/dd'),110); insert into sales values(seq_nbr.nextval,'mary',to_date('2009-2-4','yyyy/mm/dd'),70); insert into sales values(seq_nbr.nextval,'david',to_date('2009-2-4','yyyy/mm/dd'),9); insert into sales values(seq_nbr.nextval,'tom',to_date('2009-2-5','yyyy/mm/dd'),88); insert into sales values(seq_nbr.nextval,'mary',to_date('2009-2-5','yyyy/mm/dd'),70); insert into sales values(seq_nbr.nextval,'david',to_date('2009-2-13','yyyy/mm/dd'),50); insert into sales values(seq_nbr.nextval,'tom',to_date('2009-2-13','yyyy/mm/dd'),170); insert into sales values(seq_nbr.nextval,'mary',to_date('2009-2-14','yyyy/mm/dd'),270); insert into sales values(seq_nbr.nextval,'tom',to_date('2009-2-15','yyyy/mm/dd'),67.5); insert into sales values(seq_nbr.nextval,'david',to_date('2009-5-1','yyyy/mm/dd'),280.5); insert into sales values(seq_nbr.nextval,'mary',to_date('2009-5-1','yyyy/mm/dd'),190); insert into sales values(seq_nbr.nextval,'tom',to_date('2009-5-1','yyyy/mm/dd'),113); insert into sales values(seq_nbr.nextval,'david',to_date('2009-5-2','yyyy/mm/dd'),88); insert into sales values(seq_nbr.nextval,'mary',to_date('2009-5-2','yyyy/mm/dd'),35.5); insert into sales values(seq_nbr.nextval,'tom',to_date('2009-5-2','yyyy/mm/dd'),125); insert into sales values(seq_nbr.nextval,'david', to_date('2009-5-3','yyyy/mm/dd'),92); insert into sales values(seq_nbr.nextval,'mary',to_date('2009-5-3','yyyy/mm/dd'),93); insert into sales values(seq_nbr.nextval,'tom',to_date('2009-5-3','yyyy/mm/dd'),167); insert into sales values(seq_nbr.nextval,'david', to_date('2009-5-4','yyyy/mm/dd'),123.5); insert into sales values(seq_nbr.nextval,'mary',to_date('2009-5-4','yyyy/mm/dd'),200); insert into sales values(seq_nbr.nextval,'tom',to_date('2009-5-4','yyyy/mm/dd'),2); insert into sales values(seq_nbr.nextval,'mary',to_date('2009-6-1','yyyy/mm/dd'),190); insert into sales values(seq_nbr.nextval,'david',to_date('2009-6-1','yyyy/mm/dd'),110.5); insert into sales values(seq_nbr.nextval,'tom',to_date('2009-6-1','yyyy/mm/dd'),213); insert into sales values(seq_nbr.nextval,'tom',to_date('2009-10-1','yyyy/mm/dd'),1123); insert into sales values(seq_nbr.nextval,'david',to_date('2009-10-1','yyyy/mm/dd'),780); insert into sales values(seq_nbr.nextval,'mary',to_date('2009-10-1','yyyy/mm/dd'),310); insert into sales values(seq_nbr.nextval,'mary',to_date('2009-10-2','yyyy/mm/dd'),139); insert into sales values(seq_nbr.nextval,'david',to_date('2009-10-2','yyyy/mm/dd'),1110.5); insert into sales values(seq_nbr.nextval,'tom',to_date('2009-10-2','yyyy/mm/dd'),998); insert into sales values(seq_nbr.nextval,'mary',to_date('2009-10-3','yyyy/mm/dd'),120); insert into sales values(seq_nbr.nextval,'mary',to_date('2009-10-4','yyyy/mm/dd'),10); insert into sales values(seq_nbr.nextval,'tom',to_date('2009-10-4','yyyy/mm/dd'),234); insert into sales values(seq_nbr.nextval,'david',to_date('2009-10-5','yyyy/mm/dd'),110.5); insert into sales values(seq_nbr.nextval,'tom',to_date('2009-10-6','yyyy/mm/dd'),23); insert into sales values(seq_nbr.nextval,'david',to_date('2009-10-7','yyyy/mm/dd'),10.5); insert into sales values(seq_nbr.nextval,'王海',to_date('2009-2-1','yyyy/mm/dd'),30); insert into sales values(seq_nbr.nextval,'劉萬理',to_date('2009-2-1','yyyy/mm/dd'),73); insert into sales values(seq_nbr.nextval,'高春梅',to_date('2009-2-1','yyyy/mm/dd'),110); insert into sales values(seq_nbr.nextval,'劉萬理',to_date('2009-2-2','yyyy/mm/dd'),190); insert into sales values(seq_nbr.nextval,'高春梅',to_date('2009-2-2','yyyy/mm/dd'),30); insert into sales values(seq_nbr.nextval,'王海',to_date('2009-2-2','yyyy/mm/dd'),92); insert into sales values(seq_nbr.nextval,'高春梅',to_date('2009-2-3','yyyy/mm/dd'),130); insert into sales values(seq_nbr.nextval,'王海',to_date('2009-2-3','yyyy/mm/dd'),90); insert into sales values(seq_nbr.nextval,'劉萬理',to_date('2009-2-3','yyyy/mm/dd'),110); insert into sales values(seq_nbr.nextval,'高春梅',to_date('2009-2-4','yyyy/mm/dd'),70); insert into sales values(seq_nbr.nextval,'王海',to_date('2009-2-4','yyyy/mm/dd'),9); insert into sales values(seq_nbr.nextval,'劉萬理',to_date('2009-2-5','yyyy/mm/dd'),88); insert into sales values(seq_nbr.nextval,'高春梅',to_date('2009-2-5','yyyy/mm/dd'),70); insert into sales values(seq_nbr.nextval,'王海',to_date('2009-2-13','yyyy/mm/dd'),50); insert into sales values(seq_nbr.nextval,'劉萬理',to_date('2009-2-13','yyyy/mm/dd'),170); insert into sales values(seq_nbr.nextval,'高春梅',to_date('2009-2-14','yyyy/mm/dd'),270); insert into sales values(seq_nbr.nextval,'劉萬理',to_date('2009-2-15','yyyy/mm/dd'),67.5); insert into sales values(seq_nbr.nextval,'王海',to_date('2009-5-1','yyyy/mm/dd'),280.5); insert into sales values(seq_nbr.nextval,'高春梅',to_date('2009-5-1','yyyy/mm/dd'),190); insert into sales values(seq_nbr.nextval,'劉萬理',to_date('2009-5-1','yyyy/mm/dd'),113); insert into sales values(seq_nbr.nextval,'王海',to_date('2009-5-2','yyyy/mm/dd'),88); insert into sales values(seq_nbr.nextval,'高春梅',to_date('2009-5-2','yyyy/mm/dd'),35.5); insert into sales values(seq_nbr.nextval,'劉萬理',to_date('2009-5-2','yyyy/mm/dd'),125); insert into sales values(seq_nbr.nextval,'王海', to_date('2009-5-3','yyyy/mm/dd'),92); insert into sales values(seq_nbr.nextval,'高春梅',to_date('2009-5-3','yyyy/mm/dd'),93); insert into sales values(seq_nbr.nextval,'劉萬理',to_date('2009-5-3','yyyy/mm/dd'),167); insert into sales values(seq_nbr.nextval,'王海', to_date('2009-5-4','yyyy/mm/dd'),123.5); insert into sales values(seq_nbr.nextval,'高春梅',to_date('2009-5-4','yyyy/mm/dd'),200); insert into sales values(seq_nbr.nextval,'劉萬理',to_date('2009-5-4','yyyy/mm/dd'),2); insert into sales values(seq_nbr.nextval,'高春梅',to_date('2009-6-1','yyyy/mm/dd'),190); insert into sales values(seq_nbr.nextval,'王海',to_date('2009-6-1','yyyy/mm/dd'),110.5); insert into sales values(seq_nbr.nextval,'劉萬理',to_date('2009-6-1','yyyy/mm/dd'),213); insert into sales values(seq_nbr.nextval,'劉萬理',to_date('2009-10-1','yyyy/mm/dd'),1123); insert into sales values(seq_nbr.nextval,'王海',to_date('2009-10-1','yyyy/mm/dd'),780); insert into sales values(seq_nbr.nextval,'高春梅',to_date('2009-10-1','yyyy/mm/dd'),310); insert into sales values(seq_nbr.nextval,'高春梅',to_date('2009-10-2','yyyy/mm/dd'),139); insert into sales values(seq_nbr.nextval,'王海',to_date('2009-10-2','yyyy/mm/dd'),1110.5); insert into sales values(seq_nbr.nextval,'劉萬理',to_date('2009-10-2','yyyy/mm/dd'),998); insert into sales values(seq_nbr.nextval,'高春梅',to_date('2009-10-3','yyyy/mm/dd'),120); insert into sales values(seq_nbr.nextval,'高春梅',to_date('2009-10-4','yyyy/mm/dd'),10); insert into sales values(seq_nbr.nextval,'劉萬理',to_date('2009-10-4','yyyy/mm/dd'),234); insert into sales values(seq_nbr.nextval,'王海',to_date('2009-10-5','yyyy/mm/dd'),110.5); insert into sales values(seq_nbr.nextval,'劉萬理',to_date('2009-10-6','yyyy/mm/dd'),23); insert into sales values(seq_nbr.nextval,'王海',to_date('2009-10-7','yyyy/mm/dd'),10.5);
找出在各次促銷活動中,銷售量最高的銷售員。
請編制一條SQL來完成這個查詢。(儘可能考慮多種寫法)
-- 一解: -- 外層搜索 每一個銷售員的每次活動銷售總額 -- 內層搜索 其它銷售員的每次活動銷售總額 -- 容許同時出現兩個銷售總額相同的銷售員 select p.promo_name,s.clerk_name,sum(s.sale_amount) top_sale from promotions p inner join sales s on s.sale_date between p.start_date and p.end_date group by p.promo_name,s.clerk_name,p.start_date,p.end_date having sum(s.sale_amount) >= all( select sum(s2.sale_amount) from sales s2 where s.clerk_name <> s2.clerk_name and s2.sale_date between p.start_date and p.end_date group by s2.clerk_name ); -- 二解: SELECT s1.clerk_name,p.promo_name,p.start_date,p.end_date,SUM(s1.sale_amount) FROM sales s1 INNER JOIN promotions p ON s1.sale_date BETWEEN p.start_date AND p.end_date group by s1.clerk_name,p.promo_name,p.start_date,p.end_date HAVING SUM(s1.sale_amount)>= ALL ( SELECT SUM(s2.sale_amount) FROM sales s2 WHERE s2.sale_date BETWEEN p.start_date AND p.end_date GROUP BY s2.clerk_name );
ABC在線銷售公司業務系統
表結構:
一、表名:t_category (商品類別表)
字段(字段名/類型/長度):
類別編號 category_id INT
類別名稱 category_name VARCHAR2(30)
二、表名:t_goods (商品表)
字段(字段名/類型/長度):
商品編號 goods_no CHAR(3)
商品名稱 goods_name VARCHAR2(30)
商品價格 goods_price number(7,2)
所屬類別 goods_category INT
點擊次數 goods_click_num INT
三、表名: t_saleinfo (銷售信息表)
字段(字段名/類型/長度):
銷售流水號 sid INT
商品編號 goods_no CHAR(3)
銷售日期 sale_date date
銷售數量 quantity INT
銷售金額 amount number(10,2)
create table t_category( category_id int primary key, category_name varchar2(30) ); create table t_goods( goods_no char(3) primary key, goods_name varchar2(30) not null, goods_price number(7,2) not null, goods_category int not null, goods_click_num int default 0, constraint FK_GOODS_CATEGORY FOREIGN KEY (goods_category) references t_category(category_id) ); create table t_saleinfo( sid int primary key, goods_no char(3) not null, sale_date date not null, quantity int not null, amount number(10,2) not null, constraint FK_SALEINFO_GOODS FOREIGN KEY (goods_no) references t_goods(goods_no) ); -- 增長類別數據 insert into t_category values(1,'酒類'); insert into t_category values(2,'服裝'); insert into t_category values(3,'書籍'); -- 商品數據 insert into t_goods values('G01','貴州茅臺',550.56,1,128); insert into t_goods values('G02','福建老酒',5.43,1,24); insert into t_goods values('G03','瀘州老窖',90.56,1,67); insert into t_goods values('G04','劍南春',80.56,1,88); insert into t_goods values('G05','七匹狼夾克',350.56,2,348); insert into t_goods values('G06','七匹狼襯衫',105.43,2,908); insert into t_goods values('G07','七匹狼男長褲',130.50,2,167); insert into t_goods values('G08','七匹狼領帶',280.00,2,388); insert into t_goods values('G09','J2EE開發',50.50,3,236); insert into t_goods values('G10','STRUTS應用',24.50,3,654); insert into t_goods values('G11','ORACLE 11G',100.50,3,145); insert into t_goods values('G12','dotnet技術',80.00,3,988); -- 銷售數據 insert into t_saleinfo values(1,'G01',to_date('2008-1-1','yyyy-MM-dd'),50,50*550.56); insert into t_saleinfo values(2,'G01',to_date('2008-1-2','yyyy-MM-dd'),25,25*550.56); insert into t_saleinfo values(3,'G01',to_date('2008-1-3','yyyy-MM-dd'),31,31*550.56); insert into t_saleinfo values(4,'G01',to_date('2008-1-4','yyyy-MM-dd'),43,43*550.56); insert into t_saleinfo values(5,'G01',to_date('2008-1-5','yyyy-MM-dd'),55,55*550.56); insert into t_saleinfo values(6,'G01',to_date('2008-1-6','yyyy-MM-dd'),102,102*550.56); insert into t_saleinfo values(7,'G11',to_date('2008-1-6','yyyy-MM-dd'),82,82*100.5); insert into t_saleinfo values(8,'G11',to_date('2008-1-7','yyyy-MM-dd'),202,202*100.5);
題目:
一、查詢酒類商品的總點擊量
二、查詢各個類別所屬商品的總點擊量,並按降序排列
三、查詢全部類別中最熱門的品種(點擊量最高),並按點擊量降順序排列
四、查詢茅臺的銷售狀況,按日期升序排列
格式以下:
商品編號 商品名稱 銷售日期 銷售數量 銷售金額 累計數量 累計金額
1 茅臺 2011-12-1 10 7000 10 7000
1 茅臺 2011-12-2 15 10500 25 17500
-- 第一個問題(查詢酒類商品的總點擊量) select '酒類' category_name,sum(goods_click_num) total_click from t_goods where goods_category in ( select category_id from t_category where category_name='酒類' ); -- 第二個問題(查詢各個類別所屬商品的總點擊量,並按降序排列) select a.goods_category,b.category_name,sum(a.goods_click_num) total_click from t_goods a inner join t_category b on a.goods_category = b.category_id group by goods_category,category_name order by sum(a.goods_click_num) desc; -- 第三個問題(查詢全部類別中最熱門的品種(點擊量最高),並按點擊量降順序排列 ) select c.category_id,c.category_name,b.goods_no,b.goods_name,a.max_click from ( select goods_category, max(goods_click_num) max_click from t_goods group by goods_category )a,t_goods b,t_category c where a.goods_category=b.goods_category and a.max_click=b.goods_click_num and c.category_id=a.goods_category order by a.max_click desc; -- 第四個問題思路(查詢茅臺的銷售狀況,按日期升序排列) select d.goods_no,d.goods_name,e.category_name,c.* from ( select max(a.goods_no) goods_no,a.sale_date,a.quantity day_quantity,max(a.amount) day_amount,sum(b.quantity) total_quantity,sum(b.amount) total_amount from t_saleinfo a inner join t_saleinfo b on a.goods_no=b.goods_no and a.goods_no= ( select goods_no from t_goods where goods_name='貴州茅臺' ) and a.sale_date>=b.sale_date group by a.sale_date,a.quantity order by a.sale_date )c,t_goods d, t_category e where c.goods_no=d.goods_no and d.goods_category=e.category_id;
一、財務諮詢顧問的收入統計問題
金太陽財務諮詢服務公司,聘請了一些財務顧問提供財務操做諮詢服務。
這些顧問都以兼職形式爲公司服務,公司將按小時爲顧問工做計算薪酬。
具體表信息以下:
-- a、顧問信息表 (consultant) create table consultant( cst_id int primary key, cst_name varchar2(30) not null ); insert into consultant values(1, 'david'); insert into consultant values(2, 'henry'); insert into consultant values(3, 'mary'); insert into consultant values(4, 'kent'); -- b、顧問費率表 (billings) -- 不一樣級別的顧問,在不一樣的時期,每小時的收費是不一樣的,公司會根據狀況上調或者下調顧問的小時佣金待遇。 create table billings( cst_id int not null, bill_date date not null, bill_rate int not null, constraint PK_BILLING PRIMARY KEY(cst_id,bill_date), constraint FK_BILLING_EMP FOREIGN KEY (cst_id) references consultant(cst_id) ); insert into billings values(1, to_date('2010-1-1' ,'yyyy/mm/dd'),50); insert into billings values(2, to_date('2010-1-1' ,'yyyy/mm/dd'),60); insert into billings values(3, to_date('2010-1-1' ,'yyyy/mm/dd'),70); insert into billings values(4, to_date('2010-1-1' ,'yyyy/mm/dd'),40); insert into billings values(1, to_date('2011-1-1' ,'yyyy/mm/dd'),60); insert into billings values(4, to_date('2011-1-1' ,'yyyy/mm/dd'),45); -- c、顧問工做狀況記錄表 (hoursworked) create table hoursworked( list_id int primary key, cst_id int not null, work_date date not null, bill_hrs decimal(5,2) not null, constraint FK_HW_EMP FOREIGN KEY (cst_id) references consultant(cst_id) ); insert into hoursworked values(1,1, to_date('2010-7-1','yyyy/mm/dd'),3); insert into hoursworked values(2,1, to_date('2010-8-1','yyyy/mm/dd'),5); insert into hoursworked values(3,2, to_date('2010-7-1','yyyy/mm/dd'),2); insert into hoursworked values(4,1, to_date('2011-7-1','yyyy/mm/dd'),4); insert into hoursworked values(5,3, to_date('2011-8-1','yyyy/mm/dd'),3.5); insert into hoursworked values(6,4, to_date('2010-9-1','yyyy/mm/dd'),10); insert into hoursworked values(7,4, to_date('2011-8-1','yyyy/mm/dd'),6);
求解:
咱們須要你編寫一個SQL查詢語句,顯示顧問的名字以及其總的顧問費用。
-- 外層搜索 根據最新日期適用最新顧問費率 計算總顧問費用 -- 內層搜索 衍生新表 生成最新日期適用最新顧問費率 select c.cst_id,e.cst_name,sum(d.bill_rate*c.bill_hrs) total_fee from ( select a.cst_id,a.work_date,max(b.bill_date) bill_date, a.bill_hrs from billings b inner join hoursworked a on a.cst_id=b.cst_id and a.work_date>=b.bill_date group by a.cst_id,a.work_date,a.bill_hrs )c,billings d,consultant e where c.cst_id=d.cst_id and c.bill_date=d.bill_date and c.cst_id=e.cst_id group by c.cst_id,e.cst_name order by c.cst_id;