zoukankan      html  css  js  c++  java
  • MySQL关联查询总结

    MySQL中经常使用关联查询,有机会总结下:

    1 left join(左联查询):

    返回包括左表中的所有记录和右表中联接字段相等的记录

    例:select * from a left join b on a.id=b.id

    2 right join(右联查询):

    right join(右联接)返回包括右表中的所有记录和左表中联接字段相等的记录

    例:select * from a right join b on a.id=b.id

    看到这里可能比较还是有点不明白,请看以下示例

    假如有两张表,A B

    表A记录如下:
    aID     aNum
    1     a20050111
    2     a20050112
    3     a20050113
    4     a20050114
    5     a20050115

    表B记录如下:
    bID     bName
    1     2006032401
    2     2006032402
    3     2006032403
    4     2006032404
    8     2006032408

    执行select * from A left join B  on A.aID = B.bID

    结果如下:
    aID     aNum     bID     bName
    1     a20050111    1     2006032401
    2     a20050112    2     2006032402
    3     a20050113    3     2006032403
    4     a20050114    4     2006032404
    5     a20050115    NULL     NULL

    结果:从查询结果可以看出左关联查询是以左表的表为主表进行查询,由于A表中aID为5的在右表中没有对应记录,因此查询结果中最后一行又两个NULL列,同理可以得出右关联的原理。

    3 内联查询(联接查询):在where子句中指定条件,将多个表连接起来

    select  c.cname,b.bookname from cats c,book b, where c.id=b.catid

    看到这里,可能不禁发问,这三者有什么区别?看下面这个例子

    有两张数据表,表user(id, name)记录了用户的ID和昵称,表article(id,uid,title, content, time)记录了用户发表的文章标题.内容和时间,写一个SQL语句打印出每个用户的昵称及其发表的文章总数

    解决方法1:

    select u.name,count(a.id) from user u,article a where u.id=a.uid group by a.uid

    解决方法2:

    select u.name,count(a.id) from user u left join article a on u.id=a.uid group by a.uid

    假如出现这种情况:有一个用户没有发表文章,那么第一个解决方案不会出现这个用户,因此第一种是错误的。

    4嵌套查询

    在一个select语句的where子句中,包含另一个select子句,也可称为子查询。嵌套查询的原理一般是由里向外。

    例:select bookid,bookname from books where bookid in(select bookid from cats );

    最近做面试题,碰到几个比较有意思的Mysql操作,总结如下:

    a)关系S(s#, sname, sex), C (c#, cname), SC(s#, c#) . 其中S#为学生号,sname为学生姓名,sex为性别,c#为课程号,cname为课程名。

    写出查询选修"计算机"课的全体女学生姓名的SQL语句。

    select S.s#,S.sname from S,SC where S.s#=SC.s#  and S.sex=1 and SC.c# in (select from C where cname='计算机' )

    写出查询没有选修"数学"课的学生姓名的SQL语句。

    select * from S where s# not in(select from S,SC where S.s#=SC.s# and SC.c# in ( select c# from C where  cname='数学'))

    b)列三张表,请根据要求写出SQL语句

    CARD借书卡。 CNO卡号,NAME姓名,CLASS班级

    BOOKS图书。 BNO书号,BNAME书名,AUTHOR作者,PRICE单价

    BORROW借书记录。 CNO借书卡号,BNO书号,RDATE还书日期

    备注:限定每人每种书只能借一本

    找出借书超过5本的读者,输出借书卡号,及所借图书册数。(5分)

    错误写法: select c.name, count(b.cno) total from card c,borrow b where c.cno=b.cno  and total>5 group by b.cno ;

    正确写法:select c.name, count(b.cno) total from card c,borrow b where c.cno=b.cno group by b.cno having total>=5;

    由于使用的是group进行分组,而在group by进行分组查询统计后,只能使用having子句来对查询结果进行进一步的过滤。

     

  • 相关阅读:
    清理git提交记录并不能达到真正硬盘“瘦身”
    virtualbox虚拟机异常暂停
    百兆带宽升千兆-番外篇
    流水文之百兆带宽升千兆
    OSS设置静态网站托管+CDN加速OSS域名
    每日一坑-exsi中win虚拟机调分辨率
    nginx筛选字段+excel统计
    树莓派使用Samba共享文件
    chrome无法使用独显解决
    解决jdk16安装后无jre目录的问题
  • 原文地址:https://www.cnblogs.com/kongxs/p/3364125.html
Copyright © 2011-2022 走看看