SQL 基础之子查询、多表插入、merge 语句、跟踪一段时间数据变化(二十)

简介:

使用子查询处理数据

可以使用子查询中的数据操纵语言(DML)语句:

使用内嵌视图检索数据

从一张表向另一张表复制数据

基于另一张表的值更新表中数据

基于另一张表的值删除表中的行


使用子查询作为数据源检索数据

select department_name, city from departments

natural join (select l.location_id, l.city, l.country_id

from loc l

join countries c

on(l.country_id = c.country_id)

join regions using(region_id) where region_name = 'europe');


使用子查询作为目标插入数据

insert into (select l.location_id, l.city, l.country_id from locations l

join countries c

on(l.country_id = c.country_id)

join regions using(region_id)

where region_name = 'europe')

values (3300, 'Cardiff', 'UK');


在 DML  语句中使用WITH CHECK OPTION 

WITH CHECK OPTION 关键字,禁止子查询中行的更改。


显示的默认功能概述

  • 使用 DEFAULT 关键字设置字段默认值。

  • 允许用户控制什么时候使用默认值应用到数据

  • 可以在INSERT和UPDATE语句中显式使用缺省值


使用显式的缺省值

INSERT 与 DEFAULT:


insert into deptm3 (department_id, department_name, manager_id) values (300, 'engineering', default);


UPDATE 与 DEFAULT:

update deptm3 set manager_id = default where department_id = 10;


从另一张表中复制行

  • INSERT 语句的子查询:

insert into sales_reps(id, name, salary, commission_pct)

select employee_id, last_name, salary, commission_pct

from employees

where job_id like '%REP%';

  • 不使用 VALUES 子句

  • INSERT 子句与子查询的列数、类型相匹配


使用以下类型完成多表插入:

– 无条件 INSERT

– 旋转 INSERT

– 有条件 INSERT ALL

– 有条件 INSERT FIRST


insert all

into target_a values(... , ... , ...)

into target_b values(... , ... , ...)

into target_c values(... , ... , ...)

select ...

from sourcetab

where ...;


多表查询示意图:

wKiom1jX5cODE2nzAADCLi6us0w436.jpg

多表插入作用如下:

  • 使用INSERT…SELECT语句插入行到多个表中,作为一个单一的DML语句。

  • 数据仓库系统中使用的多表INSERT语句将一个或多个操作的源数据写入到一组目标表中。

  • 它们提供显着的性能改善:

      – 单个 DML 语句与多表 INSERT…SELECT 语句

      – 单个 DML 语句与使用 IF...THEN 语法完成多表插入


多表INSERT 语句的类型

以下是不同类型的多表 INSERT 语句:

  •  无条件 INSERT

  •  旋转 INSERT

  •  有条件 INSERT ALL

  •  有条件 INSERT FIRST


多表 INSERT 语法

insert [conditional_insert_clause]

[insert_into_clause values_clause] (subquery)


有条件 INSERT 子句:

[ALL|FIRST]

[WHEN condition THEN] [insert_into_clause values_clause]

[ELSE] [insert_into_clause values_clause]


无条件 INSERT ALL


insert all

into sal_history values(empid,hiredate,sal)

into mgr_history values(empid,mgr,sal)

select employee_id empid, hire_date hiredate,

salary sal, manager_id mgr

from employees

where employee_id > 200;


有条件INSERT ALL :示例

wKioL1jX5wiz0iMcAABqAzWKp2M786.jpg

有条件INSERT ALL

insert all

when hiredate <  ' 01-JAN-95 ' then

into emp_history values(EMPID,HIREDATE,SAL)

when comm is not null then

into emp_sales values(EMPID,COMM,SAL)

select employee_id empid, hire_date hiredate,

salary sal, commission_pct comm

from employees

wKiom1jX55-i7xUoAAC-0_pDMWg002.jpg

有条件INSERT FIRST

insert first

when salary < 5000 then

into sal_low values (employee_id, last_name, salary)

when salary between 5000 and 10000 then

into sal_mid values (employee_id, last_name, salary)

else

into sal_high values (employee_id, last_name, salary)

select employee_id, last_name, salary

from employees


旋转INSERT

将销售记录从非关系型数据库表中设置为关系格式

wKiom1jX6F7jhKb5AAB4z1D8yJo619.jpg


insert all

into sales_info values (employee_id,week_id,sales_MON)

into sales_info values (employee_id,week_id,sales_TUE)

into sales_info values (employee_id,week_id,sales_WED)

into sales_info values (employee_id,week_id,sales_THUR)

into sales_info values (employee_id,week_id, sales_FRI)

select employee_id, week_id, sales_MON, sales_TUE,

sales_WED, sales_THUR,sales_FRI

from sales_source_data;


限制条件

  • 只能对表执行多表插入语句,不能对视图或物化视图执行;

  • 不能对远端表执行多表插入语句;

  • 不能使用表集合表达式;

  • 不能超过999个目标列;

  • 在RAC环境中或目标表是索引组织表或目标表上有BITMAP索引时,多表插入语句不能并行执行;

  • 多表插入语句不支持执行计划稳定性;

  • 多表插入语句中的子查询不能使用序列。


MERGE 语句

  • 提供根据条件进行更新、插入、删除数据的功能

  • 如果数据存在执行UPDATE,如果不存在则INSERT:

      – 避免单独更新

      – 提高了性能和易用性

      – 非常适用于数据仓库


