Oracle語法 及 SQL題目(一)

課例複製

OCM
全稱:Oracle Certified Master 認證大師
含義:Oracle 原廠推出的數據庫方向最高級別認證
做用:是否能成爲資深數據庫專家的技能考試sql

1.你所作的任何操做,都會在數據字典中被記錄。
2.你所不理解的任何ORACLE的諮詢均可以在文檔找到資料。數據庫

清屏命令
clear screen
clear scr
cle scr(只要書寫三個字母便可)
只寫clean也是能夠的oracle

如果刪除表格,須要先刪除從表,解除依賴,再刪除主表app

SQL題目一

表結構:
一、表名:g_cardapply
字段(字段名/類型/長度):
apply_no varchar8; //申請單號(關鍵字)
apply_date date; //申請日期
state varchar2; //申請狀態
二、表名:g_cardapplydetail
字段(字段名/類型/長度):
apply_no 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 idcard,count(*)
from g_cardapplydetail
group by idcard
having count(*)>=2;

三、將身份證號碼爲440401430103082的記錄在兩個表中的申請狀態均改成07code

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 '李%';

SQL題目二

有一個工廠,很是繁忙,同時在進行多個訂單的生產任務。

每一個訂單都有本身的訂單編號(WORKORDER_ID),
每一個訂單要生產的物品要拆分紅多個工序,
這些工序並行進行,每一個工序都有本身的編號STEP_NBR,
測試數據以下:

C-完成 W-等待

-- 建表語句
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');

請編寫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,sum(step_nbr)
from projects
where step_status='C' 
group by workorder_id
having sum(step_nbr)=0;

SQL題目三

Northwind商貿公司,業務日益發展,公司OA系統正不斷推出新版本以緊跟公司的發展.
在OA系統中,有一員工角色表,狀況以下:

數據:
EMP_NAME EMP_ROLE
---------------------------------

陳城 W
劉海 D
劉海 O
田亮 O
王曉剛 D
張玲 S
張天明 D
張天明 O

其中:
W – 搬運工人
D – 主任
O – 高級職員
S – 祕書

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');

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)),1) 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 ;

筆記

instr('DO',emp_ role)

instr函數表示emp_ role變量在'DO'中出現的位置
好比emp_ role是'D',則返回值爲1;
若emp_ role是'D'和'O',則返回爲3,是1+2;

substr('DOB' , sum(instr('DO',emp_ role)),l)

substr函數表示經過返回值的位置取一個字符

substr('DOB' , sum(instr('DO','DO')),l)

取得是B

substr('DOB' , sum(instr('DO','D')),l)

取得是D

substr('DOB' , sum(instr('DO','O')),l)

取得是O

相關文章
相關標籤/搜索