第4章数据库的查询和视图14.1连接、选择和投影4.1.1选择【例4.1】学生情况表如表4.1所示。学生表中性别为女且平均成绩在80分以上的行形成一个新表,该选择运算的结果如表4.2所示。第4章数据库的查询和视图24.1.2投影【例4.2】若在表中对“姓名”和“平均成绩”投影,该查询得到如表所示的新表。第4章数据库的查询和视图34.1.3连接【例4.3】若表A和B分别如表4.4和表4.5所示,则连接后结果如表4.6所示。第4章数据库的查询和视图44.1.3连接【例4.4】若表A和表B分别如表4.7和表4.8所示,自然连接后的新表C如表4.9所示。第4章数据库的查询和视图54.2数据库的查询语法格式:SELECTselect_listFROMtable_source[WHEREsearch_condition][GROUPBYgroup_by_expression][HAVINGsearch_condition][ORDERBYorder_expression[ASC|DESC]]第4章数据库的查询和视图64.2.1选择列语法格式:SELECT[ALL|DISTINCT]select_list其中select_list指出了结果的形式,select_list的主要格式为:{*/*选择当前表或视图的所有列*/|{table_name|view_name|table_alias}.*/*选择指定的表或视图的所有列*/|{colume_name|expression}[[AS]column_alias]/*选择指定的列*/|column_alias=expression/*选择指定列并更改列标题*/}[,…n]第4章数据库的查询和视图74.2.1选择列选择一个表中指定的列语法格式:SELECTcolumn_name[,column_name…]FROMtable_nameWHEREsearch_condition【例4.5】查询XSCJ数据库的XS表中各个同学的XM、XH和ZXF。SELECTXH,XM,ZXFFROMXS;【例4.6】查询XS表中ZXF大于45同学的XH、XM和ZXF。SELECTXH,XM,ZXFFROMXSWHEREZXF45;第4章数据库的查询和视图84.2.1选择列【例4.7】查询XS表中的所有列。SELECT*FROMXS;该语句等价于语句:SELECTXH,XM,ZYM,XBCSSJ,ZXF,BZFROMXS;第4章数据库的查询和视图94.2.1选择列修改查询结果中的列标题【例4.8】查询XS表中计算机同学的XH、XM和ZXF,结果中各列的标题分别指定为学号、姓名和总学分。SELECTXHAS学号,XMAS姓名,ZXFAS总学分/*也可以省略AS*/FROMXSWHEREZYM=’计算机’;第4章数据库的查询和视图104.2.1选择列计算列值格式为:SELECTexpression[,expression]【例4.9】创建产品销售数据库XSH,并在其中创建产品表CP,其表结构如表所示。第4章数据库的查询和视图114.2.1选择列下列语句将列出产品名称和产品总值:SELECTCPMCAS产品名称,JG*KCLAS产品总值FROMCP;第4章数据库的查询和视图124.2.1选择列消除结果集中的重复行格式是:SELECTDISTINCTcolumn_name[,column_name…]【例4.10】对XSCJ数据库的XS表只选择ZYM和ZXF,消除结果集中的重复行。SELECTDISTINCTZYMAS专业名,ZXFAS总学分;该语句执行的结果为:专业名总学分计算机48计算机50计算机52计算机54通信工程40通信工程42通信工程44通信工程50第4章数据库的查询和视图134.2.1选择列【例4.11】以下的SELECT语句对XSCJ数据库的XS表选择ZYM和ZXF,不消除结果集中的重复行。SELECTALLZYMAS专业名,ZXFAS总学分;说明:当SELECT语句中不写ALL与DISTINCT时,默认值为ALL。第4章数据库的查询和视图144.2.2选择行WHERE子句必须紧跟FROM子句之后,其基本格式为:WHEREsearch_condition其中search_condition为查询条件,格式为:{[NOT]precdicate|(search_condition)}[{AND|OR}[NOT]{predicate|(search_condition)}]}[,…n]其中predicate为判定运算,结果为TRUE、FALSE或UNKNOWN,格式为:{expression{=||=||=||!=}expression/*比较运算*/|string_expression[NOT]LIKEstring_expression[ESCAPE‘escape_character’]/*字符串模式匹配*/|expression[NOT]BETWEENexpressionANDexpression/*指定范围*/|expressionIS[NOT]NULL/*是否空值判断*/|expression[NOT]IN(subquery|expression[,…n])/*IN子句*/|EXIST(subquery)/*EXIST子查询*/}第4章数据库的查询和视图154.2.2选择行表达式比较比较运算的格式为:expression{=||=||=||!=}expression【例4.12】(1)查询XSH数据库CP表中库存量在500以上的产品情况。SELECT*FROMCPWHEREKCL500;(2)查询XSCJ数据库XS表中通信工程专业总学分大于等于42的同学的情况。SELECT*FROMXSWHEREZYM=’通信工程’andZXF=42;第4章数据库的查询和视图164.2.2选择行模式匹配LIKE谓词表达式的格式为:string_expression[NOT]LIKEstring_expression【例4.13】查询XSH数据库CP表中产品名含有“冰箱”的产品情况。SELECT*FROMCPWHERECPMCLIKE‘%冰箱%’;【例4.14】查询XSCJ数据库XS表中姓“王”且单名的学生情况。SELECT*FROMXSWHERE姓名LIKE‘王_’;第4章数据库的查询和视图174.2.2选择行范围比较格式为:expression[NOT]BETWEENexpression1ANDexpression2【例4.15】(1)查询XSH数据库CP表中价格在2000元与4000元之间的产品情况。SELECT*FROMCPWHEREJGBETWEEN2000AND4000;(2)查询XSCJ数据库XS表中不在1979年出生的学生情况。SELECT*FROMXSWHERECSSJNOTBETWEENTO_DATE(‘19790101’,’YYYYMMDD’)andTO_DATE(‘19791231’,’YYYYMMDD’);第4章数据库的查询和视图184.2.2选择行IN关键字指定值表的格式为:expressionIN(expression[,…n])【例4.16】查询XSH数据库CP表中库存量为“200”、“300”和“500”的情况。SELECT*FROMCPWHEREKCLIN(200,300,500);该语句与下列语句等价:SELECT*FROMCPWHEREKCL=200ORKCL=300ORKCL=500;第4章数据库的查询和视图194.2.2选择行空值比较格式为:expressionIS[NOT]NULL【例4.17】查询XSCJ数据库中总学分尚不定的学生情况。SELECT*FROMXSWHEREZXFISNULL;第4章数据库的查询和视图204.2.2选择行子查询IN子查询格式为:expression[NOT]IN(subquery)【例4.18】在XSCJ数据库中有描述课程情况的表KC和描述学生成绩表的表XS_KC(表的结构和样本数据见附录A)。查找选修了课程号为101的课程的学生的情况:SELECT*FROMXSWHEREXHIN(SELECTXHFROMXS_KCWHEREKCH=‘101’);第4章数据库的查询和视图214.2.2选择行【例4.19】查找未选修离散数学的学生的情况。SELECTXH,XM,ZYM,ZXFFROMXSWHERE学号NOTIN(SELECT学号FROMXS_KCWHERE课程号IN(SELECT课程号FROMKCWHERE课程名='离散数学'));第4章数据库的查询和视图224.2.2选择行比较子查询格式为:expression{|=|=||=|!=|}{ALL|SOME|ANY}(subquery)【例4.20】查找比所有计算机系学生年龄都大的学生。SELECT*FROMXSWHERECSSJALL(SELECTCSSJFROMXSWHEREZYM='计算机');第4章数据库的查询和视图234.2.2选择行【例4.21】查找课程号206的成绩不低于课程号101的最低成绩的学生的学号。SELECTXHFROMXS_KCWHEREKCH='206'ANDCJ=ANY(SELECTCJFROMXS_KCWHEREKCH='101');第4章数据库的查询和视图244.2.2选择行EXISTS子查询格式为:[NOT]EXISTS(subquery)【例4.22】查找选修206号课程的学生姓名。SELECTXMFROMXSWHEREEXISTS(SELECT*FROMXS_KCWHEREXH=XS.XHANDKCH=‘206’);第4章数据库的查询和视图254.2.2选择行【例4.23】查找选修了全部课程的同学的姓名。SELECTXMFROMXSWHERENOTEXISTS(SELECT*FROMKCWHERENOTEXISTS(SELECT*FROMXS_KCWHEREXH=XS.XHANDKCH=KC.KCH));第4章数据库的查询和视图264.2.3查询对象【例4.24】查找选修了001102号同学所选修的全部课程的同学的学号。SELECTDISTINCTXHFROMXS_KCASCJ1WHERENOTEXISTS(SELECT*FROMXS_KCASCJ2WHERECJ2.XH=‘001102’ANDNOTEXISTS(SELECT*FROMXS_KCASCJ3WHERECJ3.XH=CJ1.XHANDCJ3.KCH=CJ2.KCH));第4章数据库的查询和视图274.2.3查询对象【例4.25】在XS表中查找1980年1月1日以前出生的学生的姓名和专业名。SELECTXM,ZYMFROM(SELECT*FROMXSWHERECSSJTO_DATE(‘19800101’,’YYYYMMDD'));执行结果为:XMZYM王燕计算机林一帆计算机张强民计算机严红计算机王敏通信工程王林通信工程马琳琳通信工程李计通信工程李红庆通信工程孙祥欣通信工程刘燕敏通信工程第4章数据库的查询和视图284.2.4连接连接谓词【例4.26】查找XSCJ数据库每个学生的情况以及选修的课程情况。SELECTXS.*,XS_KC.*FROMXS,XS_KCWHEREXS.XH=XS_KC.XH;第4章数据库的查询和视图294.2.4连接【例4.27】自然连接查询。SELECTXS.*,XS_KC.KCH,XS_KC.CJFROMXS,XS_KCWHEREXS.XH=XS_KC.XH;【例4.28】查找选修了206课程且成绩在80分以上的学生姓名及成绩。SELECTXMAS姓名,CJAS成绩FROMXS,XS_KCWHEREXS.XH=XS_KC.XHANDKCH=‘206’ANDCJ=80;执行结果为:姓名成绩王燕81李方方80林一帆87张蔚89第4章数据库的查询和视图304.2.4连接