zoukankan      html  css  js  c++  java
  • DB2 9 根蒂根基(730 检修)认证指南,第 4 部门: 处理惩罚 DB2 数据(3)

    developerWorks








    数据垄断语言(Data Manipulation Language,DML)

    运用 SELECT 语句从数据库表检索数据

    SELECT 语句用来检索表或查看数据。最复杂方式的 SELECT 语句可以用来检索一个表中的所罕见据。比方,要从 SAMPLE 数据库中检索悉数 STAFF 数据,应该收回以下饬令:

    SELECT * FROM staff
    


    上面是这个究诘前去的部门结局集:
    ID NAME DEPT JOB YEARS SALARY COMM
    10 Sanders 20 Mgr 7 18357.50 -
    20 Pernal 20 Sales 8 18171.25 612.45
    30 Marenghi 38 Mgr 5 17506.75 -

    要限定结局集中行的数目,可以运用 FETCH FIRST 子句,比方:

    SELECT * FROM staff FETCH FIRST 10 ROWS ONLY
    


    可以颠末指定选择列表 从表中检索特定的列,选择列表由逗号分开的列名构成。比方:

    SELECT name, salary FROM staff
    


    运用 DISTINCT 子句消除结局集中的反复行。比方:

    SELECT DISTINCT dept, job FROM staff
    


    运用 AS 子句给选择列表中的表达式或项目分配一个故意义的称号。比方:

    SELECT name, salary   comm AS pay FROM staff
    


    假设没有 AS 子句,派生的列会命名为 2,这示意它是结局集中的第二列。









    运用 WHERE 子句和谓词限定究诘前去的数据量

    运用 WHERE 子句指定一个或多个搜刮规范(即搜刮前提),从而从表或视图选择特定的行。搜刮前提 由一个或多个谓词构成。谓词指定关于行的某一状况(拜见 SQL 的构成部门)。在构建搜刮前提时,要确保:

    • 算术利用只应用于数字数据规范
    • 只在可比拟的数据规范之间遏制比拟
    • 将字符值包围在单引号中
    • 字符值应该指定为与数据库中的值完全一样

    我们来看几个示例。

    • 根究工资跨越 $20,000 的人员的姓名:
      "SELECT name, salary FROM staff
        WHERE salary > 20000"
      


      将语句包围在双引号中,可以警备利用系统错误地表明特殊字符,歧 * 或 >;假设不这么做,年夜于号会被表明为输出重定向恳求。
    • 列出工资跨越 $20,000 的不是经理的人员的姓名、头衔和工资:
      "SELECT name, job, salary FROM staff
        WHERE job <> 'Mgr'
        AND salary > 20000"
      


    • 根究以字母 S 扫尾的悉数姓名:
      SELECT name FROM staff
        WHERE name LIKE 'S%'
      


      在这个示例中,百分号(%)是一个通配符,代表零个或多个字符的字符串。

    子究诘(subquery) 是主究诘的 WHERE 子句中出现的 SELECT 语句,它将结局集提提供 WHERE 子句。比方:

    "SELECT lastname FROM employee
      WHERE lastname IN
      (SELECT sales_person FROM sales
        WHERE sales_date < '01/01/1996')"
    


    关系称号(correlation name) 是在究诘的 FROM 子句中定义的,可以作为表的冗长称号。关系称号还可以消除对来自分歧表的相通列名的二义性援用。比方:

    "SELECT e.salary FROM employee e
      WHERE e.salary <
      (SELECT AVG(s.salary) FROM staff s)"
    











    运用 ORDER BY 子句对结局遏制排序

    运用 ORDER BY 子句凭据一个或多个列中的值对结局集遏制排序。ORDER BY 子句中指定的列名纷歧定在选择列表中指定。比方:

    "SELECT name, salary FROM staff
      WHERE salary > 20000
      ORDER BY salary"
    


    ORDER BY 子句中指定 DESC 可以对结局集遏制降序排序:

    ORDER BY salary DESC
    











    运用团结从多个表中检索数据

    团结(join) 是一种将来自两个或更多表中的数据组合起来的究诘。常常需求从两个或更多的表中选择信息,因为所需的数据常常是疏散的。团结将列添加到结局集中。比方,对两个具有三列的表遏制完全团结,会发作具有六列的结局集。

    最复杂的团结中没有指定前提。比方:

    SELECT deptnumb, deptname, manager, id, name, dept, job 
      FROM org, staff
    


    这个语句从 ORG 表和 STAFF 表前去列的悉数组合。前三列来自 ORG 表,后四列来自 STAFF 表。如许的结局集(两个表的叉积(cross product))没什么用处。需求用一个团结前提(join condition) 来调解结局集。比方,上面这个究诘标识出那些是经理的人员:

    SELECT deptnumb, deptname, id AS manager_id, name AS manager 
      FROM org, staff 
      WHERE manager = id 
      ORDER BY deptnumb
    


    上面是这个究诘前去的部门结局集:
    DEPTNUMB DEPTNAME MANAGER_ID MANAGER
    10 Head Office 160 Molinare
    15 New England 50 Hanes
    20 Mid Atlantic 10 Sanders

    前面的语句是一个外部团结的示例。外部团结(inner join) 只前去叉积中知足团结前提的行。假设一行在一个表中存在,可是在另一个表中不存在,它就不包括在结局集中。要显式地指定外部团结,可以从头编写前面的究诘,在 FROM 子句中添加 INNER JOIN 利用符:

    ...
      FROM org INNER JOIN staff
      ON manager = id
    ...
    


    环节字 ON 为遏制团结的表指定团结前提。DeptNumb 和 DeptName 是 ORG 表中的列,而 Manager_ID 和 Manager 基于 STAFF 表中的列(ID 和 Name)。在外部团结的结局集中,行的值判袂娶亲左表 (ORG)以及右表 (STAFF)中的 Manager 和 ID 列。(在两个表上执行团结时,可以肆意指定一个表为左表,另一个表为右表。)

    外部团结(Outer join) 前去外部团结利用发作的行,加上外部团结利用不会前去的行。有三种规范的外部团结:

    • 左外部团结 包括外部团结,加上左 表中外部团结利用不会前去的行。这种团结在 FROM 子句中运用 LEFT OUTER JOIN(或 LEFT JOIN)利用符。
    • 右外部团结 包括外部团结,加上右 表中外部团结利用不会前去的行。这种团结在 FROM 子句中运用 RIGHT OUTER JOIN(或 RIGHT JOIN)利用符。
    • 完全外部团结 包括外部团结,加上左表和右表 中外部团结利用不会前去的行。这种团结在 FROM 子句中运用 FULL OUTER JOIN(或 FULL JOIN)利用符。

    回答更庞年夜的问题需求构造更庞年夜的究诘。上面的究诘生成继承项目的人员的列表,颠末列出他们管理的部门标识出是经理的那些人员:

    SELECT empno, deptname, projname 
      FROM (employee 
      LEFT OUTER JOIN project 
      ON respemp = empno) 
      LEFT OUTER JOIN department 
      ON mgrno = empno
    


    第一个外部团结取得人员继承的任何项目的称号;这个外部团结包围在圆括号中并起首被说明。第二个外部团结取得是经理的人员的部门称号。









    运用 UNION 会萃利用符将两个或更多的究诘组解析一个究诘

    运用 UNION 利用符、EXCEPTINTERSECT 将两个或更多的究诘组解析一个究诘。集利用符 对究诘的结局遏制处理惩罚、消除反复并前去最终的结局集。

    • UNION 利用符将两个或更多的结局表组合在一同,生成一个结局表。
    • EXCEPT 会萃利用符生成的结局表中包括第一个究诘前去的悉数行,可是去丧失了第二个或任何后续究诘前去的行。
    • INTERSECT 会萃利用符生成的结局表只包括悉数究诘都前去的行。

    上面是一个运用 UNION 会萃利用符的究诘示例。异样的究诘可以运用 EXCEPTINTERSECT 会萃利用符更换环节字 UNION

    "SELECT sales_person FROM sales 
      WHERE region = 'Ontario-South' 
    UNION 
    SELECT sales_person FROM sales 
      WHERE sales > 3"
    











    运用 GROUP BY 子句对结局遏制汇总

    运用 GROUP BY 子句对结局集中的行遏制构造。每个组在结局集中由一行示意。比方:

    SELECT sales_date, MAX(sales) AS max_sales FROM sales 
      GROUP BY sales_date
    


    这个语句从 SALES 表中前去贩卖日期的列表。SAMPLE 数据库中的 SALES 表包括贩卖数据,包括特定贩卖人员在特定日期完成的告成生意的数目。多次在天天有多个记载。GROUP BY 子句按日期对数据遏制分组,这个示例中的 MAX 函数前去每个贩卖日期记载的最年夜贩卖数目。

    另一个风格的 GROUP BY 子句要指定 GROUPING SETS 子句。分组集 可以用来在一遍平说明分歧聚合层次上的数据。比方:

    SELECT YEAR(sales_date) AS year, region, SUM(sales) AS tot_sales 
      FROM sales
      GROUP BY GROUPING SETS (YEAR(sales_date), region, () )
    


    在这里,YEAR 函数用来前去日期值的年份部门,SUM 函数用来前去每个分组的贩卖区间的总量。分组集列表 指定如何对数据遏制分组,即聚合。在分组集列表中添加一对空的圆括号,可以取得结局集中的总量。这个语句前去以下结局:
    YEAR REGION TOT_SALES
    - - 155
    - Manitoba 41
    - Ontario-North 9
    - Ontario-South 52
    - Quebec 53
    1995 - 8
    1996 - 147

    假设一个语句与前面的语句几乎相通,可是指定 ROLLUP 子句或 CUBE 子句而不是 GROUPING SETS 子句,那么它前去的结局会议提供更注意的数据透视图。它可以凭据地位或时分遏制汇总。

    HAVING 子句常常与 GROUP BY 子句一同运用,从而检索出知足特定前提的组的结局。HAVING 子句可以包括一个或多个谓词,将组的某一属性与组的另一个属性或常量遏制比拟。比方:

    "SELECT sales_person, SUM(sales) AS total_sales FROM sales 
      GROUP BY sales_person 
      HAVING SUM(sales) > 25"
    


    这个语句前去贩卖总量跨越 25 的贩卖人员的列表。









    运用 INSERT 语句在表或视图中添加新的行

    INSERT 语句用来在表或视图中添加新的行。在视图中拔出一个新行也会在视图基于的表中拔出这一行。

    • 运用 VALUES 子句为一行或多行指定列数据。比方:
      INSERT INTO staff VALUES (1212,'Cerny',20,'Sales',3,90000.00,30000.00)
      INSERT INTO staff VALUES (1213,'Wolfrum',20,'Sales',2,90000.00,10000.00)
      


      上面的语句是等效的:
      INSERT INTO staff (id, name, dept, job, years, salary, comm)
        VALUES
        (1212,'Cerny',20,'Sales',3,90000.00,30000.00),
        (1213,'Wolfrum',20,'Sales',2,90000.00,10000.00)
      


    • 可以指定完全选择来标识出要从其他表或视图复制的数据。完全选择(fullselect) 是发作结局表的语句。比方:
      CREATE TABLE pers LIKE staff
      INSERT INTO pers
        SELECT id, name, dept, job, years, salary, comm
          FROM staff
          WHERE dept = 38
      











    运用 UPDATE 语句修正表或视图中的数据

    UPDATE 语句用来修正表或视图中的数据。颠末指定 WHERE 子句,可以修正知足前提的每一行的一个或多个列的值。比方:

    UPDATE staff
      SET dept = 51, salary = 70000
        WHERE id = 750
    


    上面的语句是等效的:

    UPDATE staff
      SET (dept, salary) = (51, 70000)
        WHERE id = 750
    


    假设没有指定 WHERE 子句,DB2 就会更新表或视图中的每一行!









    运用 DELETE 语句删除数据

    DELETE 语句用来从表中删除整行的数据。颠末指定 WHERE 子句,删除知足前提的每一行。比方:

    DELETE FROM staff
      WHERE id IN (1212, 1213)
    


    假设没有指定 WHERE 子句,DB2 就会删除表中的悉数行!









    运用 MERGE 语句将有前提更新、拔出或删除利用组合起来

    MERGE 语句运用来自源表的数据更新目的表或可更新视图。仅仅用一个利用,目的表中与源表娶亲的行就可以被更新或删除,目的表中不存在的行被拔出。

    比方,将 EMPLOYEE 表作为目的表,其中包括某至公司的人员的最新信息。分支办公室颠末维护本身的 EMPLOYEE 表版本 MY_EMP 来处理惩罚外埠人员记载的更新。可以运用 MERGE 语句用 MY_EMP 表(吞并利用的源表)中包括的信息来更新 EMPLOYEE 表。

    以下语句将编号为 000015 的新人员的行拔出 MY_EMP 表。

    INSERT INTO my_emp (empno, firstnme, midinit, lastname, workdept,
      phoneno, hiredate, job, edlevel, sex, birthdate, salary)
      VALUES ('000015', 'MARIO', 'M', 'MALFA', 'A00',
      '6669', '05/05/2000', 'ANALYST', 15, 'M', '04/02/1973', 59000.00)
    


    并收回以下语句更新 MY_EMP 表中现有人员 000010 的工资数据。
    INSERT INTO my_emp (empno, firstnme, midinit, lastname, edlevel, salary)
      VALUES ('000010', 'CHRISTINE', 'I', 'HAAS', 18, 66600.00)
    



    目下当今,拔出的数据只存在于 MY_EMP 表中,因为它还没有与 EMPLOYEE 表遏制吞并。上面的 MERGE 语句获取 MY_EMP 表的内容并将它们吞并到 EMPLOYEE 表中。

    MERGE INTO employee AS e
      USING (SELECT
       empno, firstnme, midinit, lastname, workdept, phoneno,
       hiredate, job, edlevel, sex, birthdate, salary
       FROM my_emp) AS m
      ON e.empno = m.empno
      WHEN MATCHED THEN
        UPDATE SET (salary) = (m.salary)
      WHEN NOT MATCHED THEN
        INSERT (empno, firstnme, midinit, lastname, workdept, phoneno,
         hiredate, job, edlevel, sex, birthdate, salary)
          VALUES (m.empno, m.firstnme, m.midinit, m.lastname,
           m.workdept, m.phoneno, m.hiredate, m.job, m.edlevel,
           m.sex, m.birthdate, m.salary)
    


    给源表和目的表都分配了关系称号,以制止搜刮前提中的表援用发作二义性。这个语句指定了 MY_EMP 表中应该思索的列。语句还指定当 MY_EMP 中的行在 EMPLOYEE 表中有娶亲时或没有娶亲时,应该采纳什么利用。

    目下当今,对 EMPLOYEE 表执行以下究诘会前去人员 000015 的记载:

    SELECT * FROM employee WHERE empno = '000015'
    


    以下究诘会前去人员 000010 的记载,其中 SALARY 列的值是更新后的值:
    SELECT * FROM employee WHERE empno = '000010'
    












    运用数据修正-表援用子句在一致个义务单位中取得中间结局集

    假定您想在一致个义务单位(UOW)中给人员 000220 加薪 7% 并检索她原来的工资。可以运用 数据修正-表援用 子句来完成,这个子句是 SQL 语句中 FROM 子句的一部门。

    SELECT salary FROM OLD TABLE (
      UPDATE employee SET salary = salary * 1.07
      WHERE empno = '000220'
    );
    SALARY
    -----------
       29840.00
      1 record(s) selected.
    


    数据修正利用(拔出、更新或删除)的目的中的列变成中间结局表中的列,可以在究诘的选择列表中按称号援用这些列(在这个示例中是 Salary)。环节字 OLD TABLE 指定中间结局表应该包括数据修正利用之前 的值。环节字 NEW TABLE 指定中间结局表应该包括数据修正利用之后 (在发作援用齐备性计较和触发利用后触发器之前)的值。环节字 FINAL TABLE 指定中间结局表应该包括数据修正利用、援用齐备性计较和触发利用后触发器之后的值。

    假定有一个 CUSTOMERS 表,其定义为:

    CREATE TABLE customers (
      cust_id INTEGER GENERATED ALWAYS AS IDENTITY (
       START WITH 10001
      ),
      cust_name VARCHAR(12),
      PRIMARY KEY (cust_id)
    );
    


    这个表的主键 Cust_ID 是自动生成的标识列。可以运用 数据修正-表援用 子句检索生成的标识列值,这个值用作顾客编号。
    SELECT * FROM FINAL TABLE (
      INSERT INTO customers (cust_name) VALUES ('Lamarr')
    );
    CUST_ID     CUST_NAME
    ----------- ------------
          10001 Lamarr
      1 record(s) selected.
    







    版权声明: 原创作品,许可转载,转载时请务必以超链接方式标明文章 原始出处 、作者信息和本声明。不然将追查法律责任。

  • 相关阅读:
    Java 链表
    知识点归列
    HTML和CSS必须知道的重点难点问题
    函数表达式
    javascript原型链
    canvas成长树
    checkbox选中问题
    使用vue-cli脚手架自定义iview主题
    AI学习吧-Redis操作-事务、订阅
    AI学习吧-REDIS-常识
  • 原文地址:https://www.cnblogs.com/zgqjymx/p/1972957.html
Copyright © 2011-2022 走看看