《SQL的数据查询》PPT课件.ppt

SQL的数据查询,天津师范大学刘洋,一个问题,2006年6月,举世瞩目的第18届世界杯在德国举行,某网站为了方便球迷查询,在自己的网站上设立了世界杯信息查询系统该系统的一部分要求为:一名球员可以参加多场比赛,每场比赛有多名球员参加概念模型,请你为该系统的这一部分设计一个ER模型,画出ER图要求:“球员”的属性有:姓名,代表国,号码,年龄,位置“比赛”的属性有:比赛编号,比赛甲方,比赛乙方,比赛类型在联系中反映出球员参加比赛的出场时间,进球数,概念模型ER图,球员,,,比赛,m,n,概念模型关系数据模型,球员关系,player(nation,number,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),matchid,nation,number,join( , , ),time,goal,Player的主码,match的主码,Join自己的属性,SQL语言,CREATE,使用SQL语言创建基本表,player(nation,number,name,age,position),Create table player --球员表 name char(20), --姓名 nation char(20), --代表国 number int --号码 age int, --年龄 position char(10) --位置 定义主码 ,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 (小组赛,淘汰赛 )) 比赛类型 ,使用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 (matchid) reference match (matchid),SQL语言,SELECT,Select语句的基本句法,select-From-Where句型, A1, An (F(R1 Rm)),From R1, , Rm,Where F,Select A1, , An,这里R1、、Rn为关系,F是公式,A1、、An为属性。
R1 Rm,F, A1, An,使用SQL语言查询,世界杯数据库中有三个基本表(关系):,player(nation,number, name,position),德国 13 巴拉克 中场,法国 12 亨利 前锋,德国 1 莱曼 守门员,巴西 6 卡洛斯 后卫,使用SQL语言查询,match(matchid,match_a,match_b),A1 德国 哥斯达黎加,A3 德国 波兰,G2 法国 瑞士,F2 巴西 克罗地亚,使用SQL语言查询,join(nation,number,matchid ,goal),德国 13 A1 1,德国 13 A3 1,德国 1 A1 0,法国 12 G2 3,巴西 6 F2 0,德国 1 A3 0,使用SQL语言查询,1、检索参加比赛场次为A1的球员的代表队以及身披号码,,德国 13 A1 ,德国 1 A1 ,,,,,,,,使用SQL语言查询,From join,Where matchid=A1,Select nation,number,1、检索参加比赛场次为A1的球员的代表队以及身披号码,德国 1 A3 ,德国 13 A3 ,使用SQL语言查询,,德国 13 A1 ,德国 1 A1 ,,,,,,,2、检索参加比赛场次为A1或A3的球员的代表队以及身披号码,,,,使用SQL语言查询,From join,Where matchid=A1,Select Distinct nation,number,Or matchid=A3,去除重复元组。
2、检索参加比赛场次为A1或A3的球员的代表队以及身披号码,使用SQL语言查询,,3、检索参加比赛场次为A1或A3的球员的代表队以及身披号码,想一想,这样做对吗?,使用SQL语言查询,有某一数据项既是A1又是A3的吗?,使用SQL语言查询,,使用SQL语言查询,,,,,,笛卡儿积连接后的结果,使用SQL语言查询,From join AS X , join AS Y,WhereX.nation=Y.nation And X.number=Y.number,Select X.nation,X.number,And X.matchid=A1,And Y.matchid=A3,指明是哪张表的nation,number3、检索参加比赛场次为A1或A3的球员的代表队以及身披号码,一张表使用多次时,必须要给它命名成不同的名字使用SQL语言查询,,4、检索参加比赛场次为A1的球员的代表队以及身披号码和姓名,nationnumber,nationnumber,使用SQL语言查询,德国 13 巴拉克 中场 A1 1,,自然连接后的结果,德国 13 巴拉克 中场 A1 1,德国 13 巴拉克 中场 A3 1,德国 1 莱曼 守门员 A1 0,德国 1 莱曼 守门员 A1 0,德国 1 莱曼 守门员 A3 0,法国 12 亨利 前锋 G2 3,巴西 6 卡洛斯 后卫 F2 0,使用SQL语言查询,德国 13 巴拉克 中场 A1 1,德国 1 莱曼 守门员 A1 0,,,使用SQL语言查询,连接查询,From player,join,Whereplayer.nation=join.nation And player.number=join.number,Select player.nation,player.number,name,And matchid=A1,4、检索参加比赛场次为A1的球员的代表队以及身披号码和姓名,使用SQL语言查询,4、检索参加比赛场次为A1的球员的代表队、身披号码和姓名,,德国 13 A1 ,德国 1 A1 ,,,,,,,,使用SQL语言查询,语句为:,查询结果为:,使用SQL语言查询,德国 13 巴拉克 中场,德国 1 莱曼 守门员,,,,,,,,,使用SQL语言查询,语句为:,((德国,13),(德国,1)),父查询,子查询,使用SQL语言查询,答案2:嵌套查询,From player,Where(nation,number)IN,Select nation,number,name,不相关子查询,使用SQL语言查询,4、检索参加比赛场次为A1的球员的代表队、身披号码和姓名,德国 13巴拉克 ,德国 1 莱曼 ,法国12 亨利 ,巴西 6卡洛斯 ,,,,,,,,,使用SQL语言查询,答案3:嵌套查询,From player,WhereA1IN,Select nation,number,name,相关子查询,4、检索参加比赛场次为A1的球员的代表队、身披号码和姓名,使用SQL语言查询,4、检索参加比赛场次为A1的球员的代表队、身披号码和姓名,德国 13巴拉克 ,德国 1 莱曼 ,法国12 亨利 ,巴西 6卡洛斯 ,,,,,,,,,使用SQL语言查询,From player,WhereEXISTS,Select nation,number,name,From SC,Where join.nation=player.nation join.number=player.number,(Select *,And matchid=A1),答案:使用存在量词的嵌套查询,相关子查询,4、检索参加比赛场次为A1的球员的代表队、身披号码和姓名,使用SQL语言查询,想一想,这样做对吗?,,5、检索不参加比赛场次为A1的球员的代表队、身披号码,谢谢,。