多表查询

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外键使用详解

    最近有开始做一个实验室管理系统,因为分了几个表进行存储·所以要维护表间的关联··研究了一下MySQL的外键. (1)只有InnoDB类型的表才可以使用外键,mysql默认是MyISAM,这种类型不支持 ...

  2. Mysql连接查询主要分为三种:内连接、外连接、交叉连接

    Mysql 连接查询主要分为三种:内连接.外连接.交叉连接 内连接 使用比较运算符(包括=.>.<.<>.>=.<=.!>和!<)进行表间的比较操作,查 ...

  3. mysql连接查询(两个表内和多个表内连接查询)

    连接是关系数据模型的主要特点,连接查询是关系数据库中最主要的查询,包括内连接.外连接等. 当两个或多个表中存在相同意义的字段时,便可以通过这些字段对不同的表进行 连接查询,得到存放在多个表中的记录数据 ...

  4. desc mysql 连表查询_Mysql连表查询

    mysql的连接 语法: select 查询列表 rom 表1 别名 连接类型 join 表2 别名 on连接条件 where 筛选条件 group by 分组 having 筛选条件 order b ...

  5. MySQL INNER JOIN:内连接查询

    内连接是通过在查询中设置连接条件的方式,来移除查询结果集中某些数据行后的交叉连接.简单来说,就是利用条件表达式来消除交叉连接的某些数据行. 在MySQL FROM 子句中使用关键字 INNER JOI ...

  6. mysql 查询多个记录查询_MySQL多表数据记录查询详解

    在实际应用中,经常需要实现在一个查询语句中显示多张表的数据,这就是所谓的多表数据记录连接查询,简称来年将诶查询. 在具体实现连接查询操作时,首先将两个或两个以上的表按照某个条件连接起来,然后再查询到所 ...

  7. Oracle单表内连接查询

    源数据如下: 根据Col3值,把Co1和Co2映射并去空查询,预期结果如下: 思路分析: 使用单表内连接+where条件判断非空即可 查询SQL: SELECT t1.col1,t2.col2 FRO ...

  8. 开启注解缓存_Spring Boot 2.x基础教程:进程内缓存的使用与Cache注解详解

    随着时间的积累,应用的使用用户不断增加,数据规模也越来越大,往往数据库查询操作会成为影响用户使用体验的瓶颈,此时使用缓存往往是解决这一问题非常好的手段之一.Spring 3开始提供了强大的基于注解的缓 ...

  9. MySQL高可用方案-PXC(Percona XtraDB Cluster)环境部署详解

    MySQL高可用方案-PXC(Percona XtraDB Cluster)环境部署详解 Percona XtraDB Cluster简称PXC.Percona Xtradb Cluster的实现是在 ...

  10. DRUID 连接池的使用、配置详解

    DRUID 连接池的使用.配置详解 本篇参考:原文链接 一.DRUID 介绍: DRUID 是阿里巴巴开源平台上一个数据库连接池实现,它结合了 C3P0.DBCP.PROXOOL等DB池的优点,同时加 ...

最新文章

  1. Yolov3Yolov4网络结构与源码分析
  2. C++知识点35——使用智能指针的注意事项(上)
  3. 用java调用oracle存储过程总结
  4. 【企业管理】摆脱三个依赖
  5. linux luks源码,下载源代码编译安装
  6. 【openSUSE】软件源和软件搜索
  7. jmap在ubuntu上DebuggerException: Can't attach to the process
  8. h5支付不能打开支付宝 ios_iOS WKWebview中无法调起支付宝/微信客户端支付问题的解决方法...
  9. 技术讲坛新模式,积分制
  10. bzoj 1079: [SCOI2008]着色方案
  11. 职场没有岁月静好,只有不进则退
  12. 后台程序全局钩子获取鼠标滚轮滚动方向(VB6.0)
  13. 冒泡排序(bubble sort)算法实现
  14. 体验式培训之“盲人与哑巴”
  15. IOS端好用的ssh工具推荐
  16. 【DB宝41】监控利器PMM的使用--监控MySQL、PG、MongoDB、ProxySQL等
  17. MATLAB--特征值和特征向量 及具体应用
  18. 【计算机网络】物理层 : 香农定理 ( 噪声 | 信噪比 | 香农定理 | “香农定理“公式 | “香农定理“ 计算示例 | “奈氏准则“ 与 “香农定理“ 对比 与 计算示例)★
  19. Nacos本地进行了远程配置而远程未配置相关信息而导致应用报内存泄漏问题的异常
  20. 手机上好用的APP推荐

热门文章

  1. arcgis按条件给字段赋值
  2. ipad 5 无法充电的原因
  3. 国产高端手机拥有了杀手锏
  4. 全套GMS地下水数值模拟
  5. django oracle数据库配置,使用Oracle 11g数据库issu配置django
  6. Java开发工具idea
  7. 并发笔记(八)JUC原子类以及线程池(Executors)
  8. 一名25岁的董事长给大学生的18条忠告
  9. mysql的通俗理解_最通俗易懂的理解什么是数据库
  10. 【diannaoxitong】简单几步可将phone照片流删除的干干净净?