联结查询

  1.关系表

    主键:一列或一组列,能够唯一区分表中的每一行,用来表示一个特定的行

    外键:为某个表中的一列,包含另一个表的主键,定义量表的关系。

  2.创建联结

    规定要连接的表和他们如何关联即可

    在联结两个表时,将第一个表中的每一行与第二个表中的每一行配对,where子句作为过滤条件,只包含那些匹配给定的条件。如果不加where,返回检索数目为两表行数的乘积,也就是笛卡尔积。

内联接

  用典型的联接运算,使用像 =  或 <> 之类的比较运算符,包括相等联接和自然联接。使用:table1 inner join table2 on 条件,on传递联结条件

select user.*,orders.* from user inner join orders on user.u_id=orders.o_buyer_id;
+------+--------+--------+------------+--------+--------------+------+------------+-------------+---------------+---------+---------------+
| u_id | u_name | u_pwd | u_truename | u_role | u_email | o_id | o_buyer_id | o_seller_id | o_totalprices | o_state | o_information |
+------+--------+--------+------------+--------+--------------+------+------------+-------------+---------------+---------+---------------+
| 1 | z3 | aaaaa | zhang3 | seller | zhang@qq.com | 1 | 1 | 1 | 2.5 | sale | qianbi |
| 2 | w5 | aaabbb | wang5 | buyer | wang@163.com | 2 | 2 | 2 | 3.5 | sale | xiangpi |
| 3 | ll | cccbbb | lili | buyer | li@163.com | 3 | 3 | 3 | 3 | empty | wenjuhe |
+------+--------+--------+------------+--------+--------------+------+------------+-------------+---------------+---------+---------------+

外联结

  1.左外联结

  LEFT  JOIN或LEFT OUTER JOIN,左向外联接的结果集包括  LEFT OUTER子句中指定的左表的所有行,而不仅仅是联接列所匹配的行。如果左表的某行在右表中没有匹配行,则在相关联的结果集行中右表的所有选择列表列均为空值。

select user.*,orders.* from user left join orders on user.u_id=orders.o_buyer_id;
+------+--------+--------+------------+--------+--------------+------+------------+-------------+---------------+---------+---------------+
| u_id | u_name | u_pwd | u_truename | u_role | u_email | o_id | o_buyer_id | o_seller_id | o_totalprices | o_state | o_information |
+------+--------+--------+------------+--------+--------------+------+------------+-------------+---------------+---------+---------------+
| 1 | z3 | aaaaa | zhang3 | seller | zhang@qq.com | 1 | 1 | 1 | 2.5 | sale | qianbi |
| 2 | w5 | aaabbb | wang5 | buyer | wang@163.com | 2 | 2 | 2 | 3.5 | sale | xiangpi |
| 3 | ll | cccbbb | lili | buyer | li@163.com | 3 | 3 | 3 | 3 | empty | wenjuhe |
| 4 | xh | adadad | xiaohong | seller | hong@163.com | NULL | NULL | NULL | NULL | NULL | NULL |
| 5 | xm | kkkkk | xiaoming | seller | ming@qq.com | NULL | NULL | NULL | NULL | NULL | NULL |
+------+--------+--------+------------+--------+--------------+------+------------+-------------+---------------+---------+---------------+

  2.右外联结

  RIGHT  JOIN 或 RIGHT  OUTER  JOIN,右向外联接是左向外联接的反向联接。将返回右表的所有行。如果右表的某行在左表中没有匹配行,则将为左表返回空值。

user在左orders在右

select user.*,orders.* from user right join orders on user.u_id=orders.o_buyer_id;
+------+--------+--------+------------+--------+--------------+------+------------+-------------+---------------+---------+---------------+
| u_id | u_name | u_pwd | u_truename | u_role | u_email | o_id | o_buyer_id | o_seller_id | o_totalprices | o_state | o_information |
+------+--------+--------+------------+--------+--------------+------+------------+-------------+---------------+---------+---------------+
| 1 | z3 | aaaaa | zhang3 | seller | zhang@qq.com | 1 | 1 | 1 | 2.5 | sale | qianbi |
| 2 | w5 | aaabbb | wang5 | buyer | wang@163.com | 2 | 2 | 2 | 3.5 | sale | xiangpi |
| 3 | ll | cccbbb | lili | buyer | li@163.com | 3 | 3 | 3 | 3 | empty | wenjuhe |
+------+--------+--------+------------+--------+--------------+------+------------+-------------+---------------+---------+---------------+

orders在左user在右

