在实际中,经常是从多张表中查询数据。本节学习多表连接查询、子查询等高级SELECT语句的应用。

1.简单连接查询

多表查询是指SELECT命令中显示的列来源于多个数据表;
连接查询将多个表以某个或某些列为条件进行连接操作而检索出关联数据的过程。多个表之间以共同列而关联在一起。

1.1使用WHERE子句的简单连接查询

用WHERE子句对数据记录限定检索条件,在WHERE子句中使用”=”,可以实现表的简单连接。表示第一个表中的列与第二个表中相应列匹配后才会在结果集中显示。

SELECT  empno, ename, sal, scott.emp.deptno,  scott.dept.deptno, dnameFROM scott.emp, scott.deptWHERE scott.emp.deptno=scott.dept.deptno;

表scott.emp和scott.dept都包含列deptno,根据这个共同的列,在WHERE子句中使用等号(=)进行连接。

1.1.1一个不用WHERE子句的简单连接

SELECT  empno, ename, sal, scott.emp.deptno,  scott.dept.deptno, dname
FROM scott.emp, scott.dept;

两表仅通过SELECT子句和FROM子句建立连接,而不加连接条件,查询结果为两张表的笛卡尔积,即用第一个表中的每一行与第二个表中的每一行进行连接,结果集中的行数是两表行数的乘积、列数是两表列数的和。

1.1.2为表设置别名

在多表查询中,如果多个表之间存在同名的列,则必须使用表名进行限定。为增加可读性,可以使用表的别名,还能提高SELECT语句的执行效率。
在FROM语句中引用该表时,将表别名跟在表的实际名称之后。

SELECT  empno, ename, sal, e.deptno,  d.deptno, dnameFROM scott.emp e, scott.dept dWHERE scott.emp.deptno=scott.dept.deptno;

注意:如果为表设置了别名,表的实际名称也就会被覆盖,所有引用表名称的地方都必须使用表别名,而不能再用实际表名称;
另外,为表设置别名时,不能使用AS关键字。

1.2.JOIN关键字的连接查询

多表之间可以使用英文逗号进行分割,还可以使用关键字JOIN。
包括:内连接和外连接。

SELECT column_list
FROM table_name1 join_type table_name2 [ON (join_condition)]

1.2.1内连接

一般使用INNER JOIN关键字指定内连接,INNER可以省略,默认表示内连接。查询结果中只包含两表的公共字段值相等的行,列可以是两表中的任意列

使用INNER JOIN 连接scott.emp和scott.dept两个表,查询员工部门为accounting的信息。

SELECT empno, ename , sal ,d.deptno, dname
FROM scott.emp e INNER JOIN scott.dept d ON e.deptno=d.deptno
WHERE dname =‘ACCOUNTING’;

ON后面的条件中,除了可以使用(=)运算符比较,还可以使用比较运算符、LIKE 、IN和BETWEEN等关键字。

自然连接(NATURAL JOIN)是一种特殊的等值连接。它是由系统根据两表的同名字段作等值比较的内连接,因此不需要使用关键字ON指定连接条件。

SELECT empno, ename , sal ,d.deptno, dname
FROM scott.emp e NATURAL JOIN scott.dept d
WHERE  dname =‘ACCOUNTING’;

1.3外连接查询

包括左外连接、右外连接、全外连接
(1)左外连接 LEFT JOIN
结果集中包括两表连接后满足ON后面指定的连接条件的行,还显示JOIN关键字左侧表中所有满足检索条件的行,如何左表的某行在右表中没有匹配行,则在结果中,右表的所有选择列均为NULL。
(2)右外连接 RIGHT JOIN
是左外连接的反向连接。
(3)完全外连接 FULL JOIN
完全外连接查询的结果集包括两表内连接的结果集和左表与右表中不满足条件的行。

1.4交叉连接

交叉连接(CROSS JOIN)是用左表中的每一行与右表中的每一行进行连接,不能使用ON关键字。所得到的结果将是这两个表中各行数据的所有组合,即这两个表所有数据的笛卡尔积。

2.子查询

在查询条件中,可以嵌套另一个查询,即在一个SELECT、UPDATE或DELETE语句内部使用一个SELECT语句的查询。

外层的SELECT语句叫做外部查询,内层的SELECT语句叫做子查询

使用子查询主要是将查询的结果作为外部主查询的查询条件;

子查询可以嵌套多层,但每层嵌套需要使用圆括号()括起来;

