多表查询

1. 表与表之间的关系

<1> 一对一用户表和身份信息表,用户表是主表

男人表、女人表

create table man(mid int primary key auto_increment,

mname varchar(32),

wid int unique

);

create table woman(wid int primary key auto_increment,

wname varchar(32)

);

<2> 一对多最常见得表关系,用户表和订单表

员工表、部门表

create table emp(empno int primary key auto_increment,

ename varchar(32)

deptno int

);

create teble dept(deptno int primary key auto_increment,

dname varchar(32)

);

<3> 多对多学生表和课程表,通常情况都是将多对多的关系拆分为一对多或者多对一的关系

至少需要三张表

create table student(cid int primary key auto_increment,

sname varchar(32)

);

insert into student (sname) values('小张');

insert into student (sname) values('小李');

insert into student (sname) values('小王');

create table course(sid int primary key auto_increment,

cname varchar(32)

);

insert into course (cname) values('语文');

insert into student (sname) values('数学');

insert into student (sname) values('英语');

insert into student (sname) values('化学');

create table s_c(cid int,

sid int

);

insert into s_c(sid, cid) values (1, 1);

insert into s_c(sid, cid) values (1, 2);

insert into s_c(sid, cid) values (1, 3);

insert into s_c(sid, cid) values (1, 4);

insert into s_c(sid, cid) values (2, 2);

insert into s_c(sid, cid) values (2, 4);

insert into s_c(sid, cid) values (3, 1);

insert into s_c(sid, cid) values (3, 3);

2. 为什么要使用多张表避免出现大量的数据的冗余

并不是表拆的越多越好,需要根据实际情况进行拆分

3. 概念同时查询多张表

4. 多表查询的分类

<1> 合并查询union, union all

合并结果集,就是把两个select语句的查询结果合并到一起。(相当于并集)

合并的两个结果,列数和列的顺序,类型需要一致

create table emp(empno int primary key auto_increment,

ename varchar(32)

);

create table dept(depeno int primary key auto_increment,

dname varchar(32)

);

select from emp union select from dept;

select from emp union all select from dept;

<2> 连接查询-- 员工表

create table emp(

empno int primary key auto_increment, # 员工编号

ename varchar(32), # 员工姓名

job varchar(32), # 员工职位

mgr int, # 上级编号

hiredate date, # 入职时间

sal double, # 薪资

comm double, # 奖金

deptno int # 员工所属部门

);

-- 部门表

create table dept(

deptno int primary key auto_increment, # 部门编号

dname varchar(32), # 部门名称

loc varchar(32) # 部门地址

);内连接inner join .... on 、 join , ,

inner join 是一个比较运算符,只返回符合条件的行

例如:select * from emp inner join dept on emp.deptno=dept.deptno;

select * from emp e, dept d where e.deptno = d.deptno;

select * from emp e join dept d where e.deptno = d.deptno;

外连接左外连接 LEFT OUTER JOIN | left join .... on代表查询,左边行的全部,右边没有则null

select * from emp e LEFT OUTER JOIN dept d on e.deptno = d.deptno;

右外连接 right join | right outer join .... on有连接包含right join 右表所有的行,如果左表中某行在右表没有匹配,则结果中对应的左表的部分全部为空(null)

select * from emp e RIGHT OUTER JOIN dept d on e.deptno = d.deptno;

自连接自连接就是说,在同一个数据表中,看作是两个表,表示查找每个人的领导,如果没有领导,则显示无领导

把一张表看作成两张表,一张员工表,一张领导表,都是emp表

select e.ename, el.ename from emp e left join emp el on e.mgr = el.empno;

自然连接: natural join (join) | natural left join (同 left join) | natural right join (同 right join)自然连接会自动判断,以两个表中相同的字段为连接条件,返回查询结果。

注意: 内连接不写连接条件会出现笛卡尔积的结果,应该避免这种情况,而外连接不写连接条件会报错

select * from emp natural join dept;

select * from emp NATURAL left join dept;

select * from emp NATURAL right join dept;

<3> 子查询 (ANY子查询、IN子查询、SOME子查询、ALL子查询)子查询解决的问题:谁的薪资比张三高select sal from emp where ename='张三'

定义子查询允许把一个查询嵌套在另一个查询当中

子查询又叫做内部查询,相当于内部查询,包含内部查询的就成为外部查询,子查询的结果被主查询所使用。

注意的问题:括号

可以在主查询的where select having from 后面,都可以使用子查询

不可以在group by 后面使用子查询

主查询和子查询可以不是同一张表;只有子查询返回的值,主查询可以使用

需求:查询部门名称是人力部的员工信息

-- 第一种方式:利用子查询

select * from emp where deptno=(select deptno from dept where dname='人力部')

-- 第二种方式:利用关联查询

select * from emp e, dept d where e.deptno = d.deptno and d.dname = '人力部';

SQL优化: 尽量使用多表查询绝大部分的子查询在最终执行的时候都是转换成一个多表查询来执行的。 通过SQL的执行计划可以看出来

通过SQL执行计划会发现两种方式执行的一样的。

from 后面的子查询

需求:查询员工号 姓名 薪资

select empno, ename, sal from emp;

一般不在子查询中进行排序

一般先执行子查询,再去执行主查询

ANY 关键字假设any内部的查询返回结果个数是三个,如: result1, result2, result3, 那么

select .... from .... where a > any(....)

->

select .... from .... where a > result1 or a > result2 or a > result3

需求:

查询工资比1号部门中任意一个员工高的员工信息

select * from emp where sal > any(select sal from emp where deptno = 1);

ALL 关键字ALL 关键字与 ANY 关键字类似,只不过把上面的or 改成 and

select .... from .... where a > all(....)

->

select .... from .... where a > result1 and a > result2 and a > result3

需求:查询工资比1号部门中所有员工高的员工信息

select * from emp where sal > any(select sal from emp where deptno = 1);

select * from emp where sal > all(select sal from emp where deptno = 1);

SOME 关键字some 关键字和 any 关键字是一样的功能,所以:

select .... from .... where a > any(....)

->

select .... from .... where a > result1 or a > result2 or a > result3

IN 关键字In 运算符用于where 表达式中,以列表项的形式支持多个选择,语法如下:

where column in (v1, v2, v3 ....);

where column not in (v1, v2, v3 ....);

当in 前面加上not 运算符时,表示与in 相反的意思,即不在这些列表项中选择。

案例:

查询部门名称是人力部和研发部的员工

select * from emp where deptno in (select deptno from dept where dname = '人力部' or dname = '研发部');

