zoukankan      html  css  js  c++  java
  • 数据库的几种联结,union,union all ,inner jion ,left jion,right jion ,cross jion

     连接查询分类

    1.自连接查询,对同一个表进行连接操作
    2.内连接查询,【又分为:自然连接(就是等值连接去除重复的行,或者说select 后面选择要表示的列,而不是使用"*",列出所有列)、等值连接(就是where后使用"="来做逻辑判断)、不等值连接三种】

    【内连接时,返回的结果集仅是符合查询条件和连接条件的行。】
    3.外连接查询,【又分为:左外连接、右外连接、全外连接三种】

    采用外连接时,它返回到结果集合不仅包含符合连接条件的行,而且还包括的指定外连接中表的所有数据行。
    4.交叉连接查询,也作无条件查询。

    【返回表的笛卡尔集】
    5.联合查询 

    【返回的不是交集而是并集】

     示例表

    t1

    id name  sales date

    1 los 1500 2011-01-05 00:00:00.000
    2 san 250 2011-01-07 00:00:00.000
    3 los 320 2011-01-08 00:00:00.000
    4 boston 800 2011-01-08 00:00:00.000 

    t2

    id  sales  date

    1 250 2011-01-07 00:00:00.000
    2 535 2011-01-10 00:00:00.000
    3 320 2011-01-11 00:00:00.000
    4 750 2011-01-12 00:00:00.000

    多表连接

    1,自连接查询

    语法:【select 1.字段名1,表2.字段名2... from 1,表2  where 连接条件

    select * from t1 ,t2 where t1.sales=t2.sales

    id name sales date id sales date
    2 san 250 2011-01-07 00:00:00.000 1 250 2011-01-07 00:00:00.000
    3 los 320 2011-01-08 00:00:00.000 3 320 2011-01-11 00:00:00.000

    2.内连接查询

    语法:【select 1.字段名1,表2.字段名2...  FROM 1  join_type 表2 [ON (连接条件)] 

    inner join

    等值连接

    select * from t1 inner join  t2 on t1.sales=t2.sales

    id name sales date id sales date
    2 san 250 2011-01-07 00:00:00.000 1 250 2011-01-07 00:00:00.000
    3 los 320 2011-01-08 00:00:00.000 3 320 2011-01-11 00:00:00.000

    非等值连接

    select * from t1  inner join  t2 on t1.sales!=t2.sales

    id name sales date id sales date
    1 los 1500 2011-01-05 00:00:00.000 1 250 2011-01-07 00:00:00.000
    3 los 320 2011-01-08 00:00:00.000 1 250 2011-01-07 00:00:00.000
    4 boston 800 2011-01-08 00:00:00.000 1 250 2011-01-07 00:00:00.000
    1 los 1500 2011-01-05 00:00:00.000 2 535 2011-01-10 00:00:00.000
    2 san 250 2011-01-07 00:00:00.000 2 535 2011-01-10 00:00:00.000
    3 los 320 2011-01-08 00:00:00.000 2 535 2011-01-10 00:00:00.000
    4 boston 800 2011-01-08 00:00:00.000 2 535 2011-01-10 00:00:00.000
    1 los 1500 2011-01-05 00:00:00.000 3 320 2011-01-11 00:00:00.000
    2 san 250 2011-01-07 00:00:00.000 3 320 2011-01-11 00:00:00.000
    4 boston 800 2011-01-08 00:00:00.000 3 320 2011-01-11 00:00:00.000
    1 los 1500 2011-01-05 00:00:00.000 4 750 2011-01-12 00:00:00.000
    2 san 250 2011-01-07 00:00:00.000 4 750 2011-01-12 00:00:00.000
    3 los 320 2011-01-08 00:00:00.000 4 750 2011-01-12 00:00:00.000
    4 boston 800 2011-01-08 00:00:00.000 4 750 2011-01-12 00:00:00.000

    自然连接

    select t1.sales,t1.date from t1  inner join  t2 on t1.sales=t2.sales

    sales date
    250 2011-01-07 00:00:00.000
    320 2011-01-08 00:00:00.000

    left join

    select * from t1 left join  t2 on t1.sales=t2.sales

    id name sales date id sales date
    1 los 1500 2011-01-05 00:00:00.000 NULL NULL NULL
    2 san 250 2011-01-07 00:00:00.000 1 250 2011-01-07 00:00:00.000
    3 los 320 2011-01-08 00:00:00.000 3 320 2011-01-11 00:00:00.000
    4 boston 800 2011-01-08 00:00:00.000 NULL NULL NULL

    right join

    select * from t1 right join  t2 on t1.sales=t2.sales

    id name sales date id sales date
    2 san 250 2011-01-07 00:00:00.000 1 250 2011-01-07 00:00:00.000
    NULL NULL NULL NULL 2 535 2011-01-10 00:00:00.000
    3 los 320 2011-01-08 00:00:00.000 3 320 2011-01-11 00:00:00.000
    NULL NULL NULL NULL 4 750 2011-01-12 00:00:00.000

    full outer join

    select * from t1 full outer join  t2 on t1.sales=t2.sales

    1 los 1500 2011-01-05 00:00:00.000 NULL NULL NULL
    2 san 250 2011-01-07 00:00:00.000 1 250 2011-01-07 00:00:00.000
    3 los 320 2011-01-08 00:00:00.000 3 320 2011-01-11 00:00:00.000
    4 boston 800 2011-01-08 00:00:00.000 NULL NULL NULL
    NULL NULL NULL NULL 2 535 2011-01-10 00:00:00.000
    NULL NULL NULL NULL 4 750 2011-01-12 00:00:00.000

    cross join

    select * from t1 cross join  t2

    id name sales date id sales date
    1 los 1500 2011-01-05 00:00:00.000 1 250 2011-01-07 00:00:00.000
    2 san 250 2011-01-07 00:00:00.000 1 250 2011-01-07 00:00:00.000
    3 los 320 2011-01-08 00:00:00.000 1 250 2011-01-07 00:00:00.000
    4 boston 800 2011-01-08 00:00:00.000 1 250 2011-01-07 00:00:00.000
    1 los 1500 2011-01-05 00:00:00.000 2 535 2011-01-10 00:00:00.000
    2 san 250 2011-01-07 00:00:00.000 2 535 2011-01-10 00:00:00.000
    3 los 320 2011-01-08 00:00:00.000 2 535 2011-01-10 00:00:00.000
    4 boston 800 2011-01-08 00:00:00.000 2 535 2011-01-10 00:00:00.000
    1 los 1500 2011-01-05 00:00:00.000 3 320 2011-01-11 00:00:00.000
    2 san 250 2011-01-07 00:00:00.000 3 320 2011-01-11 00:00:00.000
    3 los 320 2011-01-08 00:00:00.000 3 320 2011-01-11 00:00:00.000
    4 boston 800 2011-01-08 00:00:00.000 3 320 2011-01-11 00:00:00.000
    1 los 1500 2011-01-05 00:00:00.000 4 750 2011-01-12 00:00:00.000
    2 san 250 2011-01-07 00:00:00.000 4 750 2011-01-12 00:00:00.000
    3 los 320 2011-01-08 00:00:00.000 4 750 2011-01-12 00:00:00.000
    4 boston 800 2011-01-08 00:00:00.000 4 750 2011-01-12 00:00:00.000

    union 指令表示将多个表合并显示,并不是连接显示。union只是把结果集并集起来,而不是交集出来。

    union的限制是多个表的列必须是相同的种类

    union 并起来的结果集自动执行distincd,去除重复的列。

    union all 则把重复列保留,完整显示多个结果集的并集

    下面看实例 

    执行:select date from t1 union all  select date from t2

    date
    2011-01-05 00:00:00.000
    2011-01-07 00:00:00.000
    2011-01-08 00:00:00.000
    2011-01-08 00:00:00.000
    2011-01-07 00:00:00.000
    2011-01-10 00:00:00.000
    2011-01-11 00:00:00.000
    2011-01-12 00:00:00.000 

    可以看出完整的现实了8个行

    执行:select date from t1 union   select date from t2

    date
    2011-01-05 00:00:00.000
    2011-01-07 00:00:00.000
    2011-01-08 00:00:00.000
    2011-01-10 00:00:00.000
    2011-01-11 00:00:00.000
    2011-01-12 00:00:00.000

    只显示6个行,有重复日期的7,8月份都只保留了一个唯一值

    如果执行:select date,sales from t1 union   select date,sales from t2

    date sales
    2011-01-05 00:00:00.000 1500
    2011-01-07 00:00:00.000 250
    2011-01-08 00:00:00.000 320
    2011-01-08 00:00:00.000 800
    2011-01-10 00:00:00.000 535
    2011-01-11 00:00:00.000 320
    2011-01-12 00:00:00.000 750

    可以看出7月份,sales为250的数据有重复,被去除了,只保留了一个

    如果执行:select date,sales from t1 union all  select date,sales from t2

    date sales

    2011-01-05 00:00:00.000 1500
    2011-01-07 00:00:00.000 250
    2011-01-08 00:00:00.000 320
    2011-01-08 00:00:00.000 800
    2011-01-07 00:00:00.000 250
    2011-01-10 00:00:00.000 535
    2011-01-11 00:00:00.000 320
    2011-01-12 00:00:00.000 750

  • 相关阅读:
    Ext.Net学习笔记02:Ext.Net用法概览
    Ext.Net学习笔记01:在ASP.NET WebForm中使用Ext.Net
    【转】好的用户界面-界面设计的一些技巧
    发布mvc报错:403.14-Forbidden Web 服务器被配置为不列出此目录的内容
    抢票季:吐槽12306 & 分享抢票经验
    2.5星|《解谜茑屋》:疑似企业公关稿,对话体,信息含量较低
    樊登推荐过的书15本,好书2本半
    一些黑猩猩会使用草药治病,疗效还不错:3.5星|邓巴《人类的算法》
    莫奈塞尚的知名度,主要归功于富豪画家卡耶博特的遗赠:4星|《引爆流行》
    4星|《猎药师》:五千年以来药物研发简史,作者是前一线科学家
  • 原文地址:https://www.cnblogs.com/fslnet/p/2306132.html
Copyright © 2011-2022 走看看