建站学 - 轻松建站从此开始!

建站学-个人建站指南,网页制作,网站设计,网站制作教程

当前位置: 建站学 > 数据库 > 数据库综合 >

SQL查询入门(中篇)(3)

时间:2010-04-13 14:15来源: 作者: 点击:
自连接 谈到自连接,让我们首先从一个表和一个问题开始: 上面员工表(Employee),因为经理也是员工的一种,所以将两种人放入一个表中,MangerID字段表示的是当前员工的直系经理的员工id. 现在,我的问题是, 如何查

 

自连接

       谈到自连接,让我们首先从一个表和一个问题开始:

10

 

      上面员工表(Employee),因为经理也是员工的一种,所以将两种人放入一个表中,MangerID字段表示的是当前员工的直系经理的员工id.

      现在,我的问题是,如何查找CareySon的经理的姓名?

       可以看出,虽然数据存储在单张表中,但除了嵌套查询(这个会在后续文章中讲到),只有自连接可以做到.正确自连接语句如下:

SELECT m.EmployeeName
  FROM [fordemo].[dbo].[Employee] e
  inner join [fordemo].[dbo].[Employee] m
  on  e.ManagerID=m.id and e.EmployeeName='Careyson'

  

     在详细解释自连接的概念之前,请再看一个更能说明自连接应用之处的例子:

      11

      这个表是一个出席会议记录的表,每一行表示出席会议的记录(这里,由于表简单,我就不用EmployeeID和MeetingID来表示了,用名称对于理解表更容易些)

 

       好了,现在我的问题是:找出既参加“谈论项目进度”会议,又参加”讨论职业发展”会议的员工

      乍一看上去很让人迷惑是吧,也许你看到这一句脑中第一印象会是:

SELECT  EmployeeName
  FROM [fordemo].[dbo].[MeettingRecord] m
  where MeetingName='¨¬??????????¨¨' and meetingName='¨¬????¡ã¨°¦Ì¡¤¡é?1'

 

 

 

    (我用的代码高亮插件不支持中文,所以上面where子句后面第一个字符串是’谈论项目进度’,第二个是’讨论职业发展’)

     恩,恭喜你,答错了…如果这样写将会什么数据也得不到.正确的写法是使用自连接!

     自连接的是一种特殊的连接,是对物理上相同但逻辑上不相同的表进行连接的方式。我看到百度百科上说自连接是一种特殊的内连接,但这是错误的,因为两个相同表之间不光可以内连接,还可以外连接,交叉连接…在进行自连接时,必须为其中至少一个表指定别名以对这两个表进行区分!

     回到上面的例子,使用自连接,则正确的写法为:

SELECT  m.EmployeeName
  FROM [fordemo].[dbo].[MeettingRecord] m,
        [fordemo].[dbo].[MeettingRecord] m2
  where m.MeetingName='¨¬??????????¨¨' and m2.MeetingName='¨¬????¡ã¨°¦Ì¡¤¡é?1'
        and m.EmployeeName=m2.EmployeeName

 

   (关于乱码问题,请参考上面)

   

多表连接

 

     多个表连接实际上可以看成是对N个表进行n-1次双表连接.这样理解会让问题简单很多!

    1 2 12

    比如上面三个表,前两个表是我们已经在文章开始认识的,假设现在又添加了一个教师表,对这三个表进行笛卡尔积如下:

SELECT *
  FROM [fordemo].[dbo].[Class]
       cross join 
       [fordemo].[dbo].[Teacher]
       cross join 
       [fordemo].[dbo].[Student]

   结果可以如图表示:

   

13

 

总结

      文中对SQL中各种连接查询方式都做了简单的介绍,并利用一些Demo实际探讨各种连接的用处,掌握好各种连接的原理是写好SQL查询所必不可少的!

(责任编辑:admin)
织梦二维码生成器
顶一下
(0)
0%
踩一下
(0)
0%
------分隔线----------------------------
发表评论
请自觉遵守互联网相关的政策法规,严禁发布色情、暴力、反动的言论。
评价:
表情:
用户名: 验证码:点击我更换图片