1、SQL的数据查询天津师范大学刘洋一个问题n2006年6月,举世瞩目的第18届世界杯在德国举行,某网站为了方便球迷查询,在自己的网站上设立了世界杯信息查询系统。该系统的一部分要求为:一名球员可以参加多场比赛,每场比赛有多名球员参加。 概念模型 n请你为该系统的这一部分设计一个ER模型,画出ER图。要求:“球员”的属性有:姓名,代表国,号码,年龄,位置“比赛”的属性有:比赛编号,比赛甲方,比赛乙方,比赛类型在联系中反映出球员参加比赛的出场时间,进球数 概念模型ER图球员姓名代表国号码年龄位置比赛编号甲方乙方类型进球数出场时间参加mn概念模型关系数据模型球员关系player(nation,numbe
2、r,name,age,position)主码: (nation,number)概念模型关系数据模型想一想,如果只是number作为主码可以吗?概念模型关系数据模型不可以,因为不同国家队中有相同的号码概念模型关系数据模型比赛关系match(matchid,match_a,match_b,matchtype)主码: matchid概念模型关系数据模型player(nation,number,name,age,position)match(matchid,match_a,match_b,matchtype)matchidnation,numberjoin( , , )time,goalPlayerP
3、layer的主码的主码matchmatch的主码的主码JoinJoin自己的属自己的属性性SQL语言功能动词数据查询数据定义数据更新数据控制SELECTCREATE,DROP,ALTERINSERT,UPDATE,DELETEGRANT,REVOKECREATE使用SQL语言创建基本表player(nation,number,name,age,position)Create table player -球员表 name char(20), -姓名 nation char(20), -代表国 number int -号码 age int, -年龄 position char(10) -位置 定义
4、主码check (number between 1 to 23 ) , check (position in (守门员,后卫,中场,前锋 ), primary key (nation,number),使用SQL语言创建基本表match(matchid,match_a,match_b,matchtype)Create table match -比赛表 matchid int primary key, -比赛编号(主码) match_a char(20), -比赛甲方 match_b char(20), -比赛乙方 matchtype char(10) check (matchtype in (小
5、组赛,淘汰赛 ) 比赛类型 使用SQL语言创建基本表Create table join -参加表 nation char(20), -代表国 number int , -号码 matchid int, -比赛编号 time int, -出场时间 goal int -进球数 primary key (nation,number,matchtype) 定义主码 定义外码 定义外码 join(nation,number,matchid,time,goal)foreign key (nation,number) reference player (nation,number)foreign key (
6、matchid) reference match (matchid)SQL语言功能动词数据查询数据定义数据更新数据控制SELECTCREATE,DROP,ALTERINSERT,UPDATE,DELETEGRANT,REVOKESELECTSelect语句的基本句法select-From-Where句型 A1, An (F(R1 Rm))From R1, , Rm Where FSelect A1, , An这里R1、Rn为关系,F是公式,A1、An为属性。R1 RmF A1, An 使用SQL语言查询世界杯数据库中有三个基本表(关系):player(nation,number, name,p
7、osition)nationnationnumbernumbernamenamepositionposition德国 13 巴拉克 中场法国 12 亨利 前锋德国 1 莱曼 守门员巴西 6 卡洛斯 后卫使用SQL语言查询match(matchid,match_a,match_b)matchidmatch_a match_b A1 德国 哥斯达黎加 A3 德国 波兰 G2 法国 瑞士 F2 巴西 克罗地亚使用SQL语言查询join(nation,number,matchid ,goal)nationnumber matchid goal 德国 13 A1 1 德国 13 A3 1 德国 1 A1
8、 0 法国 12 G2 3 巴西 6 F2 0 德国 1 A3 0使用SQL语言查询1、检索参加比赛场次为A1的球员的代表队以及身披号码nationnationnumbernumbermatchid matchid 德国 13 A1 德国 13 A3 德国 1 A1 德国 1 A3 法国 12 G2 巴西 6 F2 nationnationnumbernumbermatchid matchid 德国 13 A1 德国 1 A1 使用SQL语言查询From joinWhere matchid=A1Select nation,number从表SC选择条件投影到相应列上1、检索参加比赛场次为A1的球
9、员的代表队以及身披号码德国 1 A3 德国 13 A3 使用SQL语言查询nationnationnumbernumbermatchid matchid 德国 13 A1 德国 13 A3 德国 1 A1 德国 1 A3 法国 12 G2 巴西 6 F2 nationnationnumbernumbermatchid matchid 德国 13 A1 德国 1 A1 2、检索参加比赛场次为A1或A3的球员的代表队以及身披号码使用SQL语言查询From joinWhere matchid=A1Select Distinct nation,number从表SC选择条件投影到相应列上Or match
10、id=A3去除重复元组。2、检索参加比赛场次为A1或A3的球员的代表队以及身披号码使用SQL语言查询From joinWhere matchid=A1Select Distinct nation,numberAnd matchid=A33、检索参加比赛场次为A1或A3的球员的代表队以及身披号码想一想,这样做对吗?使用SQL语言查询nationnumber matchid goal 德国 13 A1 1 德国 13 A3 1 德国 1 A1 0 法国 12 G2 3 巴西 6 F2 0 德国 1 A3 0有某一数据项既是A1又是A3的吗?使用SQL语言查询nationmatchid德国 A1 X
11、nationmatchid 德国 A1 Y使用SQL语言查询X.nationX.number X.matchid Y.nationY.number Y.matchid德国13 A1 德国 13 A3德国 1 A1 德国1 A3笛卡儿积连接后的结果使用SQL语言查询From join AS X , join AS YWhereX.nation=Y.nation And X.number=Y.numberSelect X.nation,X.numberAnd X.matchid=A1And Y.matchid=A3指明是哪张表的nation,number。3、检索参加比赛场次为A1或A3的球员的代
12、表队以及身披号码一张表使用多次时,必须要给它命名成不同的名字。使用SQL语言查询nationnumber matchid 德国13 A1 nationnumber name德国13 巴拉克4、检索参加比赛场次为A1的球员的代表队以及身披号码和姓名nationnumber nationnumber 使用SQL语言查询nationnumbernamepositionmatchid goal 德国 13 巴拉克 中场 A1 1自然连接后的结果 德国 13 巴拉克 中场 A1 1 德国 13 巴拉克 中场 A3 1 德国 1 莱曼 守门员 A1 0 德国 1 莱曼 守门员 A1 0 德国 1 莱曼 守
13、门员 A3 0 法国 12 亨利 前锋 G2 3 巴西 6 卡洛斯 后卫 F2 0使用SQL语言查询 德国 13 巴拉克 中场 A1 1 德国 1 莱曼 守门员 A1 0nationnumbernamepositionmatchid goal使用SQL语言查询连接查询From player,joinWhereplayer.nation=join.nation And player.number=join.numberSelect player.nation,player.number,name表player与表join连接选择条件投影到相应列上And matchid=A1自然连接4、检索参加比
14、赛场次为A1的球员的代表队以及身披号码和姓名使用SQL语言查询4、检索参加比赛场次为A1的球员的代表队、身披号码和姓名nationnationnumbernumbermatchid matchid 德国 13 A1 德国 13 A3 德国 1 A1 德国 1 A3 法国 12 G2 巴西 6 F2 nationnationnumbernumbermatchid matchid 德国 13 A1 德国 1 A1 使用SQL语言查询语句为:From joinWhere matchid=A1Select nation,number查询结果为:Nation number德国13德国使用SQL语言查询n
15、ationnationnumbernumbernamenamepositionposition德国 13 巴拉克 中场法国 12 亨利 前锋德国 1 莱曼 守门员巴西 6 卡洛斯 后卫德国 13 巴拉克 中场德国 1 莱曼 守门员使用SQL语言查询语句为:From playerWhere (nation,number) INSelect nation,number,name(德国,13),(德国,1)From joinWhere matchid=A1)(Select nation,number父查询子查询使用SQL语言查询答案2:嵌套查询From playerWhere(nation,numb
16、er)INSelect nation,number,name从表player选择条件投影到相应列上From joinWhere matchid=A1)(Select nation,number首先在join关系中找出 相应的国家队名称和号码不相关子查询使用SQL语言查询4、检索参加比赛场次为A1的球员的代表队、身披号码和姓名nationnationnumbernumber name name 德国 13巴拉克 法国12 亨利 德国 1 莱曼 巴西 6卡洛斯 德国 13巴拉克 德国 1 莱曼 nationnationnumbernumbermatchid matchid 德国 13 A1 德国
17、13 A3 德国 1 A1 德国 1 A3 法国 12 G2 巴西 6 F2 法国12 亨利 巴西 6卡洛斯 使用SQL语言查询答案3:嵌套查询From playerWhereA1INSelect nation,number,name从表player选择条件投影到相应列上From joinWhere nation=player.nation number=player.number)(Select matchid看“A1”是否在当前检查球员参加的比赛相关子查询4、检索参加比赛场次为A1的球员的代表队、身披号码和姓名使用SQL语言查询4、检索参加比赛场次为A1的球员的代表队、身披号码和姓名nat
18、ionnationnumbernumber name name 德国 13巴拉克 法国12 亨利 德国 1 莱曼 巴西 6卡洛斯 德国 13巴拉克 德国 1 莱曼 nationnationnumbernumbermatchid matchid 德国 13 A1 德国 13 A3 德国 1 A1 德国 1 A3 法国 12 G2 巴西 6 F2 法国12 亨利 巴西 6卡洛斯 使用SQL语言查询From playerWhereEXISTSSelect nation,number,name从表player选择条件投影到相应列上From SCWhere join.nation=player.nationjoin.number=player.number(Select *看是否存在当前检查球员参加了“A1”比赛的记录And matchid=A1)答案:使用存在量词的嵌套查询相关子查询4、检索参加比赛场次为A1的球员的代表队、身披号码和姓名使用SQL语言查询想一想,这样做对吗?5、检索不参加比赛场次为A1的球员的代表队、身披号码From player,joinWhereplayer.nation=join.nation And player.number=join.numberSelect player.nation,player.numberAnd matchidA1谢谢