MySQL多表查询与子查询
多表查询
多表查询实际上根据查询要求先将两个表连接起来,形成一张新表,再在新表中查询出满足条件的记录多表查询可分为连接查询和子查询。
一、 连接查询(可分为外连接和内连接)关于外链接的几点说明:
A. 左外连接包括两个表中满足条件的行,再加上在join子句中指出的左表中不满足的行。
B. 不满足链接条件的行在结果中显示为Null;
C.全外连接中参加连接的两个表中的每一条记录都与另一个表的每一条记录连接,其结果集的记录数是两张表记录数的积。
D.左右表是相对的,在语句中先出现的表称为左表,后出现的称为右表。
外连接:外连接可分为左外连接、右外连接、全外连接三种。
注意:外连接只限于两个表中(”.”点表示属于)
1).左外连接Select xsl. , cjb. from xsl left outer join cjb on xsl.学号=cjb.学号;Xs.表示学生表中的所有字段;
xs.学号表示xs表中的学号字段。Select xsl.学号,xsl.姓名,cjb.学号,cjb.课程号,cjb.成绩 from xsl left outer join cjb on xsl.学号=cjb.学号;
2).右外连接Select xs. , cj. from xs right outer join cj on xs.学号=cj.学号;
3).全外连接Select from xs,cj;Select xsl. ,cj. from xsl,cj;如果xs表中有m条记录,cj表有n条记录全连接总共会生成m*n条记录先将xs表弟一条记录与cj表中每一条记录进行连接,然后再用xs表的第二条记录与成绩表中的每一条记录一一连接,直到学生表中所有记录连接完。链接后生成的新表的字段数是两个表字段的和。
内连接:
内连接用于把两个表连接成第三个表,在第三个表中仅包含哪些满足连接条件的记录行。注意:当某个字段在连接的两个表中都有时,要在字段前加“表名”,否则可省略表名例:
Select xsl.姓名,kb.课程名,cjb.成绩 from xsl,kb,cjb where xsl.学号=cjb.学号 and kb.课程号=cjb.课程号;
二、 子查询
在查询中,当一个查询的结果可以作为另一个查询的条件时,这个查询称作它的子查询。SQL允许select多层嵌套使用,用来表示复杂的查询。例1:在xsgl数据库中查询出有206号课程的学生的姓名、学号。第一步:在cj表中查询出有206号课程的同学的学号
Select 学号 from cj where 课程=’206’;
第二步:在xs表中找到相关同学的学号和姓名Select 学号,姓名 from xs where 学号 in(‘081101’,’081102’,’081103’,•••)
使用子查询完成
Select 学号,姓名 from xs where 学号 in(select 学号 from cj where 课程号=’206’);
例2:查询出选修了101号课程的同学的学号,专业和姓名
select 学号,姓名,专业 from xsl where 学号 in(select 学号 from cjb where 课程号='101');
例3:查询出参加了离散数学考试的学生的学号和姓名。
Select 课程号 from kb where 课程名=’离散数学’;
Select 学号 from cjb where 课程号=’206’;
Select 学号,姓名 from xsl where 学号 in(select 学号 from cjb where 课程号=206);
一步查询:Select 学号,姓名 from xsl where 学号 in(Select 学号from cjb where 课程号=(Select 课程号 from kb where 课程名=’离散数学’));
连接查询:select xs.学号,姓名 from xs,kc,cj where xs.学号=cj.学号 and kc.课程号=cj.课程号 and 课程名=’离散数学’;
注意:1.子查询只能输出最外层中的字段,一般要输出多个表中的字段时不使用子查询,只能使用连接查询;
2.一般情况下连接查询可以代替子查询。