MERGE  语句语法

使用MERGE语句,您可以根据条件插入,更新或删除表中的行

merge into table_name table_alias

using (table|view|sub_query) alias

on (join condition)

when matched then

update set

col1 = col1_val,

col2 = col2_val

when not matched then

insert (column_list)

values (column_values);


合并行:示例

插入或更新COPY_EMP3表中与EMPLOYEES相匹配的行。

merge into copy_emp3 c

using (select * from employees ) e

on (c.employee_id = e.employee_id)

when matched then

update set

c.first_name = e.first_name,

c.last_name = e.last_name,

...

delete where (e.commission_pct is not null)

when not matched then

insert values(e.employee_id, e.first_name, e.last_name,

e.email, e.phone_number, e.hire_date, e.job_id,

e.salary, e.commission_pct, e.manager_id,

e.department_id);


合并行 示例

truncate table copy_emp3;

select * from copy_emp3;


merge into copy_emp3 c

using (select * from employees ) e

on (c.employee_id = e.employee_id)

when matched then

update set

c.first_name = e.first_name,

c.last_name = e.last_name,

...

delete where (e.commission_pct is not null)

when not matched then

insert values(e.employee_id, e.first_name, ...


跟踪数据的变化

闪回版本查询示例

select salary from employees3 where employee_id = 107;

update employees3 set salary = salary * 1.30 where employee_id = 107;

commit;

select salary from employees3 versions between scn minvalue and maxvalue where employee_id = 107;


VERSIONS BETWEEN 子句

select versions_starttime "start_date",

versions_endtime "end_date",

salary

from employees

versions between scn minvalue

and maxvalue

where last_name = 'Lorentz';





本文转自 yuri_cto 51CTO博客,原文链接:http://blog.51cto.com/laobaiv1/1910564,如需转载请自行联系原作者

相关文章
|
2月前
|
SQL
简单练习Microsoft SQL Server MERGE同步两个表
【10月更文挑战第13天】本文介绍了在Microsoft SQL Server中使用`MERGE`语句同步两个表的步骤。首先创建源表`SourceTable`和目标表`TargetTable`并分别插入数据,然后通过`MERGE`语句根据ID匹配行,实现更新、插入和删除操作,最后验证同步结果。此方法可根据需求调整以适应不同场景。
118 1
|
1月前
|
SQL 存储 缓存
SQL Server 数据太多如何优化
11种优化方案供你参考,优化 SQL Server 数据库性能得从多个方面着手,包括硬件配置、数据库结构、查询优化、索引管理、分区分表、并行处理等。通过合理的索引、查询优化、数据分区等技术,可以在数据量增大时保持较好的性能。同时,定期进行数据库维护和清理,保证数据库高效运行。
|
2月前
|
SQL 移动开发 Oracle
SQL语句实现查询连续六天数据的方法与技巧
在数据库查询中,有时需要筛选出符合特定时间连续性条件的数据记录
|
2月前
|
SQL 存储 关系型数据库
添加数据到数据库的SQL语句详解与实践技巧
在数据库管理中,添加数据是一个基本操作,它涉及到向表中插入新的记录
|
2月前
|
SQL 数据挖掘 数据库
SQL查询每秒的数据:技巧、方法与性能优化
id="">SQL查询功能详解 SQL(Structured Query Language,结构化查询语言)是一种专门用于与数据库进行沟通和操作的语言
|
2月前
|
SQL 监控 数据处理
SQL数据库数据修改操作详解
数据库是现代信息系统的重要组成部分,其中SQL(StructuredQueryLanguage)是管理和处理数据库的重要工具之一。在日常的业务运营过程中,数据的准确性和及时性对企业来说至关重要,这就需要掌握如何在数据库中正确地进行数据修改操作。本文将详细介绍在SQL数据库中如何修改数据,帮助读者更好
388 4
|
2月前
|
SQL 关系型数据库 PostgreSQL
遇到SQL 子查询性能很差?其实可以这样优化
遇到SQL 子查询性能很差?其实可以这样优化
118 2
|
2月前
|
SQL 分布式计算 关系型数据库
Hadoop-24 Sqoop迁移 MySQL到Hive 与 Hive到MySQL SQL生成数据 HDFS集群 Sqoop import jdbc ETL MapReduce
Hadoop-24 Sqoop迁移 MySQL到Hive 与 Hive到MySQL SQL生成数据 HDFS集群 Sqoop import jdbc ETL MapReduce
97 0
|
2月前
|
SQL 分布式计算 关系型数据库
Hadoop-23 Sqoop 数据MySQL到HDFS(部分) SQL生成数据 HDFS集群 Sqoop import jdbc ETL MapReduce
Hadoop-23 Sqoop 数据MySQL到HDFS(部分) SQL生成数据 HDFS集群 Sqoop import jdbc ETL MapReduce
43 0
|
2月前
|
SQL 分布式计算 关系型数据库
Hadoop-22 Sqoop 数据MySQL到HDFS(全量) SQL生成数据 HDFS集群 Sqoop import jdbc ETL MapReduce
Hadoop-22 Sqoop 数据MySQL到HDFS(全量) SQL生成数据 HDFS集群 Sqoop import jdbc ETL MapReduce
56 0