MySQL DML操作--------多表联合查询实战

1. 背景

* 多表联合查询是把不同表的记录到一起的一种方式

* 在SQL标准中规划的联合(join)大致分内连接,外连接,全连接。其中外连接又分左外连接,右外连接。

2. 内连接例子 (inner join) [ 员工 --> 部门 ] 

* 查看员工表[ employees ]和部门表[ departments ]结构

mysql> desc employees;
+-----------+---------------+------+-----+---------+----------------+
| Field     | Type          | Null | Key | Default | Extra          |
+-----------+---------------+------+-----+---------+----------------+
| id        | bigint(20)    | NO   | PRI | NULL    | auto_increment |
| name      | varchar(64)   | NO   |     | NULL    |                |
| sex       | enum(‘M‘,‘F‘) | NO   |     | NULL    |                |
| age       | int(11)       | NO   |     | NULL    |                |
| depart_id | bigint(20)    | NO   |     | NULL    |                |
+-----------+---------------+------+-----+---------+----------------+
5 rows in set (0.00 sec)

mysql> desc departments;
+-------+-------------+------+-----+---------+----------------+
| Field | Type        | Null | Key | Default | Extra          |
+-------+-------------+------+-----+---------+----------------+
| id    | bigint(20)  | NO   | PRI | NULL    | auto_increment |
| name  | varchar(64) | NO   |     | NULL    |                |
+-------+-------------+------+-----+---------+----------------+
2 rows in set (0.00 sec)

* 查看员工表[ employees ]和部门表[ departments ]数据

mysql> select * from employees;
+----+-------+-----+-----+-----------+
| id | name  | sex | age | depart_id |
+----+-------+-----+-----+-----------+
|  1 | tom   | M   |  25 |         1 |
|  2 | jak   | F   |  35 |         2 |
|  3 | lisea | M   |  22 |         3 |
+----+-------+-----+-----+-----------+
3 rows in set (0.00 sec)

mysql> select * from departments;
+----+------+
| id | name |
+----+------+
|  1 | dev  |
|  2 | test |
|  3 | ops  |
+----+------+
3 rows in set (0.00 sec)

* 查询并显示所有员工id, 姓名,姓别,年龄,所在部门 (方法一)

mysql> select e.id id, e.name name, IF(e.sex = ‘M‘, ‘male‘, ‘female‘) sex, e.age age, d.name
    -> from employees e, departments d
    -> where e.depart_id = d.id;
+----+-------+--------+-----+------+
| id | name  | sex    | age | name |
+----+-------+--------+-----+------+
|  1 | tom   | male   |  25 | dev  |
|  2 | jak   | female |  35 | test |
|  3 | lisea | male   |  22 | ops  |
+----+-------+--------+-----+------+
3 rows in set (0.03 sec)

* 查询并显示所有员工id, 姓名,姓别,年龄,所在部门 (方法二) [ 方法一等价于方法二 ]

inner join 可以省写成 join

mysql> select e.id id, e.name name, IF(e.sex = ‘M‘, ‘male‘, ‘female‘) sex, e.age age, d.name
    -> from employees e inner join departments d
    -> on e.depart_id = d.id;
+----+-------+--------+-----+------+
| id | name  | sex    | age | name |
+----+-------+--------+-----+------+
|  1 | tom   | male   |  25 | dev  |
|  2 | jak   | female |  35 | test |
|  3 | lisea | male   |  22 | ops  |
+----+-------+--------+-----+------+
3 rows in set (0.00 sec)

3. 外连接例子

左外连接 [ 以左表为基础,左表的全部数据,右表有的组合。右表没有的为null ]

右外连接 [ 以右表为基础,右表的全部数据,左表有的组合。左表没有的为null ]

* 查看a表和b表结构

mysql> desc a;
+-------+---------+------+-----+---------+-------+
| Field | Type    | Null | Key | Default | Extra |
+-------+---------+------+-----+---------+-------+
| data  | int(11) | YES  |     | NULL    |       |
+-------+---------+------+-----+---------+-------+
1 row in set (0.00 sec)

mysql> desc b;
+-------+---------+------+-----+---------+-------+
| Field | Type    | Null | Key | Default | Extra |
+-------+---------+------+-----+---------+-------+
| data  | int(11) | YES  |     | NULL    |       |
+-------+---------+------+-----+---------+-------+
1 row in set (0.00 sec)

* 查看a表和b表数据

mysql> select * from a;
+------+
| data |
+------+
|    1 |
|    2 |
|    4 |
+------+
3 rows in set (0.00 sec)

mysql> select * from b;
+------+
| data |
+------+
|    2 |
|    4 |
|    5 |
|    6 |
+------+
4 rows in set (0.01 sec)

 

* 左外连接查询 (left join) 以a表为基础,显示a表所有数据,b表有的组合,没有显示NULLL

        left outer join 可以写成 left join

mysql> select * from a left outer join b on a.data = b.data;
+------+------+
| data | data |
+------+------+
|    2 |    2 |
|    4 |    4 |
|    1 | NULL |
+------+------+
3 rows in set (0.00 sec)

* 右外连接查询 以b表为基础,显示b表所有数据,a表有的组合,没有显示NULLL

        right outer join 可以写成 right  join

mysql> select * from a right outer join b on a.data = b.data;
+------+------+
| data | data |
+------+------+
|    2 |    2 |
|    4 |    4 |
| NULL |    5 |
| NULL |    6 |
+------+------+
4 rows in set (0.00 sec)

* 完全(交叉)连接查询

没有 where 子句的交叉联接将产生联接所涉及的表的笛卡尔积。

