mysql-高级查询
连接查询概述
需要从多个表中选择或者比较数据项的情况,就需要使用到多表连接查询。
1.内连接
内连接也叫连接,是最早的一-种连接,它根据表中共同的的列进行匹配,特别是两个表存在主外键关系时,通常会使用到内连接查询。还可以被称为普通连接或者自然连接,内连接是从结果表中删除与其他被连接表中没有匹配行的所有行,所以内连接可能会丢失信息。
2、外连接
外连接是至少返回一个表中的所有记录,根据匹配条件有选择性地返回另- - 张表的记录。外连接的体现形式为三种:左外连接、右外连接、全外连接
3、使用where子句实现多表连接查询
案例:查询出学员姓名、科目名称、考试成绩。
思路:这时就需要涉及到3张表的连接操作,学员姓名存放在StudentInfo表中,科目名称存放在Subject表中,考试成绩存放在Exam表中。具体代码如下:
代码:SELECT S.StudentName,Sub.SubjectName,E.Exam FROM StudentInfo AS S,Subject AS Sub,Exam AS E WHERE S. StudentID = E.StudentID AND Sub.Subjectld = E.Subjectld;
交叉连接
交叉联接返回左表中的所有行,左表中的每一行与右表中的所有行再一- -组合,相当于两个表“相乘”。这种情况在数据库中,叫做笛卡尔乘积。
表间连接的使用
1、等值连接/内连接
1)自连接
案例:要求查询出每个学生的姓名、年龄、性别和所在班级名称
代码:SELECT S.StudentName,S.Age,S.Gender,C.ClassName FROM StudentInfo AS S INNER JOIN ClassInfo AS C ON S.ClassID= C.ClassID;
2、外连接
简单来说,内连接的两个表是同等的匹配地位,而在外连接中,两个表有主从之分,外连接运算的结果是.以主表的每一行与从表的数据进行匹配,如果找到,则将从表结果返回到相应的查询字段中,否则则会把相应的查询字段填上NULL值。
1)左外连接
左外联接的结果集包括Left Join子句中指定的左表的所有行,而不仅仅是联接列所匹配的行。如果左表的某行在右表中没有匹配行,则在相关联的结果集行中右表的所有选择列均为空值。现在数据库中有这样两张表:
2)右外连接
右外联接是左外联接的反向联接,将返回右表的所有行,如果右表的某行在左表中没有匹配行,则将左表返回空值。
案例:使用右外连接查询出所有学生的姓名和所属班级的班级名称,代码如下:
代码:SELECT S.StudentName ,C.ClassName FROM ClassInfo AS C RIGHT JOIN StudentInfo AS S ON C.ClassID= S.ClassID;
子查询
1、子查询的概念
子查询是一个嵌套在SELECT、 INSERT、 UPDATE或DELETE 语句或其他.子查询中的查询。
2、where 子查询
案例:查询出学生”黄蓉”的同班同学。用子查询实现。
分析:首先查询出学生“黄蓉”的班级编号,然后在StudentInfo学生表中查询出和”黄蓉”的班级编号相同的学生编号、姓名和班级编号。
代码:SELECT StudentlD,StudentName,ClassID FROM StudentInfo WHERE ClassID = (SELECT ClassID from StudentInfoWHERE StudentName='黄蓉);
1)在UPDATE语句中使用子查询
案例:更新”李启全“的”基于C语言理解软件编程”成绩为55分。
分析:先查询出名为”李启全“的学生编号和”基于c语言理解软件编程"的课程编号,然后作为UPDATE语句的条件。代码如下所示。
代码:UPDATE Exam SET Exam =55 where StudentID = (SELECT StudentID FROM StudentInfo WHERE StudentName='李启全) AND SubjectID = (SELECT SubjectID FROM Subject WHERE SubjectName='基于C语言理解软件编程');
2)在DELETE中使用子查询
3)使用in和notin的子查询
总结:一般来说, 表连接都可以用子查询替换,但反过来说,有的子查询不能用表连接来替换。子查询比较灵活、方便,形式多样,适合作为查询的筛选条件,而表连接更适合于查看多表的数据。
子查询除用在SELECT 语句中完成复杂查询功能外,还可用在UPDATE、 DELETE、 INSERT语句中完成复杂的更新、删除、插入功能。在UPDATE和DELETE语句中使用子查询和在SELECT 语句中使用子查询的原理是一样的,内层子查询的结果作为外层查询的WHERE条件的参考值来使用。