大部分子查询是放在SELECT语句的WHERE子句中使用。

子查询的类型:
(2)根据子查询返回一行或多行查询结果,可将子查询分为2类:
单行子查询;多行子查询

(2)子查询的两种比较操作符

单行子查询的操作符:+、>、<、>=、<=、<>和!<>;
多行子查询的操作符:ALL、ANY、IN或函数min,max。

2.1单行子查询

通常在一个SELECT、UPDATE或DELETE语句的WHERE子句中充当查询、修改或删除的条件

SELECT column_list FROM table_name WHERE expression operator (
select column_list FROM table_name WHERE condition
GROUP BY exp HAVING having
);

注:在WHERE子句中使用子查询时,子查询语句中不要用ORDER BY 子句。如果确实要用ORDER BY 子句对结果进行排序输出,可以在外部查询中使用该子句。

例如:在子查询中使用ORDER BY 子句,将查询结果按照empno列降序输出。

SELECT empno, ename, sal, d.deptno FROM scott.empWHERE deptno IN (SELECT deptno FROM scott.empWHERE empno>7782  ORDER BY empno DESC);

这时,执行结果会出现错误信息。因为第四行的ORDER BY 子句无效(软件不会理睬)。更改如下:

SELECT empno, ename, sal, d.deptno FROM scott.empWHERE deptno IN (SELECT deptno FROM scott.empWHERE empno>7782)ORDER BY empno DESC;

2.2多行子查询

单行子查询指子查询只返回单行单列数据;多行子查询是指子查询返回多行单列数据,即一组数据。

当子查询是单列多行子查询时,必须使用多行比较运算符,包括IN、NOT IN、ANY、ALL和SOME。

IN和NOT IN可以独立使用,表示用来比较表达式的值是否在子查询的结果集中。

ANY和ALL必须与单行比较运算符组合起来使用。

2.3带EXIST关键字的关联子查询

关联子查询是指需要引用外查询表的一列或多列的子查询语句,这种子查询与外部语句相关,是主要通过EXISTS运算符实现的查询。EXISTS用于测试子查询的结果是否为空,如子查询的结果集不为空,则EXISTS返回TRUE,否则返回FALSE。

例:检索scott.emp和scott.dept表中在NEW YORK工作的所有员工信息。

SELECT  ename, job, sal,d.deptno FROM scott.empWHERE EXISTS (SELECT  *  FROM  scott.dept  WHERE  deptno=emp.deptnoAND loc = 'NEW YOK');

外层SELECT语句返回的每一行数据都要根据子查询来评估,如果EXISTS关键字中指定的条件为真,查询结果就包括这一行。

这里EXISTS 关键字只检索子查询返回的数据是否存在,因此子查询可以返回一个常量,这样可以提高查询的性能。如果使用1代替上述子查询语句中的*列,查询结果不变。

EXISTS与IN的比较:
IN操作符实现指定匹配查询,检索特定的值是否包含在值列表中;
EXISTS操作符只是检查行是否存在,针对行的存在性。

2.4其他(多列子查询)

单行子查询和多行子查询获得的结果都是单列数据,但是多列子查询获得的是多列任意行数据。多列子查询是指返回多列数据的子查询。

使用子查询比较多个列的数据时,可以使用一下两种方式:
a.成对比较:要求多个列的数据必须同时匹配。
b.非成对比较:通过指定连接关键字,例如AND或OR等,指定多个列的数据是否必须同时匹配。

SELECT  ename, sal,comm.,d.deptno FROM scott.empWHERE (sal, NVL(COMM. , -1)) IN (SELECT sal,NVL(comm. , -1) FROM scott.empWHERE deptno = 30);

NVL()函数用于从两个表达式返回一个非NULL值。此处的查询为成对比较。

SELECT  ename, sal,comm.,d.deptno FROM scott.empWHERE sal IN (SELECT sal FROM scott.empWHERE deptno = 30) AND  NVL(COMM. , -1) IN( SELECT NVL(comm. , -1) FROM scott.empWHERE deptno=30);

此处为非成对比较。

