Multitable INSERT 的用法

本文详细介绍了 SQL 中 Insert 语句的各种用法,包括基础插入、无条件与条件性多表插入、条件 FIRST 插入及 Pivoting 插入等,并通过具体实例展示了如何灵活运用这些插入方式来提高数据处理效率。

一、Insert基础用法

语法:

    Insert Into 表名 (字段1,字段2,字段3...)

    Values (值1,值2,值3...)

例子:

INSERT INTO departments(department_id, department_name, 
manager_id, location_id)
VALUES      (70, 'Public Relations', 100, 1700);

语法:

    Insert Into 表名 (字段1,字段2,字段3...)

    select 语句

不做任何解释,实在是没啥好说的〇_〇,注意别跟create table ...as select一样,insert中的select前面可没as ^_^

二、Unconditional 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;

解释:将select查询出来的结果,每返回一行就分别插入表sal_history 和mgr_history 中,优点就是只做一次查询即可分别查询2个表,假如使用基础用法,将进行2次查询。

三、Conditional INSERT ALL

还是直接拿例子:

INSERT ALL
    WHEN SAL > 10000 THEN
        INTO sal_history VALUES(EMPID,HIREDATE,SAL)
   WHEN MGR > 200   THEN 
       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;

解释:将select查询出来的结果,每返回一行就判断,SAL > 10000 就插入表sal_history ,MGR > 200就插入mgr_history ,优点和前面提到一样。

四、Conditional FIRST INSERT

仍然是例子:

INSERT FIRST
   WHEN SAL  > 25000          THEN
       INTO special_sal VALUES(DEPTID, SAL)
   WHEN HIREDATE like ('%00%') THEN
      INTO hiredate_history_00 VALUES(DEPTID,HIREDATE)
   WHEN HIREDATE like ('%99%') THEN
      INTO hiredate_history_99 VALUES(DEPTID, HIREDATE)
   ELSE
      INTO hiredate_history VALUES(DEPTID, HIREDATE)
   SELECT department_id DEPTID, SUM(salary) SAL,
                  MAX(hire_date) HIREDATE
   FROM   employees
   GROUP BY department_id;

解释:将select查询出来的结果,每返回一行就判断,SAL  > 25000就插入表special_sal ,否则HIREDATE like ('%00%') ,符合就插入hiredate_history_00,前面2个条件还是不成力,就判断HIREDATE like ('%99%') ,符合就插入表hiredate_history_99 ,前面3个条件都不符合,只好插入表hiredate_history 了。

打完这我都头晕了,假如学过程序设计,看下面的清晰明了:

if  SAL  > 25000 then

    INTO special_sal VALUES(DEPTID, SAL)
else

(

    if HIREDATE like ('%00%') THEN

         INTO hiredate_history_00 VALUES(DEPTID,HIREDATE)
    else

        (

            if HIREDATE like ('%99%') THEN

                INTO hiredate_history_99 VALUES(DEPTID, HIREDATE)
            else

                INTO hiredate_history VALUES(DEPTID, HIREDATE)
        )

 )

假如还看不理解,看官方的这句话吧,“If the first WHEN clause evaluates to true, the subsequent WHEN clauses for this row should be skipped.”


五、Pivoting INSERT

最后还是例子:

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;

解释:老实说,看不出有啥用法,真的非要说,咱就把它当作行列转换吧,如果上面表在加多一列,比如INTO sales_info VALUES (employee_id,week_id,week_which,sales_MON) 改成 INTO sales_info VALUES (employee_id,week_id,'星期一',sales_MON)



多表INSERT语句
1)INSERT...SELECT语句能够作为单个的DML语句的一部分用于插入行到多表中
2)多表INSERT语句能够被用在数据仓库系统中从一个或多个操作源转移数据到一组目的表中
3)Oracle9i引入下面的多表插入语句的类型:
  -无条件INSERT
  -条件ALL INSERT
  -条件FIRST INSERT
  -枢轴式(Pivoting)INSERT

无条件INSERT语句
语法:
INSERT ALL
[insert_into_value][values_clause]
(subquery)

例如:
-从emp表中选择empno大于7698雇员的empno,hiredate,sal和mgr值
-用多表INSERT插入这些值到sal_history(empno,hiredate,sal)和mgr_history(empno,mgr,sal)表中 

INSERT ALL
INTO sal_history VALUES(empno,hiredate,sal)
INTO mgr_history VALUES(empno,mgr,sal)
SELECT empno,hiredate,sal,mgr
FROM   emp
WHERE  empno>7698;

有条件INSERT语句
语法
INSERT ALL
[WHEN condition THEN]
[insert_into_clause][values_clause]
(subquery)

例子
-从emp表中选择empno大于7698雇员的empno,hiredate,sal和mgr值
-如果sal大于$2500,用一个条件多表INSERT语句插入这些值到sal_history表中
-如果mgr大于7782,用一个多表INSERT语句插入这些值到mgr_history表中

INSERT ALL
WHEN sal>2500 THEN
INTO sal_history VALUES(empno,hiredate,sal)
WHEN mgr>7782 THEN
INTO mgr_history VALUES(empno,mgr,sal)
SELECT empno,hiredate,sal,mgr
FROM   emp
WHERE  empno>7698;
    
条件FIRST INSERT
语法  
INSERT FIRST
[WHEN condition THEN]
[insert_into_clause][values_clause]
[ELSE]
[insert_into_clause][values_clause]
(subquery)

例子
-从emp表中选择empno大于7698雇员的empno,hiredate,sal和mgr值
-如果sal大于$2500,则用一个条件FIRST多表INSERT语句插入这些值到sal_history表中
-如果第一个WHEN子句的值为true,则该行后面的WHEN子句被跳过
-如果mgr大于7782,用一个条件FIRST多表INSERT语句插入这些值到mgr_history表中

