您的位置:首页 > 数据库

sql:内链接,外链节,嵌套查询,子查询说明

2016-10-12 15:28 260 查看

1 常用Sql查询

表A和表B要做关联查询:

表A当成主查询表:查询记录主体从主查询表出

表B关联表

1.1 内链接关联查询:

如果表A和表B有一个外键关联 ,可以通过外键进行内链接查询

select dictinfo.*,dicttype.typename
from dictinfo, dicttype
where dictinfo.typecode = dicttype.typecode

--不通过外键,通过groupid查询用户类型的代码结果集,只能查询出一条记录,可以使用内链接
selectsysuser.*, dictinfo.info
from sysuser,
(select dictcode, typecode, infofrom dictinfo
where typecode =
's01') dictinfo
where sysuser.groupid = dictinfo.dictcode

小结:如果主查询表字段从关联表只查询出一条记录,这个字段就可以作为内链接关联字段

--内链接的错误的例子,通过关联查询出重复记录
--使用groupid从select dictcode, typecode, info fromdictinfo可以找到多个记录,不能使用内链接,可能会出现重复记录

selectsysuser.*
from sysuser, (select dictcode, typecode, infofrom
dictinfo) dictinfo
where sysuser.groupid = dictinfo.dictcode

注意:如果使用内链接查询出现重复记录,首先去思考是否是sql写错了,不能直接去使用distinct去除重复记录。

有一些特殊情况下还是需要使用distinct去除重复记录,比如复杂的统计分析sql。

1.2 外链接关联查询:

表A,表B中只有一部分数据和表A匹配,不能使用内链接。

主查询是表A,只能使用外链接。

--查询用户所属单位,sysid对应三张表的id

selectsysuser.*,useryy.mcfrom sysuser
leftjoin useryyon sysuser.sysid =useryy.id

select *from useryy
rightjoin sysuseron sysuser.sysid =useryy.id

--以上的需要不能使用内链接
selectsysuser.*,useryy.mcfrom sysuser,useryywhere sysuser.sysid
= useryy.id

小结:

表A中从表B中只能关联查询一部分数据,只能使用外链接

1.3 子查询

selectsysuser.*,
(select * from useryywhereid = sysuser.sysid)
from sysuser

子查询只能返回一列,否则:报值过多

子查询只允许返回一行,否则:返回一行对应多行

正确的sql:

--子查询
--根据sysid取出单位名称
--根据groupid查询用户类型代码对应的名称
selectsysuser.*,
(select mcfrom useryy
whereid = sysuser.sysid)sysmc,
(select infofrom dictinfo
where dictcode = sysuser.groupidand typecode =
's01')groupname
from sysuser

1.4 嵌套表

可以将一个sql查询结果组成一个虚表,查询方式和查询一个实体表相同的。

组成的虚拟表字段是不允许重复的,否则:未明确定义列
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: