MySQL 后from多个表_MYSQL回顾(多表查询相关)

前言

简单的数据我们可以直接从一个表中获取,但在真实的项目中查询符合条件的数据通常需要牵扯到多张表,这就不得不使用多表查询。多表查询分为多表连接查询、符合条件链接查询、子查询。多表连接查询包括内连接、外连接、全连接。符合条件连接查询本质上是多表连接查询+过滤条件。子查询是将一个查询语句嵌套在另一个查询语句中,内层查询语句的查询结果作为外层查询语句的数据源。

准备

# 建表

create table department(

id int,

name varchar(20)

);

create table employee(

id int primary key auto_increment,

name varchar(20),

sex enum('male','female') not null default 'male',

age int,

dep_id int

);

# 插入数据

insert into department values

(1,'技术'),

(2,'财务'),

(3,'法律’);

# 此处省略员工表数据...

多表连接查询

语法

SELECT 字段列表

FROM 表1 INNER|LEFT|RIGHT JOIN 表2

ON 表1.字段 = 表2.字段;

交叉连接

在介绍多表查询的时候,有必要先介绍下交叉连接,如下select * from employee, department;查询语句就是交叉连接查询,可以看出,同一个数据在在employee表和department表交叉连接之后产生了重复记录,其重复个数取决于department表的记录个数。所以最后交叉连接之后的记录个数是:count(employee) * count(department),即笛卡尔积。通常情况下,笛卡尔积的结果在工作中无实际意义,我们需要在笛卡尔积的基础上进行筛选,找到employee.dep_id = department.id的那条记录。

mysql> select * from employee, department;

+----+-------+------+--------+----------+-----------+--------+------+--------+

| id | name | age | sex | position | salary | dep_id | id | name |

+----+-------+------+--------+----------+-----------+--------+------+--------+

| 1 | jack | 20 | male | lawyer | 888889 | 3 | 1 | 技术 |

| 1 | jack | 20 | male | lawyer | 888889 | 3 | 2 | 财务 |

| 1 | jack | 20 | male | lawyer | 888889 | 3 | 3 | 法律 |

| 2 | mark | 22 | male | lawyer | 888889 | 3 | 1 | 技术 |

| 2 | mark | 22 | male | lawyer | 888889 | 3 | 2 | 财务 |

| 2 | mark | 22 | male | lawyer | 888889 | 3 | 3 | 法律 |

| 3 | hank | 25 | male | lawyer | 7777.8 | 3 | 1 | 技术 |

| 3 | hank | 25 | male | lawyer | 7777.8 | 3 | 2 | 财务 |

| 3 | hank | 25 | male | lawyer | 7777.8 | 3 | 3 | 法律 |

| 4 | nick | 39 | male | lawyer | 4438890 | 3 | 1 | 技术 |

| 4 | nick | 39 | male | lawyer | 4438890 | 3 | 2 | 财务 |

| 4 | nick | 39 | male | lawyer | 4438890 | 3 | 3 | 法律 |

| 5 | jenny | 26 | female | lawyer | 10000.8 | 3 | 1 | 技术 |

| 5 | jenny | 26 | female | lawyer | 10000.8 | 3 | 2 | 财务 |

| 5 | jenny | 26 | female | lawyer | 10000.8 | 3 | 3 | 法律 |

| 6 | tony | 35 | male | RD | 100000000 | 1 | 1 | 技术 |

| 6 | tony | 35 | male | RD | 100000000 | 1 | 2 | 财务 |

| 6 | tony | 35 | male | RD | 100000000 | 1 | 3 | 法律 |

| 7 | emmy | 27 | female | RD | 9999 | 1 | 1 | 技术 |

| 7 | emmy | 27 | female | RD | 9999 | 1 | 2 | 财务 |

| 7 | emmy | 27 | female | RD | 9999 | 1 | 3 | 法律 |

| 8 | emmy | 23 | female | finance | 5000 | 2 | 1 | 技术 |

| 8 | emmy | 23 | female | finance | 5000 | 2 | 2 | 财务 |

| 8 | emmy | 23 | female | finance | 5000 | 2 | 3 | 法律 |

| 9 | lucy | 45 | female | finance | 10000 | 2 | 1 | 技术 |

| 9 | lucy | 45 | female | finance | 10000 | 2 | 2 | 财务 |

| 9 | lucy | 45 | female | finance | 10000 | 2 | 3 | 法律 |

| 10 | emmi | 20 | female | finance | 20000 | 2 | 1 | 技术 |

| 10 | emmi | 20 | female | finance | 20000 | 2 | 2 | 财务 |

| 10 | emmi | 20 | female | finance | 20000 | 2 | 3 | 法律 |

| 11 | james | 18 | male | NULL | 3000 | NULL | 1 | 技术 |

| 11 | james | 18 | male | NULL | 3000 | NULL | 2 | 财务 |

| 11 | james | 18 | male | NULL | 3000 | NULL | 3 | 法律 |

+----+-------+------+--------+----------+-----------+--------+------+--------+

33 rows in set (0.00 sec)

内连接

内连接只会连接两张表匹配的行,即取交集。找两张表公共部分,相当于利用条件从笛卡尔积结果中筛选出了正确的结果

mysql> select employee.id,employee.name,employee.age,employee.sex,department.name from employee inner join department on employee.dep_id=department.id;

+----+-------+------+--------+--------+

| id | name | age | sex | name |

+----+-------+------+--------+--------+

| 1 | jack | 20 | male | 法律 |

| 2 | mark | 22 | male | 法律 |

| 3 | hank | 25 | male | 法律 |

| 4 | nick | 39 | male | 法律 |

| 5 | jenny | 26 | female | 法律 |

| 6 | tony | 35 | male | 技术 |

| 7 | emmy | 27 | female | 技术 |

| 8 | emmy | 23 | female | 财务 |

| 9 | lucy | 45 | female | 财务 |

| 10 | emmi | 20 | female | 财务 |

+----+-------+------+--------+--------+

10 rows in set (0.00 sec)

上述内连接查询语句等同于:

mysql> select employee.id,employee.name,employee.age,employee.sex,department.name

from employee,department

where employee.dep_id=department.id;

外连接

外连接分为左连接、右连接、全外连接

左连接

左连接在内连接的基础上优先显示左表全部记录。即左连接=内连接+左表未符合条件的记录

#以左表为准,即找出所有员工信息,当然包括没有部门的员工

#本质就是:在内连接的基础上增加左边有右边没有的结果

mysql> select employee.id,employee.name,department.name as depart_name from employee left join department on employee.dep_id=department.id;

+----+-------+-------------+

| id | name | depart_name |

+----+-------+-------------+

| 6 | tony | 技术 |

| 7 | emmy | 技术 |

| 8 | emmy | 财务 |

| 9 | lucy | 财务 |

| 10 | emmi | 财务 |

| 1 | jack | 法律 |

| 2 | mark | 法律 |

| 3 | hank | 法律 |

| 4 | nick | 法律 |

| 5 | jenny | 法律 |

| 11 | james | NULL |

+----+-------+-------------+

11 rows in set (0.00 sec)

右连接

又连接在内连接的基础上优先显示右表的内容。即右连接==内连接+右表未符合条件的记录

#以右表为准,即找出所有部门信息,包括没有员工的部门

#本质就是:在内连接的基础上增加右边有左边没有的结果

mysql> select employee.id,employee.name,department.name as depart_name from employee right join department on employee.dep_id=department.id;

+------+-------+-------------+

| id | name | depart_name |

+------+-------+-------------+

| 1 | jack | 法律 |

| 2 | mark | 法律 |

| 3 | hank | 法律 |

| 4 | nick | 法律 |

| 5 | jenny | 法律 |

| 6 | tony | 技术 |

| 7 | emmy | 技术 |

| 8 | emmy | 财务 |

| 9 | lucy | 财务 |

| 10 | emmi | 财务 |

+------+-------+-------------+

10 rows in set (0.00 sec)

可以发现,左表(employee表)的第11条记录没有被查询出来

全外连接

全外连接会在内连接查询的基础上显示左表和右表的全部记录

mysql> select * from employee left join department on employee.dep_id = department.id

-> union

-> select * from employee right join department on employee.dep_id = department.id

-> ;

+------+-------+------+--------+----------+-----------+--------+------+--------+

| id | name | age | sex | position | salary | dep_id | id | name |

+------+-------+------+--------+----------+-----------+--------+------+--------+

| 6 | tony | 35 | male | RD | 100000000 | 1 | 1 | 技术 |

| 7 | emmy | 27 | female | RD | 9999 | 1 | 1 | 技术 |

| 8 | emmy | 23 | female | finance | 5000 | 2 | 2 | 财务 |

| 9 | lucy | 45 | female | finance | 10000 | 2 | 2 | 财务 |

| 10 | emmi | 20 | female | finance | 20000 | 2 | 2 | 财务 |

| 1 | jack | 20 | male | lawyer | 888889 | 3 | 3 | 法律 |

| 2 | mark | 22 | male | lawyer | 888889 | 3 | 3 | 法律 |

| 3 | hank | 25 | male | lawyer | 7777.8 | 3 | 3 | 法律 |

| 4 | nick | 39 | male | lawyer | 4438890 | 3 | 3 | 法律 |

| 5 | jenny | 26 | female | lawyer | 10000.8 | 3 | 3 | 法律 |

| 11 | james | 18 | male | NULL | 3000 | NULL | NULL | NULL |

| NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | 人力 |

+------+-------+------+--------+----------+-----------+--------+------+--------+

12 rows in set (0.00 sec)

符合条件链接查询

mysql> select employee.name, employee.age, department.name from employee inner join department

-> on employee.dep_id=department.id

-> where age > 30

-> order by age asc;

+------+------+--------+

| name | age | name |

+------+------+--------+

| tony | 35 | 技术 |

| nick | 39 | 法律 |

| lucy | 45 | 财务 |

+------+------+--------+

3 rows in set (0.00 sec)

子查询

子查询是将一个查询语句的嵌套在另一个查询语句中

内层查询语句的查询结果作为外层查询语句的数据源

子查询中可以包含 IN、NOT IN、ANY、ALL、EXISTS和NOT EXISTS等关键字

注意被嵌套的查询语句需要用( )包裹

查询员工部门平均年龄大于30的部门信息

mysql> select * from department

-> where id in

-> (select dep_id from employee group by dep_id having avg(age) > 30);

+------+--------+

| id | name |

+------+--------+

| 1 | 技术 |

+------+--------+

1 row in set (0.00 sec)

查询技术部员工姓名

mysql> select name from employee

-> where dep_id in

-> (select id from department where name="技术");

+------+

| name |

+------+

| tony |

| emmy |

+------+

2 rows in set (0.00 sec)

查询无员工的部门名(子查询得到的是所有人的部门id,需要disctinct去除)

mysql> select name from department

-> where id not in

-> (select distinct dep_id from employee);

带比较运算符的子查询

查询大于所有人平均年龄的员工名和年龄

mysql> select * from employee where age > (select avg(age) from employee);

+----+------+------+--------+----------+-----------+--------+

| id | name | age | sex | position | salary | dep_id |

+----+------+------+--------+----------+-----------+--------+

| 4 | nick | 39 | male | lawyer | 4438890 | 3 |

| 6 | tony | 35 | male | RD | 100000000 | 1 |

| 9 | lucy | 45 | female | finance | 10000 | 2 |

+----+------+------+--------+----------+-----------+--------+

3 rows in set (0.00 sec)

不能这样:在前面没有group by的时后面不能使用分组函数

mysql> select * from employee where age > avg(age);

ERROR 1111 (HY000): Invalid use of group function

带EXISTS关键字的子查询

EXISTS关字键字表示存在。在使用EXISTS关键字时,内层查询语句不返回查询的记录。

而是返回一个真假值。True或False

当返回True时,外层查询语句将进行查询;当返回值为False时,外层查询语句不进行查询

mysql> select * from employee

-> where exists

-> (select id from department where id=200);

MYSQL中可以把一个查询语句用括号括起来使用as起一个别名当做一个表使用

查询每个职位最新入职的员工

SELECT

*

FROM

emp AS t1

INNER JOIN (

SELECT

post,

max(hire_date) max_date

FROM

emp

GROUP BY

post

) AS t2 ON t1.post = t2.post

WHERE

t1.hire_date = t2.max_date;

查询语句关键字执行顺序

一个完整的mysql的查询语句如下:

SELECT DISTINCT

FROM

JOIN

ON

WHERE

GROUP BY

HAVING

ORDER BY

LIMIT

其关键字执行顺序如下:

(7) SELECT

(8) DISTINCT

(1) FROM

(3) JOIN

(2) ON

(4) WHERE

(5) GROUP BY

(6) HAVING

(9) ORDER BY

(10) LIMIT

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/373308.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

玩! 框架+ Google Guice

在我目前正在工作的项目中,我们开始使用Google Guice。 对于那些不知道的人, Google Guice是一个依赖项注入框架。 依赖项注入背后的基本思想是提供一个它依赖的类,而不是使依赖类负责实例化它所依赖的对象。 Play具有用于整合Guice的模块&am…

java都要caps标点_第 1 章 管理 Java CAPS 用户

第 1 章 管理 Java CAPS 用户在此处列出的主题提供了有关如何管理 Sun JavaTM Composite Application Platform Suite (Java CAPS) 中的用户的信息。如果您有任何问题,请参见 http://goldstar.stc.com/ 中的 Java CAPS Web 站点。管理系统信息库用户此类别包含以下用…

基于OpenCV 的美颜相机推送直播流

程序流程: 1.图像采集 先从opencv(2.4.10版本)采集回来摄像头的图像,是一帧一帧的 每一帧图像是一个矩阵,opencv中的mat 数据结构。 2.人脸的美化 人脸美化,我们用的皮肤检测,皮肤在颜色空间是特…

Linux驱动开发常用头文件

头文件目录中总共有32个.h头文件。其中主目录下有13个&#xff0c;asm子目录中有4个&#xff0c;linux子目录中有10个&#xff0c;sys子目录中有5个。这些头文件各自的功能如下&#xff1a; 1、主目录 <a.out.h>&#xff1a;a.out头文件&#xff0c;定义了a.out执行文件格…

Spring线程池服务

线程池对于执行同步和异步过程非常重要。 本文介绍如何使用Spring开发和监视线程池服务。 创建线程池已通过两种替代方法进行了说明。 二手技术 &#xff1a; JDK 1.6.0_21 Spring3.0.5 Maven的3.0.2 步骤1&#xff1a;建立已完成的专案 创建一个Maven项目&#xff0c;如下…

我的世界java村民繁殖_我的世界:Java19w08a更新,村民加强守卫,小狐狸背叛

虽然这句话很绕口&#xff0c;其实意思很简单&#xff0c;那就是之前的隐身药水没有什么用&#xff0c;该被打还是被打。因为这个可是害惨了流浪商人&#xff0c;不过这次好了&#xff0c;流浪商人在喝了隐身药水之后就能安全度过晚上了。NO.3 皮革马铠马铠是属于马的盔甲&…

欧莱雅眉笔banner个人设计

眉笔名称&#xff1a;眉笔大师三头塑形眉笔 &#xff0c;之所以没用吧这个商品名称放大&#xff0c;是我觉得它是一个名称&#xff0c;而我把自己想的广告词“出彩只需一笔” 放大不仅能凸显出这只笔的强大&#xff0c;还表示了一种有了我这支眉笔你会更出彩更漂亮&#xff0c…

使用带有注释和JQuery的Spring MVC 3的Ajax

与Ajax一起工作对我来说一直很有趣&#xff01; 是不是 &#xff1f; 我将使您轻松将Ajax与Spring MVC 3和JQuery结合使用。 这篇文章将向您说明如何在工业编码的现实生活中使用Ajax。 和往常一样&#xff0c;我们将在Spring MVC 3框架中以Ajax的实际示例为例&#xff0c;并将其…

ThinkPHP 3 的输出

一、ThinkPHP 3 的输出 &#xff08;重点&#xff09;a、通过 echo 等PHP原生的输出方式在页面中输出b、通过display方法输出想分配变量可以使用assign方法c、修改左右定界符休要修改配置文件中的配置项TMPL_L_DELIM><{, //修改左定界符TMPL_R_DELIM>}>, //修…

java百度云文件上传_关于如何在自己项目集成百度云BCE文件上传STS方案

1、 项目背景由于本人项目需要&#xff0c;需要在视频点播服务之中需要加载字幕文件(通用格式srt)&#xff0c;经过比较好几家的公有云服务&#xff0c;最后选择只有百度云提供字幕服务。字幕&#xff1a;我们通常在观看外语电影的是&#xff0c;没有国语版时候只能通过下载字幕…

Java 7 – NIO文件革命

Java 7&#xff08;“项目代币”&#xff09;已于去年7月问世。 此版本中的新增功能很有用&#xff0c;例如&#xff0c;尝试使用资源–从try块自动处理可关闭的资源&#xff0c;switch语句中的字符串&#xff0c;用于异常的multicatch以及用于使用泛型的<>运算符。 每个…

hdu 3507 Print Article(斜率优化DP)

题目链接&#xff1a;hdu 3507 Print Article 题意&#xff1a; 每个字有一个值&#xff0c;现在让你分成k段打印&#xff0c;每段打印需要消耗的值用那个公式计算&#xff0c;现在让你求最小值 题解&#xff1a; 设dp[i]表示前i个字符需要消耗的最小值&#xff0c;那么有dp[i]…

第三章 consul服务注册与服务查询

1、定义一个服务 https://www.consul.io/docs/agent/services.html 该方法是服务注册中提供服务的最常用的方法。 关于服务的定义&#xff1a;服务的属性我们会在后边每出现一个总结一个&#xff0c;最后再做总结。 2、服务注册 2.1、创建服务文件所存放的文件夹 说明&#xff…

coreos 安装mysql_CoreOS 在 PC 上快速安装方法指南

意义能够以最快的速度安装部署Linux操作系统。安装快速简单&#xff0c;几乎不花时间就可以开始运行Docker。运行速度非常快。使用内存硬盘。我的情况win8 笔记本偶尔玩游戏&#xff0c;但是装Linux双系统可能需要我一天的时间来完成。我的所有业务都只需要在Docker中跑就可以了…

使用ycsb测试cassandra

参考 https://github.com/cloudius-systems/osv/wiki/Benchmarking-Cassandra-and-other-NoSQL-databases-with-YCSB https://github.com/brianfrankcooper/YCSB/tree/master/cassandra 创建 表头 https://gist.github.com/pbailis/3978273  设置field参数 长度和个数 启动和…

Session 的配置和特性

session的配置 对于session的配置是php.ini中配置 session数据都是保存在文本文件中 设置session文件的保存位置 说明&#xff1a; 默认是保存在windows/temp目录 设置session保存作为客户端标识的数据使用cookie 设置session保存客户端标识的数据&#xff0c;只使用cookie 说明…

OAuth与Spring Security

摘自Wikipedia&#xff1a; OAuth &#xff08; 开放式身份验证 &#xff09;是一种开放式身份验证标准。 它允许用户与其他站点共享存储在一个站点上的私有资源&#xff08;例如照片&#xff0c;视频&#xff0c;联系人列表&#xff09;&#xff0c;而不必发出其凭据&#xff…

flex java 开发环境搭建_Flex+JAVA+BlazeDS开发环境配置(Java工程和Flex工程独立)

FlexJAVABlazeDS开发环境配置(Java工程和Flex工程独立)2019年12月07日阅读数&#xff1a;7这篇文章主要向大家介绍FlexJAVABlazeDS开发环境配置(Java工程和Flex工程独立),主要内容包括基础应用、实用技巧、原理机制等方面&#xff0c;希望对大家有所帮助。[url]http://blog.csd…

1251 括号(递归小练)

1251 括号 时间限制: 1 s空间限制: 128000 KB题目等级 : 黄金 Gold题目描述 Description计算乘法时&#xff0c;我们可以添加括号&#xff0c;来改变相乘的顺序&#xff0c;比如计算              X1, X2, X3, X4, …, XN的积&#xff0c;可以 (X1(X2(X3(X4(...(XN-1…

zabbix_agentd.conf配置文件详解

Aliaskey的别名&#xff0c;例如 Aliasttlsa.userid:vfs.file.regexp[/etc/passwd,^ttlsa:.:([0-9]),,,,\1]&#xff0c; 或者ttlsa的用户ID。你可以使用key&#xff1a;vfs.file.regexp[/etc/passwd,^ttlsa:.: ([0-9]),,,,\1]&#xff0c;也可以使用ttlsa.userid。备注: 别名不…