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 bUSING (
SELECT employee_id,salary,department_id
FROM employees
WHERE department_id = 60) e
ON (b.employee_id = e.employee_id)
WHEN MATCHED THEN
UPDATE SET b.bonus_amt = e.salary * 0.2 WHERE b.bonus_amt = 0
DELETE WHERE (e.salary > 7500)
WHEN NOT MATCHED THEN
INSERT (b.employee_id,b.bonus_amt)
VALUES(e.employee_id,e.salary*0.1)
WHERE (e.salary < 7500)

来自为知笔记(Wiz)

5个SQL核心

时间: 2024-11-05 02:04:24

5个SQL核心的相关文章

oracle sql 高级编程 历史笔记整理

20130909 周一 oracle sql 开发指南 第7章 高级查询 1.层次化查询select level,ttt.*,sys_connect_by_path(ttt.col1,',') from ttt start with .. Connect by prior -因为先建立树,再进行where过滤的.在where中过滤和在cooonect by中过滤是不一样的. 2.rollup cube高级查询 select grouping(col1) .. From ttt group by

一句SQL按照某个字段数值拆分出对应的数据条数,借助数据库常量表【master..spt_values】实现

简介:master..spt_values,数据行拆分简单小技巧 SELECT ProjGUID , CostGUID , SUM(FtAmount) AS FtAmount , BeginMonth , EndMonth , ( EndMonth - BeginMonth ) + 1 AS RowCountNum FROM cb_Loan2Cost WHERE LoanGUID = '6D88EB2B-18FA-4A4A-9ADB-9873B0F14381' GROUP BY ProjGUID

《精通Oracle SQL(第2版) 》

<精通Oracle SQL(第2版) > 基本信息 作者: (美)Karen Morton    Kerry Osborne    Robyn Sands    Riyaj ShamsudeenJared Still 译者: 朱浩波 丛书名: 图灵程序设计丛书 出版社:人民邮电出版社 ISBN:9787115351661 上架时间:2014-5-5 出版日期:2014 年5月 开本:16开 页码:1 版次:1-1 所属分类:计算机 > 数据库 > Oracle 更多关于>&g

优化SQL

1. 通过 show status和应用特点了解各种 SQL的执行频率 通过 SHOW STATUS 可以提供服务器状态信息,也可以使用 mysqladmin extende d-status 命令获得. SHOW STATUS 可以根据需要显示 session 级别的统计结果和 global级别的统计结果. 如显示当前session: SHOW STATUS like "Com_%"; 全局级别:show global status;       以下几个参数对 Myisam 和 I

第二篇:Spark SQL Catalyst源码分析之SqlParser

/** Spark SQL源码分析系列文章*/ Spark SQL的核心执行流程我们已经分析完毕,可以参见Spark SQL核心执行流程,下面我们来分析执行流程中各个核心组件的工作职责. 本文先从入口开始分析,即如何解析SQL文本生成逻辑计划的,主要设计的核心组件式SqlParser是一个SQL语言的解析器,用scala实现的Parser将解析的结果封装为Catalyst TreeNode ,关于Catalyst这个框架后续文章会介绍. 一.SQL Parser入口 Sql Parser 其实是

Java开发者写SQL时常犯的10个错误

首页 所有文章 资讯 Web 架构 基础技术 书籍 教程 我要投稿 更多频道 » - 导航条 - 首页 所有文章 资讯 Web 架构 基础技术 书籍 教程 我要投稿 更多频道 » - iOS - Python - Android - Web前端 Java开发者写SQL时常犯的10个错误 2015/03/10 | 分类: 基础技术 | 0 条评论 | 标签: SQL 分享到:0 本文由 ImportNew - zer0Black 翻译自 jooq.欢迎加入翻译小组.转载请见文末要求. 我十分惊讶的

Apache Flink SQL

本篇核心目标是让大家概要了解一个完整的 Apache Flink SQL Job 的组成部分,以及 Apache Flink SQL 所提供的核心算子的语义,最后会应用 TumbleWindow 编写一个 End-to-End 的页面访问的统计示例. 1.Apache Flink SQL Job 的组成 我们做任何数据计算都离不开读取原始数据,计算逻辑和写入计算结果数据三部分,当然基于 ApacheFlink SQL 编写的计算 Job 也离不开这个三部分,如下所所示: &lt;img src=

ORA-4031错误 解决方法

遇到ORA-4031错误时,你的心里会不会发怵?ORA-4031很容易导致数据库出现异常崩溃,当Oracle的核心进程无法获得共享池内存时,它们会把数据库异常宕掉.当然,ORA-4031就像黄灯一样,它在提醒你需要马上采取紧急策略了.不是说它一出现,数据库马上就会宕机. 话题讨论: 1.ORA-4031是Oracle中最令人厌恶的报错,它的出现有哪几种原因? 2.一旦出现4031错误,也就是说共享池内存不足的情况下,我们该如何释放内存呢?你有木有遇到过相应的情形呢?请回忆下当时是如何解决的? 3

oracle琐碎笔记

Oracle知识点 ps:由于是自己看的所以笔记比较乱,大家谅解 Commit rollback Sql核心语句之select Selct中要用到以下语句 From语句 Where语句 Group by语句 Group by 来进行分组,分组的参数如果有重复的,只返回一个行值.(比如我按id分组如果记录中有两个id为1的记录,这时候只返回一行) Having语句 将分组汇总后的查询结果限定为只有该子句的条件为真的数据行. 一般情况下having放在groupby后面执行. Order by语句