zoukankan      html  css  js  c++  java
  • 链表查询,双表及多表

    连表查询;

    内连接:只显示匹配的数据

    交叉连接 : cross

    优点:简单

    两个表的数据条数相乘就是笛卡尔积: 笛卡尔积没有实际意义,有理论意义,让我们明白连接查询底层的原理

    menu表 与 role表 查询两个表的全部字段 * cross可以省略不写

    select * from menu cross join role

    自然连接 natural

    会自动匹配所有的同名列(并且同名列只保留一列)

    select rid ,username,fid ,id,url,fid

    from role

    natural

    join menu

    缺点:没有指明各列属于那个表,效率低下

    解决:指定表明

    select role.rid ,role.username,role.fid ,menu.id,menu.url,menu.fid from role natural join menu

    上面的表明有时可能会比较长,所以把表指定别名

    select r.rid ,r.username,r.fid ,m.id,m.url,m.fid from role r natural join menu m

    using子句:

    nutural自然连接的缺点:会自动的按照(所有的)同名列进行匹配,如果希望只按照某个同名列匹配怎么解决,使用using子句

    select r.rid ,r.username,r.fid ,m.id,m.url,m.fid from role r join menu m using(fid) --r.fid = d.fid 只列举出来满足条件的

    using,nutural的缺点:必须有同名列,主键外键不同明名的情况下要用on子句

    on子句

    select r.rid ,r.username,r.fid ,m.id,m.url,m.fid from role r join menu m on(r.fid = m.id) --括号中指明给 role表的fid等于menu表的id

    总结:到底什么时候用哪种连接(join)查询

    cross 不用 当你不知道怎么写查询语句的时候使用交叉查询分析一下,再根据需要选择用那个

    natural,using : 必须有同名列

    on 不管是否有同名列,均可使用,可读性强

    建议使用on

    select r.rid ,r.username,r.fid ,m.id,m.url,m.fid from role r join menu m on(r.fid = m.id) where rid >1

    语句后都可以追加where条件进行查询

    外连接:还可以显示全部或者部分不匹配的数据

    左外连接 left outer join outer可以省略不写 :除了显示匹配数据,还可以显示左表不匹配的数据

    select * from role r LEFT JOIN menu m on (r.rid = m.fid)

    右外连接 right outer join :除了显示匹配数据,还可以显示右表不匹配的数据

    select * from role r RIGHT JOIN menu m on (r.rid = m.fid)

    全外连接 full outer join:除了显示匹配数据,还可以显示左表右表不匹配的数据

    需要注意的是:MySQL到现在位置还不支持全外连接 Oracle支持

    select * from role r full JOIN menu m on (r.rid = m.fid)

    MySQL实现全外连接可以使用 union 把左外连接右外连接链接起来查询就可以实现全外连接

    select * from role r

    RIGHT JOIN menu m

    on (r.rid = m.fid)

    UNION

    select * from role r

    left JOIN menu m

    on (r.rid = m.fid)

    但是union 查询出来的数据有一个缺点 会去重、

    使用union all 则不会去重

    select * from role r

    RIGHT JOIN menu m

    on (r.rid = m.fid)

    UNION

    select * from role r

    left JOIN menu m

    on (r.rid = m.fid)

    使用union 去重固然好 但是查询效率低 union all 查询效率高

    三表查询

    id name员工姓名 target员工工资 sname 员工部门 rid员工工资等级

    select m.id,m.name,m.target,s.sname,r.rid

    FROM menu m

    join section s

    on (m.fid=s.sid)

    join role r

    on(m.target between r.zuidi and r.zuigao)

    四表查询

    select m.id,m.name,m.target,s.sname,r.rid,t.*

    FROM menu m

    join section s

    on (m.fid=s.sid)

    join role r

    on(m.name between r.zuidi and r.zuigao)

    join table4 t

    on(条件)

  • 相关阅读:
    Jenkins构建常见问题
    Jenkins搭建.NET自动编译发布远程环境
    Jenkins搭建.NET自动编译发布本地环境
    Web API系列(四) 使用ActionFilterAttribute 记录 WebApi Action 请求和返回结果记录
    C# 异步编程(async&await)
    [root@localhost ~]# /etc/httpd/conf/httpd.conf bash: /etc/httpd/conf/httpd.conf: 权限不够
    解决apache启动失败:Job for httpd.service failed.
    Windows环境下PHP配置详解
    如何以管理员身份运行cmd
    win8如何设置以管理员身份运行
  • 原文地址:https://www.cnblogs.com/wdyjt/p/14255497.html
Copyright © 2011-2022 走看看