zoukankan      html  css  js  c++  java
  • MSSQL 详解SQL Server连接(内连接、外连接、交叉连接)

         在查询多个表时,我们经常会用“连接查询”。连接是关系数据库模型的主要特点,也是它区别于其它类型数据库管理系统的一个标志。

    什么是连接查询呢?

    概念:根据两个表或多个表的列之间的关系,从这些表中查询数据。

    目的:实现多个表查询操作。

    知道了连接查询的概念之后,什么时候用连接查询呢?

    一般是用作关联两张或两张以上的数据表时用的。看起来有点抽象,我们举个例子,做两张表:学生表(T_student)和班级表(T_class)

     1 --创建DB
     2 --filename修改为自己电脑上MSSQL存储的位置
     3 create database MyTestDB
     4 on primary 
     5 (
     6     name='MyTestDB',
     7     filename='D:yangZ_MSSQLMyTestDB.mdf',
     8     size=10mb,
     9     maxsize=100mb,
    10     filegrowth=10%
    11 )
    12 log on
    13 (
    14     name='MyTestDB_log',
    15     filename='D:yangZ_MSSQLMyTestDB_log.ldf',
    16     size=2mb,
    17     maxsize=100mb,
    18     filegrowth=5mb
    19 )
    20 ---------------------------------------------
    21 use MyTestDB
    22 go
    23 
    24 create table T_Student
    25 (
    26     id int identity(1,1) primary key,
    27     student nvarchar(100) not null,
    28     classId int not null
    29 )
    30 
    31 create table T_Class
    32 (
    33     classId int identity(1,1) primary key,
    34     chassName nvarchar(100) not null
    35 )
    36 -------------------------------------------
    37 ---设置T_Student classId字段为外键
    38 alter table T_Student add constraint FK_T_Student_classId foreign key(classId) references T_Class(classId)
    39 -- 增加外键约束时,设置【级联更新、级联删除】:来保证,当主键表中的记录发生改变时候,对应的外键表中的数据也发生相应的改变。
    40 on delete cascade
    41 on update cascade
    42 
    43 ---删除外键
    44 alter table T_Student drop constraint FK_T_Student_classId
    45 
    46 -------------------------------------------
    47 insert into T_Class
    48 select '一班' union all
    49 select '二班' union all
    50 select '三班' union all
    51 select '四班' 
    52 go
    53 
    54 insert into T_Student
    55 select '老赵',1 union all
    56 select '老钱',2 union all
    57 select '老孙',3 union all
    58 select '老李',5
    59 go
    60 -------------------------------------------
    61 select * from T_Student
    62 select * from T_Class
    MSSQL create DB and Table(T_Student/T_Class)

    连接标准语法格式:

      SQL-92标准所定义的FROM子句的连接语法格式为:

      FROM join_table join_type join_table[ON (join_condition)]

      其中join_table指出参与连接操作的表名,连接可以对同一个表操作,也可以对多表操作,对同一个表操作的连接又称做自连接。join_type 指出连接类型。join_condition指连接条件。

    连接类型:

      连接分为三种:内连接(INNER JOIN)外连接交叉连接(CROSS JOIN)[也称迪卡尔积]。

    内连接: 等值连接、不等连接、自然连接

    外连接: 左连接(LEFT JOIN/LEFT OUTER JOIN)、右连接(RIGHT JOIN/RIGHT OUTER JOIN)和全连接(FULL JOIN/FULL OUTER JOIN)

    交叉连接: 不带where、有where子句

    内连接(INNER JOIN)

      使用比较运算符(包括=、>、<、<>、>=、<=、!>和!<)进行表间的比较操作,查询与连接条件相匹配的数据。根据比较运算符不同,内连接分为等值连接、自然连接和不等连接三种。

    1、等值连接

    概念:在连接条件中使用等于号(=)运算符,其查询结果中列出被连接表中的所有列,包括其中的重复列。

    1 select * from T_Student as s,T_Class as c 
    2 where s.classId = c.classId
    3 --等价于下面的写法
    4 select * from T_student s inner join T_class c on s.classId = c.classId

    MSSQL查询结果为:

    2、不等连接

    概念:在连接条件中使用除等于号之外运算符(>、<、<>、>=、<=、!>和!<)

    1 select * from T_Student as s, T_Class as c
    2 where s.classId <> c.classId
    3 --等价于下面的写法
    4 select * from T_Student s inner join T_Class c on s.classId <> c.classId

    MSSQL查询结果为:

    3、自然连接

    概念:连接条件和等值连接相同,但是会删除连接表中的重复列。

    查询语句同等值连接基本相同:

     1 select s.*,c.chassName from T_student s inner join T_class c on s.classId = c.classId 

    MSSQL查询结果为:

    总结:内连接是只显示满足条件的!

    外连接  

      外连接分为左连接(LEFT JOIN)或左外连接(LEFT OUTER JOIN)、右连接(RIGHT JOIN)或右外连接(RIGHT OUTER JOIN)、全连接(FULL JOIN)或全外连接(FULL OUTER JOIN)。我们就简单的叫:左连接、右连接和全连接。

    1、左连接:

    概念:返回左表中的所有行,如果左表中行在右表中没有匹配行,则结果中右表中的列返回空值。

     1 select * from T_student s left join T_class c on s.classId = c.classId 

    MSSQL查询结果为:

    总结:左连接显示左表全部行,和右表与左表相同行。

    2、右连接:

    概念:恰与左连接相反,返回右表中的所有行,如果右表中行在左表中没有匹配行,则结果中左表中的列返回空值

     1 select * from T_student s right join T_class c on s.classId = c.classId 

    MSSQL查询结果为:

    总结:右连接恰与左连接相反,显示右表全部行,和左表与右表相同行。

    3、全连接:

    概念:返回左表和右表中的所有行。当某行在另一表中没有匹配行,则另一表中的列返回空值

     1 select * from T_student s full join T_class c on s.classId = c.classId 

    MSSQL查询结果为:

    总结:返回左表和右表中的所有行。

    交叉连接(CROSS JOIN):也称迪卡尔积

    概念:不带WHERE条件子句,它将会返回被连接的两个表的笛卡尔积,返回结果的行数等于两个表行数的乘积(例如:T_student和T_class,返回4*4=16条记录),

         如果带where,返回或显示的是匹配的行数。

    1、不带where:

    1 select *from T_student cross join T_class  
    2 --等于  
    3 select *from T_student, T_class

    MSSQL查询结果为:

    总结:相当与笛卡尔积,左表和右表组合。

    2、有where子句,往往会先生成两个表行数乘积的数据表,然后才根据where条件从中选择。

    1 select * from T_student s cross join T_class c where s.classId = c.classId   
    2 --(注:cross join后加条件只能用where,不能用on) 

    MSSQL查询结果为:

    查询结果跟等值连接的查询结果是一样。

    MSSQL全部源码参考:

      1 --创建DB
      2 --filename修改为自己电脑上MSSQL存储的位置
      3 create database MyTestDB
      4 on primary 
      5 (
      6     name='MyTestDB',
      7     filename='D:yangZ_MSSQLMyTestDB.mdf',
      8     size=10mb,
      9     maxsize=100mb,
     10     filegrowth=10%
     11 )
     12 log on
     13 (
     14     name='MyTestDB_log',
     15     filename='D:yangZ_MSSQLMyTestDB_log.ldf',
     16     size=2mb,
     17     maxsize=100mb,
     18     filegrowth=5mb
     19 )
     20 ---------------------------------------------
     21 use MyTestDB
     22 go
     23 
     24 create table T_Student
     25 (
     26     id int identity(1,1) primary key,
     27     student nvarchar(100) not null,
     28     classId int not null
     29 )
     30 
     31 create table T_Class
     32 (
     33     classId int identity(1,1) primary key,
     34     chassName nvarchar(100) not null
     35 )
     36 -------------------------------------------
     37 ---设置T_Student classId字段为外键
     38 alter table T_Student add constraint FK_T_Student_classId foreign key(classId) references T_Class(classId)
     39 -- 增加外键约束时,设置【级联更新、级联删除】:来保证,当主键表中的记录发生改变时候,对应的外键表中的数据也发生相应的改变。
     40 on delete cascade
     41 on update cascade
     42 
     43 ---删除外键
     44 alter table T_Student drop constraint FK_T_Student_classId
     45 
     46 -------------------------------------------
     47 insert into T_Class
     48 select '一班' union all
     49 select '二班' union all
     50 select '三班' union all
     51 select '四班' 
     52 go
     53 
     54 insert into T_Student
     55 select '老赵',1 union all
     56 select '老钱',2 union all
     57 select '老孙',3 union all
     58 select '老李',5
     59 go
     60 -------------------------------------------
     61 select * from T_Student
     62 select * from T_Class
     63 -------------------------------------------
     64 --1、等值连接
     65 --概念:在连接条件中使用等于号(=)运算符,其查询结果中列出被连接表中的所有列,包括其中的重复列。
     66 select * from T_Student as s,T_Class as c 
     67 where s.classId = c.classId
     68 --等价于下面的写法
     69 select * from T_student s inner join T_class c on s.classId = c.classId
     70 -------------------------------------------
     71 --2、不等连接
     72 --概念:在连接条件中使用除等于号之外运算符(>、<、<>、>=、<=、!>和!<)
     73 select * from T_Student as s, T_Class as c
     74 where s.classId <> c.classId
     75 --等价于下面的写法
     76 select * from T_Student s inner join T_Class c on s.classId <> c.classId
     77 -------------------------------------------
     78 --3、自然连接
     79 --概念:连接条件和等值连接相同,但是会删除连接表中的重复列。
     80 --查询语句同等值连接基本相同:
     81 select s.*,c.chassName from T_student s inner join T_class c on s.classId = c.classId
     82 
     83 ------------------------------------------
     84 --1、左连接:
     85 --概念:返回左表中的所有行,如果左表中行在右表中没有匹配行,则结果中右表中的列返回空值。
     86 select * from  T_student s left join T_class c on s.classId = c.classId
     87 ------------------------------------------
     88 --2、右连接:
     89 --概念:恰与左连接相反,返回右表中的所有行,如果右表中行在左表中没有匹配行,则结果中左表中的列返回空值
     90 select * from  T_student s right join T_class c on s.classId = c.classId
     91 ------------------------------------------
     92 --3、全连接:
     93 --概念:返回左表和右表中的所有行。当某行在另一表中没有匹配行,则另一表中的列返回空值
     94 select * from  T_student s full join T_class c on s.classId = c.classId
     95 -------------------------------------------
     96 --交叉连接(CROSS JOIN):也称迪卡尔积
     97 --1、不带where:
     98 select *from T_student cross join T_class  
     99 --等于  
    100 select *from T_student, T_class
    101 -------------------------------------------
    102 --2、有where子句,往往会先生成两个表行数乘积的数据表,然后才根据where条件从中选择。
    103 select * from T_student s cross join T_class c where s.classId = c.classId   
    104 --(注:cross join后加条件只能用where,不能用on) 
    MSSQL全部源码
  • 相关阅读:
    springboot mail 发送邮件
    颜色透明度16进制对照表
    Java基础系列之(三)
    QQ2010协议分析系列(五)
    QQ2010协议分析系列(四)
    QQ2010协议分析系列(三)
    QQ2010协议分析系列(二)
    QQ2010协议分析系列(一)
    Java基础系列之(二)
    Java基础系列之(一)
  • 原文地址:https://www.cnblogs.com/DrHao/p/5234293.html
Copyright © 2011-2022 走看看