zoukankan      html  css  js  c++  java
  • 5个SQL核心

    5个核心的SQL语句

    1.SELECT

    查询语句的逻辑处理顺序
    5     SELECT <columnlist>
    1     FROM <source objectlist>
    1.1   FROM <left source object><join type>
        JOIN <right source object>ON <on predicates(谓词,判断)>
    2     WHERE <wherepredicates>
    3    GROUP BY <group byexpression(s)>
    4    HAVING <having predicates>
    6    ORDER BY <order by list>
    -FROM子句:
        处理联结语句的顺序
    1、交叉联结,也称笛卡尔积;
    2、内联结;
    3、外联结。
    -GROUP BY子句
    将执行FROM和WHERE后得到的经过筛选后的结果集进行聚合。结果集按照GROUPBY子句列出的表达式进行分组,来为每一个分组得出一行汇总结果。
    可按照FROM子句中所列出对象的任意字段进行分组,即使并不在结果中显示该列。但SELECT子句列表中的任何非聚合字段都必须包含在GROUPBY表达式中。 
    GROUPBY还可包含两个附加运算:ROLLUP,CUBE。ROLLUP产生部分求和值,CUBE求得交互分类值。
    -HAVING子句
       HAVING子句将分组汇总后的查询结果限定为只有该子句中的条件为真的数据行。它和GROUP BY位置可互换,但逻辑上是GROUPBY子句先执行。本质上看,HAVING子句是在GROUPBY子句执行后用来筛选汇总值的第二个WHERE语句。对结果集过滤。
        *HAVING子句后只能接分组运算限定条件
    -SELECT列表
       列出查询的返回最终结果集中需要显示哪些列。可以是数据表中的一个实际列、一个表达式,甚至是一个SELECT语句的结果。
        eg:selectc.customer_id,c.customer_first_name||''||c.customer_last_name,(select e.last_name from hr.employees ewhere e.employee_id = c.account_mgr_id)
    -ORDER BY子句
        用来对最终结果集排序。
       需要估计需要排序的数据量大小。太大时会使用临时磁盘空间来完成排序。

    2.INSERT语句
    -单表插入
        insert intohr.jobs(job_id,job_title,min_salary,max_salary)
        values('IT_PM','ProjectManager',5000,11000);
        --增加10%的分红
        insert into scott.bonus(ename,job,sal)
        select ename,job,sal * .10
        from scott.emp;
    -多表插入
        下面例子阐明了一个子程序返回的数据行是如何被用来插入多个表中的。从3个表开始:small_customers、medium_customers、large_customers。按照每位消费者所下订单的总金额(order_total)来将数据分别插入这些表。
    INSERT ALL
    WHEN sum_orders < 10000 THEN
    INTO small_customers
    WHEN sum_orders >=   10000 AND sum_orders <100000THEN
    INTO medium_customers
    ELSE
    INTO large_customers
    SELECT customer_id,SUM(order_total) sum_orders
    FROM orders
    GROUP BY customer_id;

    3.UPDATE语句

    UPDATE tablename SET columnname=value WHEREpredicates
    -使用表达式更新一个单列的值
        UPDATE employee
        SET sal = sal * .10 --increase salary by10%
       WHEREdepartment_id=90;
    -通过子查询更新一个单列的值
        UPDATE employee
        SET sal=(SELECT employee2.salary
                       FROM employee2
                       WHERE employee2.employee_id=employee.employee_id
                       AND employee.salary != employee2.salary)
        WHERE department_id=90;
    -通过在WHERE子句中使用子查询确定要更新的数据行来更新单列的值。
        UPDATE employee
        SET salary=salary* .10
        WHERE department_id IN (SELECTdepartment_id
                                                   FROM departments
                                                   WHERE department_name='Excutive');
    -通过使用SELECT 语句定义及列的值来更新表
    UPDATE (SELECT e1.salary,e2.salary new_sal
    FROM employees e1,employees2 e2
    WHERE e1.employee_id=e2.employee_id
    AND e1.department_id=90)
    SET salary = new_sal;
    -通过子查询更新多列。
    UPDATE employees
    SET (salary,commission_pct) = (SELECT employees2.salary, .10comm_pct
      FROM employees2
       WHEREemployee2.employee_id=employees.employee_id
        AND employees.salary != employees2.salary)  -- 一行兩列
    WHERE department_id=90;

    4.DELETE语句


    DELETE FROM tablename WHERE predicates
    -1.使用WHERE子句中的筛选条件来指定表中的删除行。
    DELETE FROM employees2
    WHERE department_id = 90;
    -2.使用FROM子句中的子查询来删除行。
    DELETE FROM (SELECT * FROM employees2 WHERE department_id =90);
    -3.使用WHERE子句中的子查询来指定从表中删除的行。
    DELETE FROM employees2
    WHERE department_id IN (SELECT department_id
         FROM departments
          WHERE department_name ='Excutive');

    5.MERGE语句

        该语句具有按条件获取要更新或插入到表中的数据行,然后从1个或多个源头对表进行更新或向表中插入行两方面的能力。常被用在数据仓库中来移动大量的数据。这个操作一个很大的附加值在于你可以很方便地把多个操作结合成一个。
    -基本语法
    MERGE <hint>
    INTO <tablename>
    USING <table_view_or_query>
    ON (<condition>)
    WHEN MATCHED THEN <update_clause>
    DELETE <where_clause>
    WHEN NOT MATCHED THEN <insert_clause>
    [LOG ERRORS <long_errors_clause> <reject limit<integer | unlimited>];
    -例子
    MERGE INTO dept60_bonus b
    USING (
    SELECT employee_id,salary,department_id
    FROM employees
    WHERE department_id = 60) e
    ON (b.employee_id = e.employee_id)
    WHEN MATCHEDTHEN
    UPDATE SETb.bonus_amt = e.salary * 0.2 WHERE b.bonus_amt = 0
    DELETE WHERE(e.salary > 7500)
    WHEN NOT MATCHEDTHEN
    INSERT(b.employee_id,b.bonus_amt)
    VALUES(e.employee_id,e.salary*0.1)
    WHERE (e.salary< 7500)





  • 相关阅读:
    WPF 使用 Direct2D1 画图 绘制基本图形
    WPF 使用 Direct2D1 画图 绘制基本图形
    dot net core 使用 IPC 进程通信
    dot net core 使用 IPC 进程通信
    win2d 图片水印
    win2d 图片水印
    Java实现 LeetCode 240 搜索二维矩阵 II(二)
    PHP closedir() 函数
    PHP chroot() 函数
    PHP chdir() 函数
  • 原文地址:https://www.cnblogs.com/shadowwalker/p/3554994.html
Copyright © 2011-2022 走看看