MySql连接查询

连接查询

#连接查询 分为内连接和外连接(左外和右外),子连接,等值连接和非等值连接student

#内连接 #查询参加了考试的同学(学号、学生姓名、学生编号、分数)

SELECT s.StudentNo,s.StudentName,r.StudentNo,r.StudentResult FROM student s INNER JOIN result r ON s.StudentNo=r.StudentNo;

 

#左外连接,匹配原则左表的每一行与右表的每一行进行匹配,只要on后面跟着的条件满足就把数据拿出来,右表没有数据时设为null

#等值连接,//重点,

SELECT s.StudentNo,s.StudentName,r.StudentNo,r.StudentResult FROM student s,result r WHERE s.StudentNo=r.StudentNo;

 

#非等值连接,开发之中很少用

SELECT s.StudentNo,s.StudentName,r.StudentNo,r.StudentResult FROM student s,result r;

用一条SQL 语句 查询出每门课都大于80 分的学生姓名(意思是哪个同学他的所有课程考试都大于80分)

select name from table group by name having min(fenshu)>80

select s.subjectName,r.StudentResult from subject s INNER JOIN result r on r.SubjectNo=s.SubjectNo WHERE r.StudentResult>=80

#查询所有同学,缺考的是谁,用左外连连接,这里一学生表为基准,学生人肯定有,分数就不一定有了,可能缺考

#左外连接特点:以左表为基准,右边与左表一一进行匹配,如果匹配上直接显示出来,匹配不上的,左表的数据依然显示,右边的数据设置为null;

#缺考的是谁

SELECT s.StudentNo,s.StudentName,r.StudentNo,r.StudentResult FROM student s LEFT JOIN result r ON s.StudentNo=r.StudentNo WHERE r.StudentResult IS NULL;

 

#右外连接.以右表为基准,对左表一一进行匹配,如果匹配上,则显示所有数据,如果匹配不上,右表数据依然显示,左表数据设为null

#查询参加了考试的同学(学号、学生姓名、科目表、分数),注意这里关联了三张表,用inner join, 中间表是成绩表,该表关联了2表的主键,通过找到中间表,可以一直等下去

SELECT s.StudentNo,s.StudentName,r.StudentResult,sub.SubjectName FROM student s INNER JOIN result r ON s.StudentNo=r.StudentNo INNER JOIN SUBJECT sub ON r.SubjectNo=sub.SubjectNo;

 

#查询 "数据结构-1" 的结果,并按分数高到低排序

SELECT r.StudentResult,s.SubjectName FROM result r INNER JOIN `subject`

s ON r.SubjectNo

=s.SubjectNo WHERE s.SubjectName="数据库结构-1" ORDER BY r.StudentResult DESC;

 

#查询密码长度不足6位的学员信息(学员编号、姓名、密码、年级名称

SELECT s.studentNo,s.studentName,s.LoginPwd,g.gradeID FROM student s INNER JOIN grade g ON s.gradeID=g.gradeID 

WHERE LENGTH (s.LoginPwd)<6;

 

#使用表连接方式查询所有U1年级学员学号、姓名及年级名称

SELECT s.studentNo,s.studentName,s.LoginPwd,g.gradeID FROM student s INNER JOIN grade g ON s.gradeID=g.gradeID

WHERE g.GradeId<=1;

 

#查询数据结构-2,考试结果,并按高到低排序,同时把该成绩对应的学号、姓名打印出来,注意这里关联了三张表,这里的where表名了只查询数据库结构2,如果把where后面的去掉,那么查询结构将是包含所有科目的

#ON后面表示通过什么来关联,答案是通过学号和科目号来关联,核心表示result表,因为他既有学生的编号

//又有科目的编号

SELECT s.studentNo,s.studentName,r.StudentResult,sub.SubjectName FROM student s INNER JOIN result r ON s.StudentNo=r.StudentNo

INNER JOIN `subject` sub ON r.SubjectNo=sub.SubjectNo

WHERE sub.SubjectName="数据库结构-2" ORDER BY r.StudentResult DESC;

 

#查询《C语言1》的前5名学生成绩信息

SELECT r.StudentResult,s.SubjectName FROM result r INNER JOIN subject

s ON r.SubjectNo=s.SubjectNo WHERE s.SubjectName="C语言-1" ORDER BY r.StudentResult DESC LIMIT 0,5 ;

 

#按照不同的课程,分别算出其平均分、最高分和最低分,对于低于60分平均分的不予显示

select s.SubjectName,avg(r.StudentResult) as "平均分",max(r.StudentResult) as "最高分",min(r.StudentResult) as "最低分" FROM subject s INNER JOIN result r

on r.SubjectNo=s.SubjectNo GROUP by s.SubjectName HAVING min(r.StudentResult)>60

 

#查找某某所有考试的成绩(考试成绩、科目名称)

SELECT s.studentName,r.StudentResult,sub.SubjectName FROM student s INNER JOIN result r ON s.StudentNo=r.StudentNo

INNER JOIN `subject` sub ON r.SubjectNo=sub.SubjectNo #这2张表通过科目编号来关联

WHERE s.StudentName="李东方";

 

//查询某个科目大于60分的//查出C语言-1大于60分的同学

SELECT s.studentName,r.StudentResult,sub.SubjectName FROM student s INNER JOIN result r ON s.StudentNo=r.StudentNo

INNER JOIN `subject` sub ON r.SubjectNo=sub.SubjectNo where sub.SubjectName="C语言-1" AND R.StudentResult>60

#总结:内连接取交集,左外连接取左表记录包括交集,右外连接取右表记录,包括交集

 

#子查询:一个完整的查询嵌套另一个完整的查询,将子查询的结果返回给父查询当做条件使用

#查询课程为《高等数学-2》且分数不小于80分的学生的学号和姓名

#查询高等数学

SELECT sub.SubjectName FROM SUBJECT sub;

#查询分数

SELECT r.StudentResult FROM result r;

#查询学号姓名

SELECT s.StudentNo,s.StudentName FROM student s WHERE s.StudentNo IN(

SELECT r.StudentNo FROM result r WHERE r.SubjectNo IN(

SELECT sub.SubjectNo FROM `subject` sub WHERE sub.SubjectName="高等数学-2"

) AND r.StudentResult>=80

);

 

#使用子查询方式查询所有U1年级学员学号、姓名、年级ID

SELECT s.StudentNo,s.StudentName,s.gradeID FROM student s WHERE s.gradeID IN(

SELECT g.gradeID FROM grade g WHERE g.gradeID<=1

);

自连接查询 //一张表当做2张表来查

查询所有员工的姓名和直属上级的姓名

select e.ename,m.ename from emp e,emp m where e.mgr=m.eid;

 

自然连接 //属于内连接的一种

select r.StudentResult,s.SubjectName from result r natural join subject s

原文地址:https://www.cnblogs.com/binghuaZhang/p/10780438.html