第一个表的行数乘以第二个表的行数等于笛卡尔积结果集的大小。

(a和b交叉连接产生3*4=12条记录)

mysql> select * from a corss join b;
+------+------+
| data | data |
+------+------+
|    1 |    2 |
|    2 |    2 |
|    4 |    2 |
|    1 |    4 |
|    2 |    4 |
|    4 |    4 |
|    1 |    5 |
|    2 |    5 |
|    4 |    5 |
|    1 |    6 |
|    2 |    6 |
|    4 |    6 |
+------+------+
12 rows in set (0.00 sec)

4. 总结

以需求驱动技术,技术本身没有优略之分,只有业务之分。

时间: 2024-10-05 20:03:35

MySQL DML操作--------多表联合查询实战的相关文章

MySQL增删改查之【多表联合查询】

很多时候在实际的业务中我们不只是查询一张表. 在电子商务系统中,查询哪些用户没有购买过产品. 银行中可能查询违规记录,同时查询出用户的 查询中奖信息和中奖人员的基本信息. 以上只是列的情况我们就需要把两张表在一起进行查询. 而上述业务中需要多表联合在一起查询才能有结果,而多表联合查询的本质是:表连接. 表连接 当需要查询多个表中的字段时,就可以使用表连接来实现.表联接分为内连接和外连接. 内联结:将两个表中存在联结关系的字段符合联结关系的那些记录形成记录集的联结. 外连接:会选出其他不匹配的记录

mysql 数据操作 多表查询 目录

mysql 数据操作 多表查询 准备 mysql 数据操作 多表查询 多表连接查询 笛卡尔积 mysql 数据操作 多表查询 多表连接查询 内连接 mysql 数据操作 多表查询 多表连接查询 外链接之左连接 右连接 mysql 数据操作 多表查询 多表连接查询 全外连接 原文地址:https://www.cnblogs.com/mingerlcm/p/10523097.html

MySQL 子查询与多表联合查询

子查询:就是一个查询的结果作为另一个查询的数据源或者条件. 如何查询出工资最大的人的姓名? mysql> select max(sal) from emp; --查询出工资最大值 +----------+ | max(sal) | +----------+ | 5000.00 | +----------+ 1 row in set (0.00 sec) mysql> select ename,sal from emp where sal = (select max(sal) from emp)

thinkphp两表,多表联合查询及分页的连贯操作写法

ThinkPHP中关联查询(即多表联合查询)可以使用 table() 方法或和join方法,具体使用如下例所示: 1.原生查询示例: 代码如下: $Model = new Model(); $sql = 'select a.id,a.title,b.content from think_test1 as a, think_test2 as b where a.id=b.id '.$map.' order by a.id '.$sort.' limit '.$p->firstRow.','.$p-

【Oracle】曾经的Oracle学习笔记(4-7)多表联合查询,子查询,动态条件查询

一.多表联合查询 二.子查询 三.动态条件查询 LESSON 4 Displaying Data from Multiple Tables-------------------------------------------------------- 查询s_emp表中最大的工资数,并且显示出这个最大工资数的员工名字 select last_name,max(salary)from s_emp; 多表查询 查询多张表的时候会产生笛卡尔积 为了防止笛卡尔积的产生,我们需要使用某些条件把两张表或多张

对于多表联合查询的一点理解

操作数据库时多表联合查询很常见.也知道常见联合查询的集中类型,内连接.外连接.全连接.自连接,外连接又分为左连接和右连接. 这些概念我一直都知道,但对于感念的理解并不透彻.对于不同类型的联合查询的结果数据集合没有清晰的区分.前两天,工作中又遇到的这样的问题,才开始弄明白. 内连接:传统写法:select a.*,b.* from a,b where a.column=b.column; 新式写法:select a.* from a inner join b on a.column=b.colum

MyBatis 多表联合查询及优化 以及自定义返回结果集

下面就来说一下 mybatis 是通过什么来实现多表联合查询的.首先看一下表关系,如图: 这 里,我已经搭好了开发的环境,用到的是 SpringMVC + Spring + MyBatis,当然,为了简单期间,你可以不用搭前端的框架,只使用 Spring + MyBatis 就可以,外加 junit 测试即可.环境我就不带大家搭了,这里只说涉及到联合查询的操作. 设计好表之后,我用到了 mybatis 的自动生成工具 mybatis generator 生成的实体类.mapper 接口.以及 m

MyBatis之三:多表联合查询

在这篇文章里面主要讲解如何在mybatis里面使用一对一.一对多.多表联合查询(类似视图)操作的例子. 注:阅读本文前请先大概看一下之前两篇文章. 一.表结构 班级表class,学生表student,班级学生关系表ClassStudent. 这里一个学生只会在一个班级里面,也就是一对一的关系:一个班级有多个学生,也就是一对多的关系. 结构如下: CREATE TABLE [dbo].[Class]( [class_id] [int] NOT NULL, [class_name] [varchar

MongoDB与MySQL的操作对比表及区别介绍

MongoDB与MySQL的操作对比表及区别介绍 MySQL与MongoDB都是开源的常用数据库,但是MySQL是传统的关系型数据库,MongoDB则是非关系型数据库,也叫文档型数据库,是一种NoSQL的数据库.它们各有各的优点,关键是看用在什么地方.所以我们所熟知的那些SQL(全称Structured Query Language)语句就不适用于MongoDB了,因为SQL语句是关系型数据库的标准语言. 以我们公司项目为例,在早期的项目中,都在使用关系型数据库,用过SQLServer,Orac