select user.*,orders.* from orders right join user on user.u_id=orders.o_buyer_id;
+------+--------+--------+------------+--------+--------------+------+------------+-------------+---------------+---------+---------------+
| u_id | u_name | u_pwd | u_truename | u_role | u_email | o_id | o_buyer_id | o_seller_id | o_totalprices | o_state | o_information |
+------+--------+--------+------------+--------+--------------+------+------------+-------------+---------------+---------+---------------+
| 1 | z3 | aaaaa | zhang3 | seller | zhang@qq.com | 1 | 1 | 1 | 2.5 | sale | qianbi |
| 2 | w5 | aaabbb | wang5 | buyer | wang@163.com | 2 | 2 | 2 | 3.5 | sale | xiangpi |
| 3 | ll | cccbbb | lili | buyer | li@163.com | 3 | 3 | 3 | 3 | empty | wenjuhe |
| 4 | xh | adadad | xiaohong | seller | hong@163.com | NULL | NULL | NULL | NULL | NULL | NULL |
| 5 | xm | kkkkk | xiaoming | seller | ming@qq.com | NULL | NULL | NULL | NULL | NULL | NULL |
+------+--------+--------+------------+--------+--------------+------+------------+-------------+---------------+---------+---------------+

完全联结

  FULL  JOIN 或 FULL OUTER JOIN完整外部联接返回左表和右表中的所有行。当某行在另一个表中没有匹配行时,则另一个表的选择列表列包含空值。如果表之间有匹配行,则整个结果集行包含基表的数据值。mysql不支持

交叉连接

  将两个表的所有行进行组合,连接后的行数为两个表的乘积数(笛卡尔积),相当于用两表联结时不用where加联结条件,FROM 表名1 CROSS JOIN 表名2

select user.*,orders.* from user cross join orders;
+------+--------+--------+------------+--------+--------------+------+------------+-------------+---------------+---------+---------------+
| u_id | u_name | u_pwd | u_truename | u_role | u_email | o_id | o_buyer_id | o_seller_id | o_totalprices | o_state | o_information |
+------+--------+--------+------------+--------+--------------+------+------------+-------------+---------------+---------+---------------+
| 1 | z3 | aaaaa | zhang3 | seller | zhang@qq.com | 1 | 1 | 1 | 2.5 | sale | qianbi |
| 1 | z3 | aaaaa | zhang3 | seller | zhang@qq.com | 2 | 2 | 2 | 3.5 | sale | xiangpi |
| 1 | z3 | aaaaa | zhang3 | seller | zhang@qq.com | 3 | 3 | 3 | 3 | empty | wenjuhe |
| 2 | w5 | aaabbb | wang5 | buyer | wang@163.com | 1 | 1 | 1 | 2.5 | sale | qianbi |
| 2 | w5 | aaabbb | wang5 | buyer | wang@163.com | 2 | 2 | 2 | 3.5 | sale | xiangpi |
| 2 | w5 | aaabbb | wang5 | buyer | wang@163.com | 3 | 3 | 3 | 3 | empty | wenjuhe |
| 3 | ll | cccbbb | lili | buyer | li@163.com | 1 | 1 | 1 | 2.5 | sale | qianbi |
| 3 | ll | cccbbb | lili | buyer | li@163.com | 2 | 2 | 2 | 3.5 | sale | xiangpi |
| 3 | ll | cccbbb | lili | buyer | li@163.com | 3 | 3 | 3 | 3 | empty | wenjuhe |
| 4 | xh | adadad | xiaohong | seller | hong@163.com | 1 | 1 | 1 | 2.5 | sale | qianbi |
| 4 | xh | adadad | xiaohong | seller | hong@163.com | 2 | 2 | 2 | 3.5 | sale | xiangpi |
| 4 | xh | adadad | xiaohong | seller | hong@163.com | 3 | 3 | 3 | 3 | empty | wenjuhe |
| 5 | xm | kkkkk | xiaoming | seller | ming@qq.com | 1 | 1 | 1 | 2.5 | sale | qianbi |
| 5 | xm | kkkkk | xiaoming | seller | ming@qq.com | 2 | 2 | 2 | 3.5 | sale | xiangpi |
| 5 | xm | kkkkk | xiaoming | seller | ming@qq.com | 3 | 3 | 3 | 3 | empty | wenjuhe |
+------+--------+--------+------------+--------+--------------+------+------------+-------------+---------------+---------+---------------+

总结

  1. 查两表关联列相等的数据用内连接
  2. table1是table2的子集时用右外连接
  3. table1是table2的子集时用左外连接
  4. table1和table2彼此有交集但彼此互不为子集时候用全外
  5. 求差操作的时候用联合查询
  6. 多个表查询的时候,这些不同的连接类型可以写到一块

组合查询

  UNION---执行多个查询,也就是多条select语句,并将结果作为单个查询结果集返回,称为并或符合查询。

使用情况

  1. 单个查询中从不同的表返回类似结构的数据
  2. 单个表执行多个查询,按单个查询返回数据

使用规则

  1. 必须由两条及以上的select组成,语句间用UNION
  2. UNION中每个查询包含相同的列,表达式,或聚集函数
  3. 数据类型兼容,不必完全相同,DBMS可以隐士转换,如:不同日期类型或不同数值类型

总结

  1. UNION从查询结果集中自动除去了重复的行,这是默认的若果需要可以改变,用UNION ALL而不是UNION
  2. 只能使用一条order by,必须出现在最后一条select之后,不存在对结果集一部分排序一部分不排序

