• 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

  • 相关阅读:
    [leetcode]Combination SumII
    NSum小结
    image 与 canvas 的相互转化
    $_SERVER 相关变量
    最近做的项目,总结一下。
    开始在博客园,写博客,先写点东西。
    Codeforces Round #584 C. Paint the Digits
    Codeforces Round #584 B. Koala and Lights
    Codeforces Round #584 A. Paint the Numbers
    HDU-2296-Ring(AC自动机, DP)
  • 原文地址:https://www.cnblogs.com/binghuaZhang/p/10780438.html
Copyright © 2020-2023  润新知