连接查询
#连接查询 分为内连接和外连接(左外和右外),子连接,等值连接和非等值连接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