内容来自于
l怎么写Sql语句的思路:
主查询表:SYSUSER
关联查询表:userjd(监督单位表),useryy(医院表)
SQL查询分为:
1.内连接
如果两张表有外键关系就可以使用内连接,因为通过内连接每一条只能返回单条记录。话句话说如果主查询表的字段通过关联查询表能查到(且只能查询一条,就是在关联表中只能查出一条),可以使用内链接。
举例1:
表:DICTINFO:
如下:
这边表中ID是主键。在这里TYPECODE是外键。
表:DICTTYPE.
如下:
其中TYPECODE是主键。
这样一来两张表就有了主外键的关系(表DICTTYPE的主键TYPECODE在表DICTINFO中是外键)。
好了我们就可以使用内连接了。
为什么上面说通过内连接每一条只能返回单条记录呢?
因为:你想啊,typecode是外键,什么是外键?在表dicttype中typecode是主键,主键是唯一的,那么就是typecode都是唯一的,那么dictinfo.typecode去匹配dicttype里面的
typecode时只有一条记录,这就是说只能返回单条的记录,也就是说如果在dicttype中的codetype不是唯一的,那么就会查出来多条的记录,那么就不是内连接了。
举例2:
再举一个例子:做一个数据查询使用内连接的方式。
假设有两张表sysuser表还有dictinfo表,我们查sysuser表查出了Userid和GroupID如下:
但是我想知道这里的GROUPID到底代表是什么,我们根据表的设计可以从dictinfo表中查到1,2,3,4到底代表什么,比如
好了知道了要求后我们就来使用内连接来实现。
其实
这个东西就是一个结果集我们把它当成一张表(这里的DICTCODE具有唯一性,可以当成是主建),好比我们拿一个3来这里匹配DICTODE,只能匹配出一个记录。所以可以内连接。
只要在关联表中查询出一条记录就可以使用内连接。
所以根据内连接思路我们这么写sql语句:
sysuser表是主查询表。
(select id,info,dictcode from dictinfo where typecode='s01') grouptable是关联表。
select userid,groupid,info from sysuser,(select id,info,dictcode from dictinfo where typecode='s01') grouptable where grouptable.dictcode=sysuser.groupid
(select id,info,dictcode from dictinfo where typecode='s01') grouptable 就相当于把查出来的结果集当成了一张grouptable的表。
如果从关联查询表中得到多条记录有重复记录,使用内连接如果出现重复记录则大部分的情况说明查询时错误的,在确保sql查询没有逻辑错误的情况下可以使用distinct去除重复的记录。
写一个例子来验证上面的观点,
我们用select id,info,dictcode from dictinfo语句来查询可以得到下面的结果。

很明显这里的结果集中的DICTCODE就不是唯一的了,那么关联表中查出来的数据就不止一条了。

上面的结果就是错的,那么我们就使用别的方法来解决上面的问题。
select userid,groupid,info from sysuser,(select typecode,id,info,dictcode from dictinfo ) grouptable where
grouptable.dictcode=sysuser.groupid and grouptable.typecode='s01'
这句SQL就可以解决上面的问题。
2.外链接
先给出需求:我们在查询系统用户表中对应的医院的单位名称,(如果该用户是医院的用户则显示医院的名字就是说的达到的效果是:把用户表中的数据都查出来,然后发现这个用户是医院里面的人员,就把医院的名字显示出来,这样效果用内连接是达不到的,后面详细说明区别)
主查询表:系统用户表。
关联表查询表:医院单位表。
显示全部数据的是主查询表。显示部分数据的是关联查询表。
左外连接:left join;left 左边是主查询表,left右边是关联查询表。
右外链接:right join;right join右边是主查询表,right join 左边是关联查询表。
语句
从上面的结果来看,满足了需求,只要用户是医院的就显示医院的名字,不是医院的人那么MC这个字段就是空的。前面说过,如果是内连接就不能达到这种效果,为什么?
上面就是内连接的结果,你看只有关联查询表中有的才能查出来,所以造成的结果就是只有医院的人查询出了,但是系统表中其他的人就没有 查出来。
使用右外连接:
结果正确。
3.子查询
子查询的查询规则通过关联表的主键关联查询是绝对没有问题的,但是也可以不通过关联表的主键查询(但是子查询关联查询的结果集只能有一条记录)
需求1:
查询系统的用户表,关联查询单位名称
在主表上做子查询,主表记录会全部显示;
如下:
达到了外连接的效果。
需求2:
除了上面的查询单位的名称,还要查询用户类型的名称。这个的话就要关联查询数据字典
前面提到过子查询的查询规则通过关联表的主键关联查询是绝对没有问题的,但是也可以不通过关联表的主键查询(但是子查询关联查询的结果集只能有一条记录)。
所以我们不打算使用关联表的主键查询。
select sysuser.*, (select mc from useryy where sysuser.sysid=useryy.id)useryymc,
(select info from dictinfo where dictinfo.dictcode=sysuser.groupid and dictinfo.typecode='s01') sysinfo
from sysuser
where dictinfo.dictcode=sysuser.groupid and dictinfo.typecode='s01' 可以确定关联查询唯一。确定唯一了就相当于主键了么。
4.表的嵌套查询