常用SQL基础

来源:互联网 发布:调查问卷 代码java 编辑:程序博客网 时间:2024/06/13 11:58
一、5个核心SQL:select insert update delete merge
二、详解
     1、select语句
     Oracle基于查询成本的优化器(cost-based optimizer,CBO)用来产生实际的执行计划。

form 子句:列出了所查询数据的源对象。可以包含:表、视图、物化视图、分区或子分区,或建立一个子查询来生成子对象。
          其处理联接语句的时候顺序:(1)交叉联接,也称笛卡尔乘积;(2)内联结;(3)外联结;

where子句:按照条件来限制查询最终返回结果集的行数。当进行筛选的比较条件中包含空值的时候,将作为false来对待。where子句的目的是:限制或者减少结果集。需要返回的数据越多,执行查询的时间也就越长。

group by子句:将执行from和where子句后得到的经过筛选后的结果集进行聚合。可按照from子句中所列出的任何字段进行分组,即使并不想在输出结果列表中显示该列。相反,Select列表中的任何非聚合字段都必须包括在group by表达式中。
               还包含两个附加运算:rollup和cube。rollup用来产生部分求和值。cube运算用来求得交互分类值。

having子句:将分组汇总后的查询结果限定为只有该子句中的条件为真的数据行。本质上说,having子句是在group by子句执行后用来筛选汇总值的第二个where子句。

select custerm_id,c.cust_first_name||' '||c.cust_last_name ,
(select e.last_name from hr.employees e where e.employee_id = c.account_mgr_id) acct_mgr 
from oe.customers c;

标量子查询:查询必须只能返回一行一列的值。

order by子句:需要排序的数据量大小是非常重要的。可通过行数乘以每行的字节数来估计数据集的大小。
较小的排序会完全在内存中实现,而较大的排序将不得不使用临时磁盘空间来完成。一般来说,排序是查询过程中开销相当大的一个处理步骤,尤其是当返回结果集很大的时候。

2、Insert 语句
单表插入:
单行插入
insert into hr.jobs(job_id,job_title,min_salary,max_salary)
values('In_PM','Project Manager',50000,1199);

通过子查询来实现插入
insert into scott.bonue(ename,jog,sal)
select ename,job,sal * .10
from scott.emp;

多表插入:
insert all 
when sum_orders < 10000 then 
into small_customers
when sum_orders  >=10000 and sum_orders <100000 then
into medium_customers
else
into large_customers
select customer_id,sum(order_total) sum_orders
from oe.orders
group by customer_id;

注意insert all的使用。当指定了all这个语句就会执行无条件的多表插入。即:每一个when子句按照子查询所返回的每一行来确定值而不管前一个条件的输出结果是什么。因此,需要注意如何来指定每个条件。需要使用first选项来实现每一个when子句按照其出现在语句中的顺序经行评估,并且对于一个给定的子查询行跳过接下来的when子句评估。


3、Update语句

使用表达是更新一个单列的值:
update employee2
set salary = salary *1.10
where department = 90;

通过子查询更新一个单列的值:
update employees
set salary = (select employee2.salary from employee2 where employee2.employee_id = employees.employee_id and employees.salary != employee2.salary)
where department = 90;

通过在where子句中使用子查询确定要更新的数据行来更新单列的值
update employees 
set salary = salary*1.10
where department_id in (
select department_id from departments where department_name ='Executive'
);

通过使用select语句定义表及列的值来更新表
update (select e1.salary,e2.salary new_sal from employees e1,employees 2 where e1.employee_id = e2.emplayee_id and e1.department_id = 90)
set salary = new_sal;

通过子查询更新多列
update employees
set(salary,commission_pct) = (select employee2.salary,.10 comm_pct
from employee2 where employees2.employee_id = employees.employee_id
and employees.salary != employees2.salary)
where department_id = 90;

复制一张表:
create table emmployee2 as select * from employees;
增加约束:
add constraint emp2_emp_id_pk primary key(employee_id);


4、delete 语句
使用where子句中的筛选条件来从指定表中删除行
delete from employees2
where department_id = 90;

使用from子句中的子查询来删除行
delete from (select * from employees2 where department_id = 90);

使用where子句中的子查询来从指定表中删除行
delete from employees2 where department_id in(select department_id from departments where department_name = 'Executive');

5、merge语句
按条件获取要更新或插入到表中的数据行,然后从1个或多个源头对表进行更新或者向表中插入行两方面的能力。
常用语数据仓库中来移动大量的数据,但不限于数据仓库的使用。可以很方便的把多个操作结合成一个。

merge into dept60_bonuses b
using(
select employee_id,salary,department_id
from employees 
where department_id = 40) e
on(b.employee_id = e.employee_id)
when matched then
update set b.bonus_amt = e.salary *0.3
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)
原创粉丝点击