mysql-高级查询

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条件的参考值来使用。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值