INSERT FIRST
WHEN sal>2500 THEN
INTO sal_history VALUES(empno,hiredate,sal)
WHEN mgr>7782 THEN
INTO mgr_history VALUES(empno,mgr,sal)
SELECT empno,hiredate,sal,mgr
FROM   emp
WHERE  empno>7698;

枢轴式(Pivoting) INSERT

支持从非关系数据库表中接受一组销售记录
sales_source_data的格式如下:
empno,week_id,sales_MON,sales_TUE,sales_WED,sales_THUR,sales_FRI
你可能想要以一种典型的相关格式存储这些记录到sales_info(empno,week,sales)表中使用pivoting INSERT,从非关系数据库表转换销售记录集到关系格式

INSERT ALL
INTO sales_info VALUES(empno,week_id,sales_MON)
INTO sales_info VALUES(empno,week_id,sales_TUE)
INTO sales_info VALUES(empno,week_id,sales_WED)
INTO sales_info VALUES(empno,week_id,sales_THUR)
INTO sales_info VALUES(empno,week_id,sales_FRI)
SELECT empno,week_id,sales_MON,sales_TUE,sales_WED,sales_THUR,sales_FRI
FROM   sales_source_data;



什么是pivoting insert
create table sales_source_data (
employee_id number(6),
week_id number(2),
sales_mon number(8,2),
sales_tue number(8,2),
sales_wed number(8,2),
sales_thur number(8,2),
sales_fri number(8,2)
);
insert into sales_source_data values (176,6,2000,3000,4000,5000,6000);

create table sales_info (
employee_id number(6),
week number(2),
sales number(8,2)
);
-- 
现在要将上表的数据转换到下表中,
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,

行转列
<think>好的,我现在要解决用户的问题:如何用循环编写一个函数来打印n*n乘法口诀表。首先,我需要回忆一下乘法口诀表的结构。比如,当n=9时,它是一个9x9的表格,每一行的列数等于行号,第一行1列,第二行2列,直到第九行9列。每个单元格的内容是行号乘以列号的结果。 用户提到使用循环实现,所以应该考虑嵌套循环。外层循环控制行数,内层循环控制每行的列数。比如,外层变量i从1到n,内层变量j从1到i。这样,对于每一行i,内层循环j从1到i,输出i*j的值。 接下来,我需要考虑格式化输出的问题。每个乘法表达式应该对齐,比如当结果是一位数时,后面可能需要加空格,保持整齐。例如,1x1=1 和2x1=2 应该对齐。可以用条件判断或者固定宽度格式,比如使用制表符\t或者固定长度的字符串。 然后,考虑不同编程语言的实现。用户提供的引用中有Python、C和Scala的例子,但用户的问题比较通用,可能需要一个通用的方法,然后举例不同语言的实现。例如,在Python中,可以使用两个for循环,外层i从1到n,内层j从1到i,然后使用print函数,设置end参数不换行,每行结束后换行。 在C语言中,由于没有内置的字符串格式化函数,可能需要使用printf的格式控制,比如%-4d来左对齐并固定宽度,使得每个结果占4个字符位置,保持对齐。 另外,用户提到函数名为MultiTable,接受参数n,所以函数需要根据输入的n来动态生成对应的乘法表。例如,当输入12时,生成12x12的表格。 可能还需要考虑效率问题,虽然对于打印乘法表来说,时间复杂度是O(n²),这在n不是特别大的情况下是可以接受的。对于非常大的n,可能会有性能问题,但通常乘法表的n不会太大。 最后,测试一下不同情况下的输出是否正确。比如n=3时,应该输出: 1x1=1 1x2=2 2x2=4 1x3=3 2x3=6 3x3=9 确保每行的列数正确,格式对齐,没有多余的换行或空格。 总结步骤: 1. 外层循环i从1到n。 2. 内层循环j从1到i。 3. 在内层循环中,计算乘积i*j,并格式化为字符串,保持对齐。 4. 每行结束后换行。</think>### 分步实现方法 #### 核心逻辑 使用双重循环实现$n \times n$乘法口诀表: 1. **外层循环**控制行数$i$($1 \leq i \leq n$) 2. **内层循环**控制每行的列数$j$($1 \leq j \leq i$) 3. **格式化输出**保证对齐(例如$3 \times 4=12$和$2 \times 3=6$保持等宽) #### Python实现 ```python def MultiTable(n): for i in range(1, n+1): for j in range(1, i+1): print(f"{j}x{i}={i*j:2}", end=' ') # 结果固定占2位 print() # 换行 # 测试打印9x9口诀表 MultiTable(9) ``` #### C语言实现 ```c #include <stdio.h> void MultiTable(int n) { for (int i = 1; i <= n; i++) { for (int j = 1; j <= i; j++) { printf("%dx%d=%-4d", j, i, i*j); # 左对齐占4位 } printf("\n"); } } // 调用示例 int main() { MultiTable(12); return 0; } ``` #### 执行效果示例(以n=3为例) $$ \begin{aligned} &1x1=1 \\ &1x2=2 \ \ 2x2=4 \\ &1x3=3 \ \ 2x3=6 \ \ 3x3=9 \end{aligned} $$ ### 关键点解析 1. **循环结构**:外层循环变量$i$控制行数,内层循环变量$j$控制列数[^3] 2. **格式化输出**:通过占位符控制对齐(Python使用`f-string`,C语言使用`%-4d`) 3. **动态参数**:函数接收参数$n$,可生成任意尺寸口诀表[^1]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值