博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
MySql语句常用命令整理---多表查询
阅读量:5946 次
发布时间:2019-06-19

本文共 3762 字,大约阅读时间需要 12 分钟。

首先第一张表还是我们单表查询之前用到t_employee,我们在另外新建一个表t_dept(部门表)建表命令如下:

drop table if exists t_dept;CREATE TABLE t_dept (    _id INT PRIMARY KEY,    deptno INT(11),    dname VARCHAR(20),    loc VARCHAR(50));

插入数据:

insert into t_dept(_id,deptno,dname,loc)values('1','10','ACCOUNTING','NEW YORK'),('2','20','RESEARCH','DALLAS'),('3','30','SALES','CHICAGO'),('4','40','OPERATIONS','BOSTON');

笛卡尔积

SELECT     *FROM    t_employee,    t_dept;

两张表中的每条记录都进行了重组,导致最终查询结果的条数为两张表中的记录数的乘积,这样的结果积在数学上称为笛卡尔积。

简单比喻下就是所有可能的组合都进行了组合。

内连接(INNER JOIN)

使用比较运算符(包括=、>、<、<>、>=、<=、!>和!<)进行表间的比较操作,查询与连接条件相匹配的数据。

  • 特殊:自连接:查询每个员工的姓名、职位和领导姓名
    方法1:
SELECT     t1.ename, t1.job, t2.enameFROM    t_employee t1,    t_employee t2WHERE    t1.mgr = t2.empno;

方法2:

SELECT     t1.ename, t1.job, t2.enameFROM    t_employee t1        INNER JOIN    t_employee t2 ON t1.mgr = t2.empno; -- inner可去掉
  • 查询每个员工的编号、姓名、职位、部门名称和部门所在位置
SELECT     t1.empno, t1.ename, t1.job, t2.dname, t2.locFROM    t_employee t1        INNER JOIN    t_dept t2 ON t1.deptno = t2.deptno;
  • 查询每个员工的编号、姓名、基本工资、职位、领导姓名、部门名称和部门所在位置
SELECT     t1.empno,t1.ename,t1.sal,t1.job,t2.ename as mgr_name,t3.dname,t3.locFROM    t_employee t1        INNER JOIN    t_employee t2 ON t1.mgr  = t2.empno        inner JOIN    t_dept t3 ON t1.deptno = t3.deptno;

外连接

外连接分为左连接(LEFT JOIN)或左外连接(LEFT OUTER JOIN)、右连接(RIGHT JOIN)或右外连接(RIGHT OUTER JOIN)、全连接(FULL JOIN)或全外连接(FULL OUTER JOIN)。我们就简单的叫:左连接、右连接和全连接。

左外连接(left join)

返回左表中的所有行,如果左表中行在右表中没有匹配行,则结果中右表中的列返回空值。

  • 查询每个员工的姓名、职位和领导姓名
SELECT     t1.ename, t1.job, t2.ename AS mgr_nameFROM    t_employee t1        left JOIN    t_employee t2 ON t1.mgr = t2.empno;      -- KING    PRESIDENT NULL

结果:

ename job mgr_name
SCOTT ANALYST JONES
KING PRESIDENT null

可以看到查询结果的第二行,t2表无对应匹配行,直接显示为null,t1表所有值均显示完全。

专业一点说,即 左外连接 = 内连接 + 左边表内连接之后剩余的其他记录,右边补NULL。

右外连接(right join)

恰与左连接相反,返回右表中的所有行,如果右表中行在左表中没有匹配行,则结果中左表中的列返回空值。

  • 右外连接:查询每个员工的编号、姓名、职位和部门名称和部门位置
SELECT     t1.empno, t1.ename, t1.job, t2.dname, t2.locFROM    t_employee t1        RIGHT JOIN    t_dept t2 ON t1.deptno = t2.deptno;

结果:

empno ename job dname loc
7900 JAMES CLERK SALES CHICAGO
null null null OPERATIONS BOSTON

全连接(full join)

返回左表和右表中的所有行。当某行在另一表中没有匹配行,则另一表中的列返回空值

这里为了测试效果,插入一个不在在部门表搜索不到的员工记录。如下:

insert into t_employee values('7935','TEST','CLERK','7782','2011-03-12','1300',NULL,'50');
  • 查询每个员工的编号、姓名、职位和部门名称和部门位置
SELECT     t1.empno, t1.ename, t1.job, t2.dname, t2.locFROM    t_employee t1        full JOIN    t_dept t2 ON t1.deptno = t2.deptno; -- 报错,mysql不支持全外链接

......运行了一下发现MySQL并不支持全连接,但是可以通过以下途径实现全连接的查询结果。

合并查询数据使用UNION或UNION ALL,思考一下全连接 = 左连接 UNION 右连接,赶快来试试

SELECT     t1.empno, t1.ename, t1.job, t2.dname, t2.locFROM    t_employee t1        LEFT JOIN    t_dept t2 ON t1.deptno = t2.deptno UNION SELECT     t1.empno, t1.ename, t1.job, t2.dname, t2.locFROM    t_employee t1        RIGHT JOIN    t_dept t2 ON t1.deptno = t2.deptno;

结果:

empno ename job dname loc
7935 TEST CLERK NULL NULL
NULL NULL NULL OPERATIONS BOSTON

看下查询结果,即是全连接的效果了。满足了,我们再来看看UNION和UNION ALL的区别:

UNION执行了去重的操作,而UNION ALL并没有去重。


子查询

子查询说通俗一点,即是嵌套查询

  • 查询工资比SLLEN还要高的全部员工的信息
select *from t_employee twhere t.sal > (           select sal           from t_employee           where ename = 'ALLEN');

是不是已经明白了,即是在上一次查询结果的基础上再做一次查询。再练习一下。

  • 查询工资和职位都与WARD一样,并且不是WARD本人的员工的信息
SELECT     *FROM    t_employeeWHERE    (sal , job) = (SELECT             sal, job        FROM            t_employee        WHERE            ename = 'WARD')        AND ename != 'WARD';
  • 查询员工表中的员工信息,要求员工的编号都在部门表中有记录
SELECT     *FROM    t_employeeWHERE    deptno IN (SELECT             deptno        FROM            t_dept);
  • 查询员工表中的员工信息,要求员工的编号不在部门表中有记录
SELECT     *FROM    t_employeeWHERE    deptno NOT IN (SELECT             deptno        FROM            t_dept);

 

转载于:https://www.cnblogs.com/chrisghb8812/p/9280694.html

你可能感兴趣的文章
gopacket 使用
查看>>
AlertDialog对话框
查看>>
我的友情链接
查看>>
linux安全---cacti+ntop监控
查看>>
鸟哥的linux私房菜-shell简单学习-1
查看>>
nagios配置监控的一些思路和工作流程
查看>>
通讯组基本管理任务三
查看>>
赫夫曼编码实现
查看>>
html页面显示div源代码
查看>>
Centos下基于Hadoop安装Spark(分布式)
查看>>
3D地图的定时高亮和点击事件(基于echarts)
查看>>
接口由40秒到200ms优化记录
查看>>
java 视频播放 多人及时弹幕技术 代码生成器 websocket springmvc mybatis SSM
查看>>
Activiti6.0,spring5,SSM,工作流引擎,OA
查看>>
使用Tooltip会出现一个问题,如果行上出现复选框
查看>>
禁止浏览器缓存js
查看>>
【Redis】安装PHP的redis驱动(二)
查看>>
什么是序列化,为什么要序列化
查看>>
Java保留小数点后有效数字
查看>>
C++中一些类和数据结构的大小的总结
查看>>