SQL多表查询

等值和不等值连接查询

  • 从多个表中获取数据:如果在查询的时候,直接从多个表中获取数据。没有添加条件判断,会出现“笛卡尔积”错误
  • 笛卡尔积错误
    • 笛卡尔集会在下面条件下产生

      • 省略连接条件
      • 连接条件无效
      • 所有表中的所有行互相连接
    • 为了避免笛卡尔集, 可以在 WHERE 加入有效的连接条件。
  • Oracle 连接多表查询
    • 在 WHERE 子句中写入连接条件。
    • 在表中有相同列时,在列名之前加上表名前缀
SELECT  table1.column, table2.column
FROM table1, table2
WHERE table1.column1 = table2.column2;
等值连接
SELECT employees.employee_id, employees.last_name,
employees.department_id, departments.department_id,
departments.location_id
FROM employees, departments
WHERE employees.department_id = departments.department_id;
  • 区分重复的列名(使用表名或者表的别名)

    • 使用表名前缀在多个表中区分相同的列。
    • 在不同表中具有相同列名的列可以用表的别名加以区分。
  • 连接 n个表,至少需要 n-1个连接条件。 例如:连接三个表,至少需要两个连接条件。
-- 练习:查询出公司员工的 last_name, department_name, city
SELECT last_name, department_name, city
FROM employees e ,departments d ,locations l
WHERE e.department_id = d.department_id AND d.location_id = l.location_id
非等值连接
-- EMPLOYEES表中的列工资应在JOB_GRADES表中的最高工资与最低工资之间
SELECT e.last_name, e.salary, j.grade_level
FROM employees e, job_grades j
WHERE e.salary BETWEEN j.lowest_sal AND j.highest_sal;

内连接、外连接(左(或右) 外连接、满外连接)

  • 内连接: 合并具有同一列的两个以上的表的行, 结果集中不包含一个表与另一个表不匹配的行
  • 外连接: 两个表在连接过程中除了返回满足连接条件的行以外还返回左(或右)表中不满足条件的行 ,这种连接称为左(或右) 外连接。没有匹配的行时, 结果表中相应的列为空(NULL). 外连接的 WHERE 子句条件类似于内部连接, 但连接条件中没有匹配行的表的列后面要加外连接运算符, 即用圆括号括起来的加号(+).
内连接
SELECT e.last_name, d.department_name
FROM employees e, departments d
WHERE e.department_id = d.department_id
-- SQL1999语法的方式
SELECT e.last_name, d.department_name
FROM employees e
INNER JOIN departments d ON e.department_id = d.department_id
外连语法
  • 使用外连接可以查询不满足连接条件的数据。

  • 外连接的符号是 (+)。

  • 右外连接

SELECT  table1.column, table2.column
FROM table1, table2
WHERE table1.column(+) = table2.column; -- 示例
SELECT e.last_name, d.department_name
FROM employees e, departments d
WHERE e.department_id(+) = d.department_id -- SQL1999方式
SELECT e.last_name, d.department_name
FROM employees e RIGHT OUTER JOIN departments d
ON (e.department_id = d.department_id)
  • 左外连接
SELECT  table1.column, table2.column
FROM table1, table2
WHERE table1.column = table2.column(+); -- 示例
SELECT e.last_name, d.department_name
FROM employees e, departments d
WHERE e.department_id = d.department_id(+) -- SQL1999方式
SELECT e.last_name, d.department_name
FROM employees e LEFT OUTER JOIN departments d
ON (e.department_id = d.department_id)
满外连接
  • 在SQL: 1999中,内连接只返回满足连接条件的数据
  • 两个表在连接过程中除了返回满足连接条件的行以外还返回左(或右)表中不满足条件的行,这种连接称为左(或右) 外连接。
  • 两个表在连接过程中除了返回满足连接条件的行以外还返回两个表中不满足条件的行 ,这种连接称为满 外连接。
-- 满外连接
SELECT e.last_name, e.department_id, d.department_name
FROM employees e
FULL OUTER JOIN departments d
ON (e.department_id = d.department_id)
自连接
  • 自连接可以把表本身作为连接的表
-- 练习:查询出 last_name 为 ‘Chen’ 的员工的 manager 的信息
SELECT worker.last_name || ' works for ' || manager.last_name
FROM employees worker , employees manager
WHERE worker.manager_id = manager.employee_id AND INITCAP(worker.last_name) = 'Chen'
叉集(了解)
  • 使用CROSS JOIN 子句使连接的表产生叉集。
  • 叉集和笛卡尔集是相同的。
SELECT last_name, department_name
FROM employees
CROSS JOIN departments

自然连接

  • NATURAL JOIN 子句,会以两个表中具有相同名字的列为条件创建等值连接。
  • 在表中查询满足等值条件的数据。
  • 如果只是列名相同而数据类型不同,则会产生错误

返回的是,两个表中具有相同名字的列的“且、交集”,而非“或,并集”。即:比如employee类和department类都有

department_id和manager_id,返回二者都相同的结果。

SELECT department_id, department_name,
location_id, city
FROM departments
NATURAL JOIN locations

使用USING创建连接

  • 在NATURAL JOIN 子句创建等值连接时,可以使用 USING 子句指定等值连接中需要用到的列。
  • 使用 USING 可以在有多个列满足条件时进行选择。
  • 不要给选中的列中加上表名前缀或别名。
  • JOIN 和 USING 子句经常同时使用。
  • 有局限性:但若多表的连接列列名不同,此法不合适
