zoukankan      html  css  js  c++  java
  • oracle 10g 学习之多表查询、分组函数(6)

    笛卡尔集

    笛卡尔集会在下面条件下产生:

    • 省略连接条件
    • 连接条件无效
    • 所有表中的所有行互相连接

    l  为了避免笛卡尔集, 可以在 WHERE 加入有效的连接条件。

    自连接

    select m.last_name,m.email,m.salary from employees e,employees m where e.employee_id = m.manager_id and m.last_name='Chen';

    自己和自己连接,将一张表分为两张表查询使用

    非等值连接

    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 last_name,department_name from employees,departments

    where employees.department_id = departments.department_id(+)

    右外连接

    select last_name,department_name from employees,departments

    where employees.department_id(+) = departments.department_id

    表的别名

    l  使用别名可以简化查询。

    l  使用表名前缀可以提高执行效率。

    使用SQL: 1999 语法连接

    使用连接从多个表中查询数据:

    SELECT     table1.column, table2.column

    FROM       table1

    [CROSS JOIN table2] |

    [NATURAL JOIN table2] |

    [JOIN table2 USING (column_name)] |

    [JOIN table2

      ON(table1.column_name = table2.column_name)] |

    [LEFT|RIGHT|FULL OUTER JOIN table2

      ON (table1.column_name = table2.column_name)];

    叉集

    l  使用CROSS JOIN 子句使连接的表产生叉集。

    l  叉集和笛卡尔集是相同的。

    SELECT last_name, department_name

    FROM   employees

    CROSS JOIN departments ;

    自然连接

    l  NATURAL JOIN 子句,会以两个表中具有相同名字的列为条件创建等值连接

    l  在表中查询满足等值条件的数据。

    l  如果只是列名相同而数据类型不同,则会产生错误。

    SELECT department_id, department_name,

           location_id, city

    FROM   departments

    NATURAL JOIN locations ;两张表都有location_id字段

    使用 USING 子句创建连接

    l  在NATURAL JOIN 子句创建等值连接时,可以使用 USING 子句指定等值连接中需要用到的列

    l  使用 USING 可以在有多个列满足条件时进行选择。

    不要给选中的列中加上表名前缀或别名

    NATURAL JOIN 和 USING 子句经常同时使用

    SELECT e.employee_id, e.last_name, d.location_id

    FROM   employees e JOIN departments d

    USING (department_id) ;

    SQL: 1999外连接

    左外连接

    SELECT e.last_name, e.department_id, d.department_name

    FROM   employees e

    LEFT OUTER JOIN departments d

    ON   (e.department_id = d.department_id) ;

    右外联接

    SELECT e.last_name, e.department_id, d.department_name

    FROM   employees e

    RIGHT OUTER JOIN departments d

    ON    (e.department_id = d.department_id)

    满外联接

    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) ;

    内连接

    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);

     

    分组函数

    COUNT(计数)函数

    l  COUNT(expr) 返回 expr不为空的记录总数

    SELECT COUNT(commission_pct)

    FROM   employees

    WHERE  department_id = 80;

    组函数与空值

    组函数忽略空值

    SELECT AVG(commission_pct)

    FROM   employees;

    在组函数中使用NVL函数

    NVL函数使分组函数无法忽略空值

    SELECT AVG(NVL(commission_pct, 0))

    FROM   employees;

  • 相关阅读:
    Python Day14
    Python Day13
    Python Day12
    Python Day11
    Python Day10
    Python Day9
    Python Day8
    Python Day7
    Python Day6
    Python Day5
  • 原文地址:https://www.cnblogs.com/yxlblogs/p/3458525.html
Copyright © 2011-2022 走看看