oracle 10g 学习之多表查询、分组函数(6)
笛卡尔集
l 笛卡尔集会在下面条件下产生:
- 省略连接条件
- 连接条件无效
- 所有表中的所有行互相连接
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 可以在有多个列满足条件时进行选择。
l 不要给选中的列中加上表名前缀或别名。
l 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;
oracle 10g 学习之多表查询、分组函数(6)的更多相关文章
- Oracle中把一张表查询结果插入到另一张表中
1. 新增一个表,通过另一个表的结构和数据 create table XTHAME.tab1 as select * from DSKNOW.COMBDVERSION 2. 如果表存在: inse ...
- oracle 基础SQL语句 多表查询 子查询 分页查询 合并查询 分组查询 group by having order by
select语句学习 . 创建表 create table user(user varchar2(20), id int); . 查看执行某条命令花费的时间 set timing on: . 查看表的 ...
- Oracle的学习二:表管理(数据类型、创建/修改表、添加/修改/删除数据、数据查询)
1.Oracle表的管理 表名和列名的命名规则: 必须以字母开头: 长度不能超过30个字符: 不能使用oracle的保留字: 只能使用如下字符:A-Z, a-z, 0-9, $, # 等. Oracl ...
- Oracle 数据库基础学习 (五) 多表查询
多表查询:查询结果需要用到两个或者以上表,此时需要多表连接,产生多表查询 1.内连接(等值连接) 示例:将两个表内容连接显示 select * from dept d, emp e where d.d ...
- oracle 10g 学习之视图、序列、索引、同义词(9)
目标 通过本章学习,您将可以: l 描述视图 l 创建和修改视图的定义,删除视图 l 从视图中查询数据 l 通过视图插入, 修改和删除数据 l 使用“Top-N” 分析 l 创建, 维护, ...
- oracle系列笔记(2)---多表查询
多表查询 这篇文章主要讲四点: (1)oracle多表查询 (2)SQL99标准的连接查询 (3)子查询 (4)分级查询 oracle多表查询有两种方式,一种是oracle所 ...
- Django 学习 之ORM聚合查询分组查询与F查询与Q查询
一.聚合查询和分组查询 1.聚合查询aggregate 关于数据表的数据请见上一篇:Django 学习 之ORM多表操作(点我) aggregate(*args, **kwargs),只对一个组进行聚 ...
- oracle 10g 学习之oracle管理(3)
怎样将预先写好的sql脚本执行? select * from employees;→107条记录 利用 Oracle 企业管理器连接数据库服务器 点击打开以下界面: 此时已经连接成功了 用 Oracl ...
- MySQL学习9 - 单表查询
一.单表查询的语法 二.关键字的执行优先级(重点) 三.单表查询示例 1.where约束 2.group by分组查询 3.聚合函数 4.HAVING过滤 5.order by查询排序 6.limit ...
随机推荐
- 全程图解 手把手教您开启windows终端服务
一.什么是远程桌面? 远程桌面是微软公司为了方便网络管理员管理维护服务器而推出的一项服务.从windows 2000 server版本开始引入,网络管理员使用远程桌面连接程序连接到网络任意一台开启了远 ...
- std::thread
std::shared_ptr<std::thread> m_spThread; m_spThread.reset(new std::thread(std::bind(&GameS ...
- Hibernate动态更新
Hibernate一级缓存: Hibernate有一级和二级缓存.一级缓存就是Session. 在Hibernate启动的时候,SessionFactory解析映射文件的时候,会根据映射文件中的字段生 ...
- app 后端技术
app 后端技术 一直以来工作的方向是web server,对app server没有什么了解.虽然没有接触过移动app开发,但对app后端技术还是挺有探索欲望的,app应用和web应用在前端的用户习 ...
- [整理]通过AngularJS directive对bootstrap日期控件的的简单包装
最近项目上了AngularJS,而原来使用的日期控件的使用方式也需要改变,于是开始了倒腾,看了官方的例子,可以使用AngularJS的directive做简单的处理,这样在html里直接使用申明的的形 ...
- HDOJ 4731 Minimum palindrome
Minimum palindrome Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Other ...
- 如何让ThinkPHP的模板引擎达到最佳效率
默认情况下ThinkPHP框架系统默认使用的模板引擎是内置模板引擎.内置模板引擎支持模板文件中采用php原生态代码和模板标签的混合使用.ThinkPHP官方开发文档说,这种默认的内置模板引擎的性能是高 ...
- topo排序 + 用邻接表优化后的
输入数据: 4 61 21 32 33 42 44 2 4 61 21 32 33 42 41 2 topo排序为偏序: #include<stdio.h> #include<que ...
- Socket 多线程FTP软件开发
Socket具体还可见360云中文档记载 Socket是一个非常古老的协议了 1970年 Socket.AF_Unix======AF意思是 addressFamily 地址簇 Import os ...
- 简单实现Tab切换(带框架)
<script type="text/javascript"> $(function () { //加载时添加的标签卡 if ('<%=Request[" ...