select  last_name,department_name
from employees
join departments using (department_id);

使用ON 子句创建连接 (常用)

  • 自然连接中是以具有相同名字的列为连接条件的。
  • 可以使用 ON 子句指定额外的连接条件。
  • 这个连接条件是与其它条件分开的。
  • ON 子句使语句具有更高的易读性。
SELECT e.employee_id, e.last_name, e.department_id,
d.department_id, d.location_id
FROM employees e JOIN departments d
ON (e.department_id = d.department_id) -- 使用ON 创建多表连接
SELECT employee_id, city, department_name
FROM employees e
JOIN departments d
ON d.department_id = e.department_id
JOIN locations l
ON d.location_id = l.location_id

Oracle_多表查询的更多相关文章

  1. oracle_多表查询02

    多表查询 select * from BONUS; select * from DEPT; select * from EMP; select * from SALGRADE; BONUS表 ENAM ...

  2. django(3) 一对多跨表查询、ajax、多对多

    1.一对多跨表查询获取数据的三种形式:对象.字典.元组 例:有host与business两张表,host与business的id字段关联,business在host表中的对象名是b,  通过查询hos ...

  3. Mysql常用表操作 | 单表查询

    160905 常用表操作 1. mysql -u root -p 回车 输入密码   2. 显示数据库列表 show databases     3. 进入某数据库 use database data ...

  4. mysql,SQL标准,多表查询中内连接,外连接,自然连接等详解之查询结果集的笛卡尔积的演化

    先附上数据. CREATE TABLE `course` ( `cno` ) NOT NULL, `cname` ) CHARACTER SET utf8 NOT NULL, `ctime` ) NO ...

  5. MyBatis实现关联表查询

    一.一对一关联 1.1.提出需求 根据班级id查询班级信息(带老师的信息) 1.2.创建表和数据 创建一张教师表和班级表,这里我们假设一个老师只负责教一个班,那么老师和班级之间的关系就是一种一对一的关 ...

  6. MyBatis学习总结(五)——实现关联表查询(转载)

    本文转载自:http://www.cnblogs.com/jpf-java/p/6013516.html 一.一对一关联 1.1.提出需求 根据班级id查询班级信息(带老师的信息) 1.2.创建表和数 ...

  7. sql多表查询时怎么获取查到的字段

    首先,多表查询不能用hql(貌似hql就是不支持多表查询,如果可以,希望看到的朋友给个例子) List list = systemService.findListbySql("SELECT ...

  8. MyBatis入门学习教程-实现关联表查询

    一.一对一关联 1.1.提出需求 根据班级id查询班级信息(带老师的信息) 1.2.创建表和数据 创建一张教师表和班级表,这里我们假设一个老师只负责教一个班,那么老师和班级之间的关系就是一种一对一的关 ...

  9. 【T-SQL基础】01.单表查询-几道sql查询题

    概述: 本系列[T-SQL基础]主要是针对T-SQL基础的总结. [T-SQL基础]01.单表查询-几道sql查询题 [T-SQL基础]02.联接查询 [T-SQL基础]03.子查询 [T-SQL基础 ...

随机推荐

  1. 关于js单线程(转载)

    进程和线程都是操作系统的概念.进程是应用程序的执行实例,每一个进程都是由私有的虚拟地址空间.代码.数据和其它系统资源所组成:进程在运行过程中能够申请创建和使用系统资源(如独立的内存区域等),这些资源也 ...

  2. 弹出popwindow 背景变暗

    先看下效果图吧 代码如下 package com.example.administrator.popwindowdemo.view; import android.app.Activity; impo ...

  3. zookeeper在linux下自启动

    Linux下设置zookeeper开机自启动  一.以root用户登录系统: 二.进入init.d文件夹 cd /etc/init.d/ 三.创建并打开zookeeper文件 vi zookeeper ...

  4. Java技术体系图

    Java程序员高级特性              反射.泛型.注释符.自动装箱和拆箱.枚举类.可变              参数.可变返回类型.增强循环.静态导入        核心编程       ...

  5. angularjs 解决ng-repeat数组内重复对象报错的问题

    ng-repeat 循环数组内元素时,如果数组内元素重复,angular会抛出异常: Error: [ngRepeat:dupes] http://errors.angularjs.org/1.4.3 ...

  6. K线图学习

    本博文(适合入门的股民朋友)内容来自网络,股市有风险,入市需谨慎 一.起源 K线图(Candlestick Charts)又称蜡烛图.日本线.阴阳线.棒线等,常用说法是“K线”,起源于日本十八世纪德川 ...

  7. MySQL字符集

    字符集的选择 1.如果数据库只需要支持中文,数据量很大,性能要求也很高,应该选择双字节定长编码的中文字符集(如GBK).因为相对于UTF-8而言,GBK"较小",每个汉字只占2个字 ...

  8. Unity之CharacterController 碰撞问题总结

    CharacterController 不会受到scene的重力影响,自带物理碰撞检测,在脱离导航网格的应用场景下(比如飞行),是很有优势的Unity原生工具组件.如果在复杂的应用场景里,会有多种CC ...

  9. 电容参数:X5R,X7R,Y5V,COG 详解

    电容参数:X5R,X7R,Y5V,COG 详解 文章来源:http://www.hzlitai.com.cn/article/ARM9-article/cphard/1777.html 仅供分享学习~ ...

  10. 利用fsockopen可实现异步成功访问

    $fp = fsockopen("www.jb51.net", 80, $errno, $errstr, 30); if (!$fp) { echo "$errstr ( ...