论述题
10. 定义有表结构如下所示:
(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 varchar 2; //申请状态
其中,两个表的关联字段为申请单号。
题目:1)查询身份证号码为612301430103082的申请日期。
2)查询同一个身份证号码有两条以上记录的身份证号码及记录个数。
3)将身份证号码为612301430103082的记录在两个表中的申请状态均改为15。
4)删除g_cardapplydetail表中所有姓张的记录。
【正确答案】1)主要思路为:从g_cardapplydetail中找到身份证号对应的g_applyno,然后根据g_applyno在表g_cardapply中找出申请日期即可,下面给出两种写法:
①select t1.g_applydate from g cardapply t1,g_cardapplydetail t2 where t2.g_idcard='612301430103082'andt1.g_applyno=t2.g_applyno
②select g_applydate from g cardapply where g idcard in(select g idcard from g cardapplydetail whereg_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语句,可以使用两条SQL语句分别更新两张表:
updateg_cardapplydetailset g_state='15'where g_idcard='612301430103082'
updateg_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_cardapplydetailwhere g_name like '张%'
【答案解析】