SQL基础操作_2_操作多个表
目录
操作多个表
7.3.1 记录集的叠加
7.3.2 组合相关的行
7.3.3 查询两个表共同的行
7.3.4 从一个表中查询另外一个表里没有的值
7.3.5 在一个表中查询与其它表不匹配的记录
7.3.6 笛卡尔积生成数据
7.3.7 基于截取子串的连接
7.3.8 不等值连接
操作多个表
注:数据集和表结构见 SQL基础操作_1_检索数据
7.3.1 记录集的叠加
需求:
查询雇员表里部门编号是10的员工名和部门编号以及部门表里的部门名称和部门编号。
解决方法:
这里需要用到unionall关键词,因为是两个结果集的叠加。首先查询出emp表的empno,deptno再union all dept表里的deptname,deptno。
Mysql、Sql server、Oracle:
SELECT ename as ename_dname,deptno
FROM emp
WHERE deptno=10
UNION
SELECT dname as ename_dname,deptno
FROM dept
执行结果:
ename_dname |
deptno |
ACCOUNTING |
10 |
CLARK |
10 |
KING |
10 |
MILLER |
10 |
OPERATIONS |
40 |
RESEARCH |
20 |
SALES |
30 |
注:这里记录集叠加时主要对应字段类型要一致。比如这里的ename和dname是一致的都是字符串类型,如果类型不一致需要做转换。
7.3.2 组合相关的行
需求:
查询雇员表里部门编号是10的员工名和部门名称。
解决方法:
这里需要用到inner join或则等值连接,因为是对两张表进行关联,按照deptno去emp和dept表里关联得到ename和dname。
Mysql、Sql server、Oracle:
SELECT ename,dname
FROM emp,dept
WHERE emp.deptno= dept.deptno
AND emp.deptno= 10;
或:
SELECT ename,dname
FROM emp
INNER JOIN dept
ON emp.deptno= dept.deptno
WHERE emp.deptno= 10
执行结果:
ename |
dname |
CLARK |
ACCOUNTING |
KING |
ACCOUNTING |
MILLER |
ACCOUNTING |
延展阅读:
这里是emp表里相同的deptno和dept里相同的deptno关联,见下:
SELECT ename,dname,emp.deptno AS emp_deptno,dept.deptno AS dept_deptno
FROM emp
INNER JOIN dept
ON emp.deptno= dept.deptno
WHERE emp.deptno= 10;
执行结果:
ename |
dname |
emp_deptno |
dept_deptno |
CLARK |
ACCOUNTING |
10 |
10 |
KING |
ACCOUNTING |
10 |
10 |
MILLER |
ACCOUNTING |
10 |
10 |
7.3.3 查询两个表共同的行
需求:
查询雇员表里部门编号是10的员工编号、员工名称、职位和雇员表的公共行。
解决方法:
这里需要用到intersect关键字,注意这里为了演示,显然返回的还是部门编号为10的员工编号、员工名称、职位。当然部分数据库不支持,我们可以通过关联的方式达到同样的效果。
Sql server、Oracle:
SELECT empno,ename,job FROM emp WHERE deptno=10
INTERSECT
SELECT empno,ename,job FROM emp
Mysql、Sql server、Oracle:
SELECT A.empno,A.ename,A.job FROM
(SELECT empno,ename,job FROM emp WHERE deptno=10)A
JOIN emp B
ON A.empno = B.empnoAND A.ename = B.enameAND A.job = B.job
执行结果:
empno |
ename |
job |
7782 |
CLARK |
MANAGER |
7839 |
KING |
PRESIDENT |
7934 |
MILLER |
CLERK |
7.3.4 从一个表中查询另外一个表里没有的值
需求:
查询部门表雇员表里的部门编号,即未分配员工的部门。
解决方法:
这里需要用到minus关键字,当然部分数据库不支持,我们可以通过not exists关键词解决。
Oracle:
SELECT deptno FROM dept
minus
SELECT deptno FROM emp
Sql server:
SELECT deptno FROM dept
EXCEPT
SELECT deptno FROM emp
Mysql、Sql server、Oracle:
SELECT deptno FROM dept
WHERE deptno NOT IN
(SELECT deptnoFROM emp)
或者:
SELECT dept.deptno FROM dept
LEFT JOIN emp
ON emp.deptno= dept.deptno
WHERE emp.deptno IS NULL
执行结果:
deptno |
40 |
延展阅读:
SELECT dept.deptno,emp.deptno FROM dept
LEFT JOIN emp
ON emp.deptno= dept.deptno
-- WHERE emp.deptno IS NULL
执行结果:
dept_deptno |
emp_deptno |
10 |
10 |
10 |
10 |
10 |
10 |
20 |
20 |
20 |
20 |
20 |
20 |
20 |
20 |
20 |
20 |
30 |
30 |
30 |
30 |
30 |
30 |
30 |
30 |
30 |
30 |
30 |
30 |
40 |
NULL |
注:这里dept表里的deptno40并没有在emp表里关联到,所以更加left join的特性,emp_deptno这列为null,所以我们加个WHERE emp.deptno IS NULL即可取出该条记录。
7.3.5 在一个表中查询与其它表不匹配的记录
需求:
查询没有部门员工的部门的信息。
解决方法:
这里需要用到left join解决思路类似上一章,也可以通过not exists、notin这些关键词解决。
Mysql、Sql server、Oracle:
SELECT dept.* FROM dept
LEFT JOIN emp
ON emp.deptno= dept.deptno
WHERE emp.deptno IS NULLSELECT dept.* FROM dept
WHERE not exists
(SELECT deptno FROM emp WHERE emp.deptno= dept.deptno)SELECT dept.* FROM dept
WHERE deptno NOT IN (SELECT deptno FROM emp)
执行结果:
deptno |
dname |
loc |
40 |
OPERATIONS |
BOSTON |
7.3.6 笛卡尔积生成数据
需求:
查询雇员表里部门编号是10的员工可能会待的所有部门的组合,这里要取得字段有员工编号、部门编号、部门名称。
解决方法:
这里需要用到cross join解决。生成一个A×B的结果集,即如果A表里有3条,B条里有4条则会有3*4=12条记录。
Mysql、Sql server、Oracle:
SELECT empno,deptno,dname FROM(SELECT empno FROM emp WHERE deptno=10)ACROSS JOIN dept
执行结果:
empno |
deptno |
dname |
7782 |
10 |
ACCOUNTING |
7782 |
20 |
RESEARCH |
7782 |
30 |
SALES |
7782 |
40 |
OPERATIONS |
7839 |
10 |
ACCOUNTING |
7839 |
20 |
RESEARCH |
7839 |
30 |
SALES |
7839 |
40 |
OPERATIONS |
7934 |
10 |
ACCOUNTING |
7934 |
20 |
RESEARCH |
7934 |
30 |
SALES |
7934 |
40 |
OPERATIONS |
7.3.7 基于截取子串的连接
需求:
查询雇员表里部门编号是10的部门编号、部门名称、员工名,注这里需要emp表和tmp_v关联。
解决方法:
这里需要用到对tmp_v里的字段data进行字符串截取后再跟dept表的关联。
这里tmp_v的数据见下:
SELECT * FROM tmp_v;
data |
SMITH 20 |
ALLEN 30 |
WARD 30 |
JONES 20 |
MARTIN 30 |
BLAKE 30 |
CLARK 10 |
SCOTT 20 |
KING 10 |
TURNER 30 |
ADAMS 20 |
JAMES 30 |
FORD 20 |
MILLER 10 |
Mysql、Sql server、Oracle:
SELECT B.deptno,B.dname,A.ename FROM
(SELECTSUBSTRING(data,1,CHARINDEX(' ',data,1)-1) as ename,
SUBSTRING(data,CHARINDEX(' ',data,1)+1,LEN(data)) as deptno
FROM tmp_v
)A
INNER JOIN dept B
ON A.deptno= B.deptno
WHERE A.deptno=10-- 或:(这里oralce,sql server,mysql里相关字符串函数不尽相同)SELECT B.deptno,B.dname,SUBSTRING(data,1,CHARINDEX(' ',data,1)-1) as ename
FROM tmp_v A
INNER JOIN dept B
ON SUBSTRING(A.data,CHARINDEX(' ',A.data,1)+1,LEN(A.data))= B.deptno
WHERE B.deptno=10
执行结果:
deptno |
dname |
ename |
10 |
ACCOUNTING |
CLARK |
10 |
ACCOUNTING |
KING |
10 |
ACCOUNTING |
MILLER |
7.3.8 不等值连接
需求:
查询雇员表里部门编号大于20的部门编号、部门名称、员工名,注这里需要emp表和tmp_v关联。
解决方法:
这里需要用到对tmp_v里的字段data进行字符串截取后再跟dept表的关联。
SELECT B.deptno,B.dname,SUBSTRING(data,1,CHARINDEX(' ',data,1)-1) as ename
FROM tmp_v A
INNER JOIN dept B
ON SUBSTRING(A.data,CHARINDEX(' ',A.data,1)+1,LEN(A.data))= B.deptno ANDB.deptno>20
执行结果:
deptno |
dname |
ename |
30 |
SALES |
ALLEN |
30 |
SALES |
WARD |
30 |
SALES |
MARTIN |
30 |
SALES |
BLAKE |
30 |
SALES |
TURNER |
30 |
SALES |
JAMES |
SQL基础操作_2_操作多个表相关推荐
- MySQL学习思维导图(MySQL简介、SQL基础命令、约束、单表查询、多表查询、内置函数、存储过程、视图、事务、索引)
MySQL学习思维导图 内容包括:MySQL简介.SQL基础命令.约束.单表查询.多表查询.内置函数.存储过程.视图.事务.索引 文章目录 MySQL学习思维导图 一.MySQL简介 二.SQL基础命 ...
- SQL基础系列(二)——单表查询
本文以单表查询为边界,介绍如何对一张表进行简单查询.限制条件查询.结果排序等内容.每种情况均有例句和补充说明. 如想看更多示例,请移步<SQL基础教程(第二版)>-MICK(如需电子版,可 ...
- SQL基础---增删查询操作
在做sustaning的测试,我们经常需要用到一些数据库的增删查询等操作.在这里选择了公司的QA环境作为练习.写下基础的知识点以供以后查询. 查询语句------select: select * fr ...
- sql 基础语法 创建数据库和数据表 数据增删改查 分组查询 子查询回顾
参考链接: SQL教程 MySQL教程 一.创建数据库语法 --用master数据库 use master --判断数据库是否存在,若存在则删除 if exists (select * from sy ...
- SQL基础系列(四)——多表查询
本部分内容包括如何使用2张以上的表如何进行横向联结(表的联结)及竖向联结(集合运算). 目录 1.表的联结 1.1联结是什么 1.2内联结 1.3外联结 1.4多张表联结 1.5复杂表联结语句 2.其 ...
- 【SAP Hana】X档案:SAP HANA SQL 基础教程
SAP HANA SQL 基础教程 1.SQL 标准简介 2.HANA STUDIO 的安装 3.HANA STUDIO 的设置 4.HANA SQL 基础教程 (1)查看表数据 (2)查看表结构 ( ...
- Oracle学习(一)SQL基础
一.认识SQL SQL是什么? SQL,结构化查询语言,全称是 Structured Query Language. SQL 是一门 ANSI(American National Standards ...
- SQL基础操作_4_表的插入、更新、删除、合并操作
目录 表的插入.更新.删除.合并操作 7.4.1 插入新的记录 7.4.2 插入含自增列的记录 7.4.3 插入新的多条记录 7.4.4 同时往多个表插入记录 7.4.5 通过其它表插入 7.4.6 ...
- SQL基础操作_3_数据字典(涵盖SQL Server、Oracle、Mysql常见系统数据字典)
目录 数据库元数据查询 7.5.1 列出模式中所有的表 7.5.2 列出所有的数据库 7.5.3 列出给定表的基本信息 7.5.4 列出给定表的索引信息 7.5.5 列出给定表的主键.外键约束 7.5 ...
最新文章
- Unable to locate package update
- java代码实现python2中aes加密经历
- 【51nod2026】Gcd and Lcm(杜教筛)
- 工业机器人电路图讲解话术_6张经典电路图分析助你进阶高级电工,你都会了吗?...
- haproxy代理hive
- php网站分区,PHP - Manual: 分区和分片 (官方文档)
- java crontriggerbean_java – 使用JobStoreTX为石英聚类配置CronTriggerFactoryBean
- DataAdapter对象填充数据集
- OpenCV之响应鼠标(一):利用鼠标获取坐标
- Atitti 文本分类 以及 垃圾邮件 判断原理 以及贝叶斯算法的应用解决方案
- 如何在html中调用Js函数
- oracle的imp导入数据,初识oracle-imp导入
- 科技兴盛下,传统银行该如何转型?
- 3dmax转化html,VRayMtl Converter材质转换3dsmax插件V3.97版
- 想装吗?看看装B大全
- Debian字体美化
- 如何基于Arduino开发板使用APDS9960 RGB和手势传感器
- 维纳辛钦定理的证明一
- 全球10大智慧港口介绍
- 【2020年第七次人口普查】省市县三级分年龄、性别的人口
热门文章
- wxWidgets:wxMemoryDC类用法
- boost::process::search_path相关的测试程序
- boost::gil::view_is_mutable用法的测试程序
- boost::gil::derived_view_type用法的测试程序
- boost::gil::detail::is_channel_integral用法的测试程序
- boost::describe模块实现console的测试程序
- Boost:可移植地自定义boost :: hash的测试程序
- boost的chrono模块时间间隔的测试程序
- boost::callable_traits的return_type_t的测试程序
- VTK:PolyData之WarpVector