数据库程序员面试分类真题27.docx
数据库程序员面试分类真题27倚答题1.Oracle和MySQ1.中的分组(GROUPBY)有什么区别?正确答案:OraCIe对于GROUPBY是严格的,所有要SE1.ECT出来的字段必须在GRO(江南博哥)UPBY后边出现,否则会报错:u0R-00979:notaGROUPBYexpression"o而MySQ1.则不同,如果SE1.ECT出来的字段在GRoUPBY后面没有出现,那么会随机取出一个值,而这样查询出来的数据不准确,语义也不明确。所以,作者建议在写SQ1.语句的时候,应该给数据库一个非常明确的指令,而不是让数据库去猜测,这也是写SQ1.语句的一个非常良好的习惯。下面给出一个示例。有一张T_MAX_1.HR表,数据如下图所示,有3个字段ARTIC1.E.AUTHOR和PRICE。请选出每个AUTHOR的PRICE最高的记录(要包含所有字段)。ARTIC1.EAUTHORPRICE0001B3.99000210.990003C1.690004B19.9500056.96首先给出建表语句:CREATETAB1.ET_MAX_1.HR(ARTIC1.EVRCHR2(30),AUTHORVARCHR2(30),PRICENUMBER)OracteCREATETAB1.ET_MAX_1.HK(ARTIC1.EVARCHAR(30),AUTHORVARCHAR(30),PRICEF1.OAT);MySQ1.OraCIe通用INSERTINTOT_MAX_1.HRVA1.UES('0001','B',3.99);INSERTINTOT_MAX_1.HKVA1.UES(,0002,A,10,99);INSERTINTOT_MAX_1.HRVA1.UESC0003,C,.1.69);INSERTINTOT_MAX_1.HRVA1.UESC0004,B,19.95);INSERTINTOT_MAX_1.HRVA1.UESC0005,A,6.96);COMMIT;SE1.ECT*FROMTMAX1.HR;在OraCIe中的数据:-AUTHORBRlCE1.HRgOrchSn>SE1.ECTFROM1.MAX_1.HRlAKiK1.EAUTHORPRICEOOOIB3.99OOO2A10.990003CIJ»0004B19.95啷A6.96在MySQ1.中的数据:mysql>SE1.ECT,FROMT_MAX_1.HR;IARn(IE:.U三Fffl(IIIIMI<100OlIBI19910002IaIi&99IoW3ICI!.69!100MiB19.95OOteIaI&965rosinsd(00s)分析数据后,正确答案应该是ARTIC1.E000200030004A10.99C1.69B19.95对于这个例子,很容易想到的SQ1.语句如下:SE1.ECTT.ARTIC1.E,T.AUTHOR,MX(T.PRICE)EROMT_MAX_1.HRTGRoUPBYT.AUTHOR;SE1.ECT*FROMT_MAX_1.HRTGROUPBYT.AUTHOR;在OraCIe中执行上面的SQ1.语句报错:1.HR刎damXElKTTARTic1.ErAuTOORMAX(TPlUCE)FROM1.MAX_1.HRTGROUPBY1.AUTHOR;SE1.ECTT.ARTK1.ET-AlTHORMM(IPWCt)FROM1.MAXURTGRoUPBY!.AUTHORERRORatal:ORA-(X)979:KllaGROUPBYere0n1.吟山SnKE1.ECTFROMTNx1.HRTGRouPBYTAlmiOR:SEECTROMT_MAX_1.HRTGROUPBYTMTHORtERRORatImcl:ORA-00979:MaGROUPBYWraao在MySQ1.中执行同样的SQ1.语句不会报错:m卿>selnw11O;wsion5.6.21-HiteTprise-Coeercial-advanced-logmjq>SE1.ECTTAKnC1.ElAIJrHOKMAXlT,PR1CE)FROMT_MAX_1.HRTGROUPBY1.ITIIOR:三IOEA11三WX(T-PRICE)MO2A10.99MOIB19.95W03!C1.693rowsint(Q(Osa)11i)Sl>SE1.ECT*FROMT_MAX_1.HRTGROUPBYTA(JTHOR;IARIiafIIIM三IKICE100Q2IA,111!10.99,100oiIBI199I三!C1.693Wiinjet(0.00sec)虽然执行不报错,可以查询出数据,但是从结果来看数据并不是最终想要的结果,甚至数据是错乱的。卜.面给出几种正确的写法(在OraCle和IMySQ1.中均可执行:(1)使用相关子查询SE1.ECT*1ROMT_MAX_1.HKTWHERE(T.AUTHOR.T.PRICE)IN(SE1.ECTNT.AUTHOR,MAX(NT.PRICE)PRICE1ROMT_MAX_1.HRNTGROUPBYNT.AUTHOR)ORDERBYT.ARTIC1.E;SE1.ECT*FROMT_MAX_1.HRTWHERET.PRICE=(SE1,ECTMAX(NT.PRICE)PRICEFROMT_MAX_1.HRNTWHERET.AUTlIOR=NT.AUTHOR)ORDERBYT.ARTIC1.E;(2)使用非相关子查询SE1.ECTT.*FROMT_MAX_IJIRTJOIN(SE1.ECTNT.AUTHOR,MAX(NT.PRICE)PRICEFROMT_MAX_1.HRNTGROUPBYNT.AUTHOR)TlONT.AUTHOR=T1.AUTHORANDT.PRlCE=Tl.PRICEORDERBYT.ARTIC1.E;(3)使用1.EFTJOIN语句SE1.ECTT.*FR0MT_MAX_1.HRT1.EFTOUTERJOINT_MAX_1.HRTlONT.AUTHOR=T1.AUTHORANDT.PRICE<T1.PRICEWHERETkARTIC1.EISNU1.1.ORDERBYT.ARTIC1.E;在OraCIe中的执行结果:1.HRgofcbsm>SE1.三T.2 FRoM1.MW1.HRT3 1.EFTourERJOlN1.MAX-UiRTI4 ONrAirnKS-TlJWnKOR5 ANDTJ,Ria<Tl.PRICE6 Weretlarticleisnuu.7 ORDERBYTJMaiC1.E;.WIC1.EAnHORP8ICE0CO2A10.99MO3C.690004B19.95在VySQ1.中的执行结果:m)>SE1.ECTT.,- >FRoM1.MAX一1.HRT- >1.HT0U三JOINT_MAX_1.HRTI- >ONT.AIIHOR-TlAUTHOR- >Andtprkktlpiuce- >Wheretiarticieisnull- >ORDERBYTAKnC1.E;,IiARTIQfIMWIPRICEI(三Ia10.99;Ic1.69OW!B务i119.96,Jnwshsct(O.OOjcc)2.Oracle和MySQ1.中的分组(GRO1.PBY)后的聚合函数分别是什么?正确答案:在OraCIe中,可以用Wb1.CoNCAT函数或1.lSTAGG分析函数:在MySQ1.中可以使用GRoUP_C0NCAT函数。示例如下:首见给出建表语句:CREATETAB1.ETJIXJJIR(ARTIC1.EVRCHAR2(30),AUTHORVRCHAR2(30),PRICENUMBER);Oracle-CREATETAB1.ET_MAX_1.HR(ARTIC1.EVARCHAR(30),AUTHORVRCHAR(30),PRICEF1.OAT)MySQ1.OraCIe通用INSERTINTOTMAX1.HRVA1.UES(,000,B',3.99);INSERTINTOTMAX1.HRVA1.UES(,0002,A,10.99)INSERTINTOT_MAX_1.HRVA1.UES(,00031,C',1.69);INSERTINTOT_MAX_1.HRVA1.UES(,00041,B',19.95)INSERTINTOT_MAX_1.HRVA1.UES(,0005,*/V,6.96);COMMIT;SE1.ECT*ROMT_MAX_1.HK;在MySQ1.中:11w>Selecttauihor,GROUPlONCATfrARn(IE)IGROU”oNcAT(TpRKl)->FROM1.MAX_1.HRT->Groupbytauthor;.TOGROl?.(三T(T.ARTIOD;三P.三T(T.PRICE)00Q2,W)5I1(199,6.%0001.0CW,I199,19.950003I1.69Srousinitt(O-Wsoc)在OraCle中:1.HRgcrdBnPSaECrTAUnIOR.啊。赋机TARME)ARTIeIEtWM一CONCATn,PR1CT)PRICE2 FROM1.M必1.HRT3 GRoIPBYTA加OR;AlTOARTIC1.EPRICEAOXe.000510.W,6.96B0!,00043.99.19.95COKe1.691.HRgorcUsn>SE1.ECT!AUTHOR.2 UsTAGG(1.ARTIC1.E'.)WlnHNGROtTORDERBYTfRlCE).ARTIC1.E,3 USTAOHT.PRKI,:iWTTHINGRWrderBYTfRlCE)PRICE4 FRoM1.MAI1.HRT5 GRO1.TBYTOfcMWARTIC1.EPRIdAOoO5.00026.96,Id99B0001,001»3.99,19.95C00031.693. MySQ1.的分区表是什么?如何查询MySQ1.是否支持分区?正确答案:表分区是指根据一定规则,将数据库中的一张表分解成多个更小的、容易管理的部分。从逻辑上看,只有一张表,但是底层却是由多个物理分区组成,每个分区都是一个独立的对象。分区有利于管理大表,体现了“分而治之”的理念。一个表最多支持1024个分区。在MySQ1.5.6.1之前可以通过命令showvariableslike,%have_partitioning%>,来查看MySQ1.是否支持分区。若have_partintioning的值为YES,则表示支持分区。从VySQ1.5.6.1开始,该参数已经被去掉1.而是用SHOWP1.UGINS来代替0若有partition行