SELECT高级查询——连接查询、子查询(多表数据查询)相关推荐

  1. AJAX for Java简单表数据查询实例

    AJAX for Java简单表数据查询实例<?XML:NAMESPACE PREFIX = O /> AJAX WebShop 3对Java开发具有良好的支持,同时也提供了各种层次的后台 ...

  2. 查询两张表 然后把数据并在一起_工作表数据查询时,类似筛选功能LIKE和NOT LIKE的应用...

    大家好,我们继续讲解VBA数据库解决方案,今日讲解第53讲内容:工作表查询时,类似于筛选功能的LIKE和NOT LIKE 的应用.大家在工作的时候,利用EXCEL操作,筛选是必不可少的工具之一.例如我 ...

  3. hive 如何将数组转成字符串_hive 将hive表数据查询出来转为json对象和json数组输出...

    1.将hive表数据查询出来转为json对象输出apache 一.将查询出来的数据转为一行一行,并指定分割符的数据json 二.使用UDF函数,将每一行数据做为string传入UDF函数中转换为jso ...

  4. mysql 查询从库状态_Mysql库表状态查询

    1. 查看库的各链接状态 对于一个mysql连接或者一个线程,任何时刻都有一个状态,表示其当前正在做什么.一般使用show full processlist查看. +---------+------- ...

  5. mysql实验训练2 数据查询操作_实验训练2:数据查询操作

    <实验训练2:数据查询操作>由会员分享,可在线阅读,更多相关<实验训练2:数据查询操作(6页珍藏版)>请在人人文库网上搜索. 1.实验训练2:数据查询操作请到电脑端查看实验目的 ...

  6. mysql实验训练2 数据查询操作_实验训练2:数据查询操作.doc

    实验训练2:数据查询操作.doc 实验训练2数据查询操作请到电脑端查看实验目的基于实验1创建的汽车用品网上商城数据库Shopping,理解MySQL运算符.函数.谓词,练习Select语句的操作方法. ...

  7. mysql水果表查询_最全MySQL数据库表的查询操作

    序言 本节比较重要,对数据表数据进行查询操作,其中可能大家不熟悉的就对于INNER JOIN(内连接).LEFT JOIN(左连接).RIGHT JOIN(右连接)等一些复杂查询. 通过本节的学习,可 ...

  8. python进行数据查询_使用Python实现NBA球员数据查询小程序功能

    本文的文字及图片来源于网络,仅供学习.交流使用,不具有任何商业用途,如有问题请及时联系我们以作处理. 以下文章来源于早起Python ,作者投稿君 一.前言 有时将代码转成带有界面的程序,会极大地方便 ...

  9. mysql中多表联合查询语句_mysql中的多表联合查询语句是什么

    mysql中的多表联合查询语句是:[select 语句1 union [union 选项] select 语句2 union [union 选项] select 语句n].多表联合查询结果是将多个se ...

最新文章

  1. R语言ggplot2可视化为复杂图自定义图例、手动构造图例(legend)实战
  2. python扫描端口脚本_Python实现的端口扫描功能示例
  3. 微信小程序--字体展示
  4. 亚马逊外包平台的50万劳工:人工智能的背后,无尽数据集的建造
  5. pt100 c 语言,PT100计算公式 C程序.doc
  6. boost::math::skew_normal用法的测试程序
  7. 教你用Python制作一款自己的杀毒程序
  8. gitee提交突然报错remote: Incorrect username or password ( access token )
  9. python创建矩阵_python中Numpy的属性与创建矩阵
  10. iPhone 开源游戏引擎
  11. 请求发送者与接收者解耦——命令模式(六)
  12. 离线tts linux,GitHub - rayboot/tts-go: 讯飞离线文字转语音。 支持Linux Windows
  13. C# 身份证号码验证正则和验证函数
  14. 记zabbix正常启动,但是没有监听任何端口问题
  15. php能做动画吗,使用 PHP 快速生成 Flash 动画
  16. 以小饭桌网站为例介绍抓取动态网页的数据【python爬虫入门进阶】(12)
  17. 教学ppt设计与制作
  18. 如果你也有资料收集强迫症?
  19. Esp8266天猫精灵_RGB灯_非点灯平台
  20. windows使用cmd删除目录和文件(详细)

热门文章

  1. GetKeyState函数详解
  2. strstr函数及模拟
  3. php和plc哪个难,西门子plc和三菱plc那个好学?西门子plc和三菱plc的区别
  4. 子进程和父进程资源共享关系
  5. [转帖]GT4 奖励车一览
  6. 02 BGP地址聚合
  7. mysql 基本配置
  8. 尾递归优化 - 尾递归优化
  9. 什么是数据清洗?数据清洗的原理是什么?
  10. 1 Go语言开发环境搭建详细教程+go常见bug合集【Go语言教程】