论述题 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 '张%'
【答案解析】