联结查询

  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. IDEA中maven的依赖jar包报红

    问题描述: 查看本地的repository中有相关的jar包,但是在IDEA中就是报红(下面红色波浪线) 解决方法: 将pom.xml中相关的dependcy配置注释掉,maven中jar包就会删除. ...

  2. python第一个程序HelloWorld

    在写第一个python程序之前,我们还需要了解的一个东西就是python解释器 解释器,顾名思义,就是解释一段代码的机器,程序运行的平台,例如Java的解释器就是jdk. 我们在写好的python代码 ...

  3. 手机号的 AES/CBC/PKCS7Padding 加解密

    前言:接口中上次的手机号码和密码是传入的加密的,模拟自动化的时候也需要先对数据进行加密 1.各种语言实现 网上已经各种语言实现好的AES加密,可以点击查看:http://outofmemory.cn/ ...

  4. day 31 udp 协议SOCK_DGRAM

    udp 服务端引用socket=类型,协议绑定地址 和 端口while 循环收到 data addr = 服务.recvfrom(1024)发送 服务.sendto(data,addr(ip 端口)) ...

  5. Node.js 回调函数 1) 阻塞 ,同步 2) 非阻塞 ,异步.

    1.阻塞. 同步. 1) 读取的文件: input.txt 菜鸟教程官网地址:www.runoob.com 2) main.js var fs = require("fs"); / ...

  6. C#窗体换肤

    Form1.cs using System;using System.Collections.Generic;using System.ComponentModel;using System.Data ...

  7. 什么时候用深搜(dfs)什么时候用广搜(bfs)(转)

    1.BFS是用来搜索最短径路的解是比较合适的,比如求最少步数的解,最少交换次数的解,因为BFS搜索过程中遇到的解一定是离根最近的,所以遇到一个解,一定就是最优解,此时搜索算法可以终止.这个时候不适宜使 ...

  8. c++ 类图

    https://baijiahao.baidu.com/s?id=1609647985519542865&wfr=spider&for=pc

  9. 【转】C++类内存分布

    C++类内存分布  https://www.cnblogs.com/jerry19880126/p/3616999.html 书上类继承相关章节到这里就结束了,这里不妨说下C++内存分布结构,我们来看 ...

  10. 使用Sphinx为你的python模块自动生成文档

    Sphinx是一个可以用于Python的自动文档生成工具,可以自动的把docstring转换为文档,并支持多种输出格式包括html,latex,pdf等. 安装 创建一个sphinx项目 下面的命令会 ...