李林超博客
首页
归档
留言
友链
动态
关于
归档
留言
友链
动态
关于
首页
其它
正文
多表查询
Leefs
2019-10-22 PM
1505℃
0条
# 多表查询 ### 一、合并结果集 1. 1.要求被合并的表中,列的类型和列数相同 2. 2.UNION,去除重复行 3. 3.UNION ALL,不去除重复行 **例如:** ```SQL SELECT * FROM cd UNION ALL SELECT * FROM ab; ``` ### 二、连接查询 1. 分类 > + 内连接 > + 外连接 > + 左外连接 > + 右外连接 > + 全外连接(MySQL不支持) > + 自然连接(属于一种简化方式) 2. 内连接 > + 方言:SELECT * FROM 表1 别名1,表2 别名2 WHERE 别名 1.xx = 别名2.xx > + 标准:SELECT * FROM 表1 别名1 INNER JOIN 表2 别名2 ON 别名1.xx = 别名2.xx > + 自然:SELECT * FROM 表1 别名1 NATURAL JOIN 表2 别名2 > + 内连接查询出的所有记录都满足条件。 **例如:** **方言内连接** ```SQL SELECT emp.ename,emp.sal,dept.dname FROM emp,dept where emp.deptno=dept.deptno; ``` **标准内连接** ```SQL SELECT e.ename,e.sal,d.dname FROM emp e INNER JOIN dept d ON e.deptno = d.deptno; ``` **自然内连接** ```SQL SELECT e.ename,e.sal,d.dname FROM emp e NATURAL JOIN dept d; ``` 3. 外连接 > + **左外:**SELECT * FROM 表1 别名1 LEFT OUTER JOIN 表2 别名2 ON 别名1.xx=别名2.xx > + 左表记录无论是否满足条件都会查询出来,而右表只有满足条件才能出来。左表中不满足条件的记录,右表部分都为NULL > + **左外自然:**SELECT * FROM 表1 别名1 NATURAL LEFT OUTER JOIN 表2 别名2 ON 别名1.xx=别名2.xx > + **右外:**SELECT * FROM 表1 别名1 RIGHT OUTER JOIN 表2 别名2 ON 别名1.xx=别名2.xx > + 右表记录无论是否满足条件都会查询出来,而左表只有满足条件才能出来。右表不满足条件的记录,其左表部分都为NULL > + **右外自然:**SELECT * FROM 表1 别名1 NATURAL RIGHT OUTER JOIN 表2 别名2 ON 别名1.xx=别名2.xx > + **全连接:**可以使用UNION来完成全链接 **例如:** **左外连接** ```SQL SELECT e.ename,e.sal,IFNULL(d.dname,'无部门') AS dname FROM emp e LEFT OUTER JOIN dept d ON e.deptno=d.deptno; ``` *外连接有一主一次,左外即左表为主!* 即==emp==为主,那么主表中所有的记录无论满足不满足条件,都打印出来。当不满足条件时,右表部门使用NULL来补位。 **右外连接** ```SQL SELECT e.ename,e.sal,d.dname FROM emp e RIGHT OUTER JOIN dept d ON e.deptno=d.deptno; ``` ### 三、子查询 **查询中有查询(查看SELECT关键字的个数!)** 1. 出现的位置 > + where 后作为条件存在 > > + from后作为表存在(多行多列) 2. 条件 > + **单行单列:**SELECT * FROM 表1 别名1 WHERE 列1 [=、>、<、>=、<=、!=] (SELECT 列 FROM 表2 别名2 WHERE 条件) > + **多行单列:**SELECT * FROM 表1 别名1 WHERE 列1 [IN, ALL, ANY] (SELECT 列 FROM 表2 别名2 WHERE 条件) > + **单行多列:**SELECT * FROM 表1 别名1 WHERE (列1,列2) IN (SELECT 列1, 列2 FROM 表2 别名2 WHERE 条件) > + **多行多列:**SELECT * FROM 表1 别名1 , (SELECT ....) 别名2 WHERE 条件 **例如:** **单行单列** ```SQL -- 查询出大于平均工资的所有员工,并打印出详细信息 SELECT * FROM emp WHERE sal >(SELECT AVG(sal) FROM emp); ``` **多行单列** ```SQL -- 查询大于30部门最高工资的所有员工 select * FROM emp where sal > ALL(SELECT sal FROM emp where deptno=30); -- 大于20部门任意一人的所有员工工资 select * FROM emp where sal > ANY(SELECT sal FROM emp where deptno=20); ``` **单行多列** ```SQL -- 查询公司、部门和工资与殷天正完全相同的员工 select * FROM emp WHERE (job,deptno,sal) in (SELECT job,deptno,sal FROM emp where ename='殷天正'); ```
标签:
MySQL
非特殊说明,本博所有文章均为博主原创。
如若转载,请注明出处:
https://lilinchao.com/archives/48.html
上一篇
接口相关练习题
下一篇
再论适配器设计模式
取消回复
评论啦~
提交评论
栏目分类
随笔
2
Java
326
大数据
229
工具
31
其它
25
GO
47
标签云
并发编程
Ubuntu
容器深入研究
机器学习
Golang
队列
ajax
FileBeat
Docker
Spark RDD
Python
JavaWEB项目搭建
正则表达式
FastDFS
字符串
JavaScript
Java
Java编程思想
线程池
锁
JVM
人工智能
Zookeeper
序列化和反序列化
微服务
查找
HDFS
Typora
Spark SQL
国产数据库改造
友情链接
申请
范明明
庄严博客
Mx
陶小桃Blog
虫洞