目录

操作多个表

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_操作多个表相关推荐

  1. MySQL学习思维导图(MySQL简介、SQL基础命令、约束、单表查询、多表查询、内置函数、存储过程、视图、事务、索引)

    MySQL学习思维导图 内容包括:MySQL简介.SQL基础命令.约束.单表查询.多表查询.内置函数.存储过程.视图.事务.索引 文章目录 MySQL学习思维导图 一.MySQL简介 二.SQL基础命 ...

  2. SQL基础系列(二)——单表查询

    本文以单表查询为边界,介绍如何对一张表进行简单查询.限制条件查询.结果排序等内容.每种情况均有例句和补充说明. 如想看更多示例,请移步<SQL基础教程(第二版)>-MICK(如需电子版,可 ...

  3. SQL基础---增删查询操作

    在做sustaning的测试,我们经常需要用到一些数据库的增删查询等操作.在这里选择了公司的QA环境作为练习.写下基础的知识点以供以后查询. 查询语句------select: select * fr ...

  4. sql 基础语法 创建数据库和数据表 数据增删改查 分组查询 子查询回顾

    参考链接: SQL教程 MySQL教程 一.创建数据库语法 --用master数据库 use master --判断数据库是否存在,若存在则删除 if exists (select * from sy ...

  5. SQL基础系列(四)——多表查询

    本部分内容包括如何使用2张以上的表如何进行横向联结(表的联结)及竖向联结(集合运算). 目录 1.表的联结 1.1联结是什么 1.2内联结 1.3外联结 1.4多张表联结 1.5复杂表联结语句 2.其 ...

  6. 【SAP Hana】X档案:SAP HANA SQL 基础教程

    SAP HANA SQL 基础教程 1.SQL 标准简介 2.HANA STUDIO 的安装 3.HANA STUDIO 的设置 4.HANA SQL 基础教程 (1)查看表数据 (2)查看表结构 ( ...

  7. Oracle学习(一)SQL基础

    一.认识SQL SQL是什么? SQL,结构化查询语言,全称是 Structured Query Language. SQL 是一门 ANSI(American National Standards ...

  8. SQL基础操作_4_表的插入、更新、删除、合并操作

    目录 表的插入.更新.删除.合并操作 7.4.1 插入新的记录 7.4.2 插入含自增列的记录 7.4.3 插入新的多条记录 7.4.4 同时往多个表插入记录 7.4.5 通过其它表插入 7.4.6 ...

  9. SQL基础操作_3_数据字典(涵盖SQL Server、Oracle、Mysql常见系统数据字典)

    目录 数据库元数据查询 7.5.1 列出模式中所有的表 7.5.2 列出所有的数据库 7.5.3 列出给定表的基本信息 7.5.4 列出给定表的索引信息 7.5.5 列出给定表的主键.外键约束 7.5 ...

最新文章

  1. Unable to locate package update
  2. java代码实现python2中aes加密经历
  3. 【51nod2026】Gcd and Lcm(杜教筛)
  4. 工业机器人电路图讲解话术_6张经典电路图分析助你进阶高级电工,你都会了吗?...
  5. haproxy代理hive
  6. php网站分区,PHP - Manual: 分区和分片 (官方文档)
  7. java crontriggerbean_java – 使用JobStoreTX为石英聚类配置CronTriggerFactoryBean
  8. DataAdapter对象填充数据集
  9. OpenCV之响应鼠标(一):利用鼠标获取坐标
  10. Atitti 文本分类  以及 垃圾邮件 判断原理 以及贝叶斯算法的应用解决方案
  11. 如何在html中调用Js函数
  12. oracle的imp导入数据,初识oracle-imp导入
  13. 科技兴盛下,传统银行该如何转型?
  14. 3dmax转化html,VRayMtl Converter材质转换3dsmax插件V3.97版
  15. 想装吗?看看装B大全
  16. Debian字体美化
  17. 如何基于Arduino开发板使用APDS9960 RGB和手势传感器
  18. 维纳辛钦定理的证明一
  19. 全球10大智慧港口介绍
  20. 【2020年第七次人口普查】省市县三级分年龄、性别的人口

热门文章

  1. wxWidgets:wxMemoryDC类用法
  2. boost::process::search_path相关的测试程序
  3. boost::gil::view_is_mutable用法的测试程序
  4. boost::gil::derived_view_type用法的测试程序
  5. boost::gil::detail::is_channel_integral用法的测试程序
  6. boost::describe模块实现console的测试程序
  7. Boost:可移植地自定义boost :: hash的测试程序
  8. boost的chrono模块时间间隔的测试程序
  9. boost::callable_traits的return_type_t的测试程序
  10. VTK:PolyData之WarpVector