MySQL联结查询和组合查询的更多相关文章

  1. MySQL 自学笔记_Union(组合查询)

    1. Union查询简介 组合查询:有时在使用select语句进行数据查询时,想要将多个select语句在一个查询结果中输出,此时就需要使用Union关键字. Union的使用方法:用union将多个 ...

  2. Python操作Mysql数据库——多表组合查询

    前面我们介绍了单张表的查询,包括模糊查询.分组.排序.各种筛选条件等等操作,在实际应用中,查询的数据往往不止局限在一张表里,通常需要多张表在一起进行组合查询,今天我们将会对Mysql当中的多张有关联的 ...

  3. MySQL全面瓦解11:子查询和组合查询

    概述 子查询是SQL查询中的重要一块,是我们基于多表之间进行数据聚合和判断的一种手段,使得我们的处理复杂数据更加的便捷,这一节我们主要来了解一下子查询. 先做一下数据准备,这边建立三张表:班级.学生. ...

  4. SQL语句汇总(三)——聚合函数、分组、子查询及组合查询

    聚合函数: SQL中提供的聚合函数可以用来统计.求和.求最值等等. 分类: –COUNT:统计行数量 –SUM:获取单个列的合计值 –AVG:计算某个列的平均值 –MAX:计算列的最大值 –MIN:计 ...

  5. linq的简单查询 和 组合查询

    以Car表和Brand表为例,其中Car表的Brand是Brand表的Brandcode. (1)建立两表的linq(一定要做好主外键关系,),创建之后不用修改,如要添加,另建文件. (2)Car表的 ...

  6. LinQ各种方式查询、组合查询、IQueryable集合类型

    1.模糊查询(包含) Repeater1.DataSource = con.car.Where(r =>r.name.Contains(s)).ToList(); 2.开头查询 Repeater ...

  7. SQL语句汇总(三)——聚合函数、分组、子查询及组合查询

    拖了一个星期,终于开始写第三篇了.走起! 聚合函数: SQL中提供的聚合函数可以用来统计.求和.求最值等等. 分类: –COUNT:统计行数量 –SUM:获取单个列的合计值 –AVG:计算某个列的平均 ...

  8. LinQ高级查询、组合查询、IQueryable集合类型

    LinQ高级查询: 1.模糊查询(包含) Repeater1.DataSource = con.car.Where(r =>r.name.Contains(s)).ToList(); 2.开头 ...

  9. SolrJ查询条件组合查询实现——(十六)

    带查询条件的实现原理: 查询按钮被包在一个大表单,表单还有三个隐藏域,一个商品筛选,一个 价格,一个排序,每次点击查询时候清空三个隐藏域,就带着一个大条件去查询;点击下面的筛选条件时,给隐藏域的筛选条 ...

随机推荐

  1. 软件工程结对作业01 psp表格

  2. <Redis Advance><Pipelining><Memory Optimization><Expire><Transactions>

    Overview About Redis pipelining About Redis memory optimization About Redis expire About Redis trans ...

  3. L321 How Technology Is Revolutionizing Health Care

    How Technology Is Revolutionizing Health Care One of technology’s biggest potential impacts on healt ...

  4. .Net 3.5 安装教程

    虽然说.NET Framework 3.5 SP1已经不是最新版的,但是还有大部分用Xp系统的人还得用它.不过我们使用的系统一般都是Ghost版Xp,Ghost大部分都做过尽量的简化,去除了不必要的组 ...

  5. 2019-03-01-day002-基础编码

    01 昨日内容回顾 编译型: 一次性编译成二进制. 优点:质型速度快. 确定:开发效率低,不能跨平台. 解释型: 逐行解释,逐行运行. 优点:开发效率高,可以跨平台. 缺点:回字形效率低. pytho ...

  6. Python 进程的其他方法

    import time import os from multiprocessing import Process def f1(): print("子进程的pid",os.get ...

  7. LeetCode--1、26、27、35、53 Array(Easy)

      1. Two Sum Given an array of integers, return indices of the two numbers such that they add up to ...

  8. c++下基于windows socket的多线程服务器(基于TCP协议)

    之前用c++实现过基于windows socket的单线程TCP服务器(http://www.cnblogs.com/jzincnblogs/p/5170230.html),今天实现了一个多线程的版本 ...

  9. 用Synoptic Panel自定义基于图形的可视化控件--制作一张剧场售票统计报表

    数据可视化的一大特点就是能给报表使用者带来感官上的享受.不再是枯燥的数字,而变成一个一个亮丽的图形.之前业界大神公布过一个统计Car Accidents的报表,这个Power BI Report的特点 ...

  10. React-Native 上拉加载下拉刷新

    react-native 上下拉加载的控件效果都不好,找了半天没找到,正打算自已封装的时候,无意中找到了一个比较好的控件,大家看一下: react-native-refresh-list-view 这 ...