mysql 联表详解_MySQL多表查询详解相关推荐

  1. mysql多表查询详解_MySQL多表查询详解上

    时光在不经意间,总是过得出奇的快.小暑已过,进入中暑,太阳更加热烈的绽放着ta的光芒,...在外面被太阳照顾的人们啊,你们都是勤劳与可爱的人啊.在房子里已各种姿势看我这篇这章的你,既然点了进来,那就由 ...

  2. mysql表空间权限_MySQL InnoDB表空间加密示例详解

    前言 从 MySQL5.7.11开始,MySQL对InnoDB支持存储在单独表空间中的表的数据加密 .此功能为物理表空间数据文件提供静态加密.该加密是在引擎内部数据页级别的加密手段,在数据页写入文件系 ...

  3. mysql修改表结构例子_mysql修改表结构方法实例详解

    本文实例讲述了mysql修改表结构方法.分享给大家供大家参考.具体如下: mysql修改表结构使用ALTER TABLE语句,下面就为您详细介绍mysql修改表结构的语句写法,希望对您学习mysql修 ...

  4. MySQL的表分区详解_MySQL的表分区详解

    一.什么是表分区 通俗地讲表分区是将一大表,根据条件分割成若干个小表.mysql5.1开始支持数据表分区了. 如:某用户表的记录超过了600万条,那么就可以根据入库日期将表分区,也可以根据所在地将表分 ...

  5. mysql的explain怎么看_mysql中explain用法详解

    如果在select语句前放上关键词explain,mysql将解释它如何处理select,提供有关表如何联接和联接的次序. explain的每个输出行提供一个表的相关信息,并且每个行包括下面的列: 1 ...

  6. mysql数据库字段类型大全_mysql数据库字段类型详解

    MySQL支持大量的列类型,它可以被分为3类:数字类型.日期和时间类型以及字符串(字符)类型.本节首先给出可用类型的一个概述,并且总结每个列类型的存储需求,然后提供每个类中的类型性质的更详细的描述. ...

  7. mysql和oracle执行计划_mysql explain执行计划详解

    原文链接:https://www.cnblogs.com/xiaoboluo768/p/5400990.html mysql> explain  select t1.kprq from    p ...

  8. mysql 执行计划详解_mysql explain执行计划详解

    备注:转载 1).id列数字越大越先执行,如果说数字一样大,那么就从上往下依次执行,id列为null的就表是这是一个结果集,不需要使用它来进行查询. 2).select_type列常见的有: A:si ...

  9. mysql多表连接 索引_MySQL多表查询之外键、表连接、子查询、索引

    一.外键: 1.什么是外键 2.外键语法 3.外键的条件 4.添加外键 5.删除外键 1.什么是外键: 主键:是唯一标识一条记录,不能有重复的,不允许为空,用来保证数据完整性 外键:是另一表的主键, ...

最新文章

  1. 学习MongoDB(Troubleshoot Replica Sets) 集群排除故障
  2. hdu 5615 Jam's math problem(判断是否能合并多项式)
  3. python开源项目博客_Blog_mini首页、文档和下载 - Python Flask开源博客 - OSCHINA - 中文开源技术交流社区...
  4. Julia程序设计3 数组2 排序、复制、集合运算、字典
  5. Delphi指针用法
  6. 锁究竟锁住的是什么?
  7. 【硬核干货】2500字全方面解读Python的格式化输出
  8. UVA10843——Anne\'s game
  9. Angular4.x+Ionic3 踩坑之路之打包时出现JAVASCRIPT HEAP OUT OF MEMORY的几种解决办法
  10. 如何在终端窗口中在Linux中创建文件?
  11. windows server 2008 各版本下载
  12. Eplan教学视频合集-百度网盘-收集于网络
  13. openssl_verify(): supplied key param cannot be coerced into a public key错误解决的一种办法
  14. cpu开启超线程linux,Linux开发人员声称除非禁用超线程否则可以利用英特尔CPU
  15. 解决visio对象在word中显示不全的问题
  16. 关闭联想台式机键盘的 Fn 功能
  17. python教科书能在ios系统操作吗_[初学python]苹果何时开放IOS降级通道啊?
  18. GD兆易GD32系列MCU替换ST芯片对照表
  19. QQ音乐sign,jsvmp算法推导
  20. Jenkin前端项目部署----远程服务

热门文章

  1. C语言:比较字符串,找出最大值
  2. VERY DEEP CONVOLUTIONAL NETWORKS FOR LARGE-SCALE IMAGE RECOGNITION(VGG网络)-论文阅读笔记
  3. 数据分析36计(25):微软开源 DoWhy 之因果分析快速入门
  4. JS 随机数和不重复的随机数
  5. 乌海计算机打印准考证,2016年下半年乌海计算机一级准考证打印入口及网址,计算机等级考试时间查询...
  6. 适合企业需求的才是好OA
  7. RSA基本原理及常见攻击方法
  8. antd table 排序如何使用_antd table按表格里的日期去排序操作
  9. Python面向对象学习之八,装饰器
  10. QQ2007正式版协议分析