目录

1 定义有表结构如下所示:

(1)表名: g_cardapply

字段(字段名/类型长度):g_applyno varchar 8:申请单号(关键字);g_applydate bigint 8:申请日期;g_state varchar 2:申请状态

(2)表名: g_cardapplydetail

字段(字段名/类型/长度):g_applyno varchar 8:申请单号(关键字);g_name varchar 30:申请人姓名;g_idcard varchar 18:申请人身份证号;g_state varchar2:申请状态

其中,两个表的关联字段为申请单号,题目:

1)查询身份证号码为612301430103082的申请日期          2)查询同一个身份证号码有两条以上记录的身份证号码及记录个数

3)将身份证号码为612301430103082的记录在两个表中的申请状态均改为15          4)删除g_cardapplydetail表中所有姓张的记录

解题分析:

1) 主要思路为:从g_cardapplydetail中找到身份证号对应的 g_applyno,然后根据g_applyno在表g_cardapply中找出申请日期即可,下面给出两种写法:

select tl g_applydate from g_cardapply tl, g_cardapplydetail t2 where t2.g_idcard = '612301430103082' and tl.g_applyno= t2.g applyno

select g_applydate from g_cardapply where g_idcard in (select g_idcard from g_cardapplydetail where g_idcard = '612301430103082')

2)本题的主要思路为:首先按身份证号码进行分组,然后统计每个身份证出现的次数,最后把出现次数大于或等于2的信息查询出来,SQL语句如下:

select g_idcard, count(g_idcard) as num from g_cardapplydetail group by g_idcard having count(g_idcard) > 1

3)更新记录需要使用update语句,可以使用两条SOL语句分别更新两张表

UPDATE g_cardapplydetailset g_state='15' WHERE g_idcard='612301430103082'

UPDATE g_cardapply SET g_state='15' WHERE g_applyno IN (SELECT g_applyno FROM g_cardappdetail WHERE g_idcard='612301430103082)

当然也可以把这两个SQL语句写到一个存储过程里面,存储过程的参数为身份证号码。为了保持数据库中数据的一致性,最好把这两条 update语句放到一个事务中。

4)本题考察的是对like子句模糊查询的理解,SQL语句如下

DELETE FROM g_cardapplydetail WHERE g_name LIKE '张%'

0

12-25 21:54