一个基本查询的逻辑过程:
(8) SELECT (9) DISTINCT (11) <TOP_specification> <select_list>
(1) FROM <left_table>
(3) <join_type> JOIN <right_table>
(2) ON <join_condition>
(4) WHERE <where_condition>
(5) GROUP BY <group_by_list>
(6) WITH {CUBE | ROLLUP}
(7) HAVING <having_condition>
(10) ORDER BY <order_by_list> --数字表示的是语句中部分的执行顺序。完全的结构语句如下列: SELECT DISTINCT top 5 FROM table1
left JOIN table2 ON (table1id=table2id)
WHERE table1id>10 GROUP BY table1id HAVING table1name like '张%'
ORDER BY name
select 公司,(case when grouping(部门) = 1 then ’公司合计' else '部门' end) as 部门,sum(工资)工资总额
from a
group by rollup(公司,部门)
;
上面这个,数据是先出(公司+部门)的组合的 key(得到该公司的每个部门的总和),最后出一个 公司 的总和(该公司所有部门总和)。
你也可以用
group by grouping sets(公司,部门)
得到公司的总和与部门的总和,这个略有不同,但可以通过不同的括号层次组合出你想要的,比如
group by grouping sets((公司,部门),公司,部门)
另外还有:
group by cube(公司,部门)
这个是算出每个公司的总和(不考虑哪个部门的),与每个部门的总和(不考虑哪家公司的),用 cube 汇总是用在多个公司相同的部门的时候,比如多个分公司都有财务部的话,如果你这个 DEPNO 在数据库中每家公司的每个部门都拥有完全不同的值的话就不适用。
OCP:Oracle数据库认证专家(Oracle Certified Professional)是Oracle公司的Oracle数据库DBA(Database Administrator 数据库管理员)认证课程,通过这个考试, 说明此人可以管理大型数据库, 或者能够开发可以部署到整个企业的强大应用。要成为OCP需要先获得OCA (Oracle数据库认证助理Oracle Certified Associate)的认证,目前主要是Oracle 11g版本认证。另外,12c OCP考试已经release,可以报考。 扩展资料 培训课程
Oracle Database 11g: SQL Fundamentals I(SQL基础 I 考试代号1Z0-071)
Oracle Database 11g: Administration Workshop I(管理课程练习 I 考试代号1Z0-052)
Oracle Database 11g: Administration Workshop II(管理课程练习 II 考试代号1Z0-053)
学习周期为2-3个月;理论课时120小时,可以免费重听;实验机时不限。
注意:通过OCP考试,必须取得经Oracle授权培训机构的OCP原厂培训记录,才能取得OCP证书。
附加:9i OCP—11g OCP:需通过1Z0-055考试;
10g OCP —11g OCP:需通过1Z0-050考试;
课程大纲
第一门课,Oracle Database 11g:SQL Fundamentals I 学习内容:
1.掌握关系数据库数据模型;
2.熟练在Linux平台上部署数据库系统;
3.根据业务需求定制各种类型的数据库;
4.掌握数据库中数据结构、数据类型的存储原理
5.熟练运用SQL语句检索、 *** 纵、管理数据库中的数据;
6.MEGER、USING、ROLLUP、CUBE、集合运算符、和分层提取等高级方法来提取数据;
7. 编写SQL脚本文件,从而生成类似报告的输出结果;
8.运用开发工具编写过程、函数、包、触发器等程序块;
9 学会查看数据字典
第二门课,Oracle Database 11g:Administrator I 学习内容:
了解Oracle核心组件Instance结构 掌握Oracle 数据库逻辑与物理存储结构 3管理ORACLE的实例、日志文件、控制文件、表空间、用户、权限、角色、表、索引、回滚段
4 Oracle Net Services网络配置,通过网络配置实现数据库的故障转移和负载均衡
4 配置应用程序数据库
5 使用基本监视过程
6 实施备份和恢复策略
7 在数据库和文件之间移动数据
第三门课,Oracle Database 11g:Administrator II学习内容:
1 创建一个能正常运行的数据库,以及如何以有效和高效的`方式来正确管理各种不同的结构,从而构造出一个设计良好、高效率运行的数据库
2 如何实施数据库安全
3 使用资源管理器管理资源、作业调度、安全性和全球化问题
4 根据业务需求,制定与完善数据库的备份、恢复、和RECOVER等策略
5 执行数据库备份、恢复策略的计划与实施等关键任务,以及如何进行正确性的验证
6 根据实际数据库的十几种不同的损坏原因,采用不同的恢复方式
7 熟练掌握Recovery Manager工具来执行备份、恢复、执行块修复
8 使用脚本在内存、性能和存储方面,进行数据库监视 *** 作
9 进行 *** 作系统级调优
10 进行SQL语句调优
11 通过使用多种不同的工具,确认、分析、和解决Oracle 数据库在运行过程中所存在的瓶颈
先将varchar2转换为clob再转换为blob。
>
希望能解决你的问题。
--准备数据create table a(bh number, sj date, sl number);
create table b(bh number, zj blob);
insert into a values(1001, sysdate, 30);
insert into a values(1002, sysdate, 31);
insert into a values(1001, sysdate, 32);
insert into a values(1003, sysdate, 34);
insert into a values(1003, sysdate, 35);
insert into a values(1004, sysdate, 36);
insert into a values(1004, sysdate, 38);
insert into a values(1005, sysdate, 23);
insert into a values(1005, sysdate, 30);
insert into a values(1006, sysdate, 35);
insert into a values(1006, sysdate, 30);
insert into a values(1001, sysdate, 30);
--这个方法不知道能否解决你这个4k限制的问题
create or replace procedure insert_b is
cursor a_cursor is select from a order by bh;
a_record a%rowtype;
temp_bh abh%type := 0;
temp_zj varchar2(32767);
begin
open a_cursor;
loop
fetch a_cursor into a_record;
--插入最后的一条记录
if a_cursor%notfound then
insert into b values(temp_bh, c2b(to_clob(temp_zj)));
exit;
end if;
if temp_bh != a_recordbh then
--插入上一条的记录值
if temp_bh != 0 then
insert into b values(temp_bh, c2b(to_clob(temp_zj)));
end if;
temp_bh := a_recordbh;
--temp_zj := concat(concat(concat(concat(concat(concat('编号:', a_recordbh), ',时间:'), to_char(a_recordsj, 'yyyy-mm-dd')), ',数量:'), a_recordsl), ';');
temp_zj := '编号:' || a_recordbh || ',时间:' || to_char(a_recordsj, 'yyyy-mm-dd') || ',数量:' || a_recordsl || ';';
elsif temp_bh = a_recordbh then
--temp_zj := concat(concat(concat(concat(concat(temp_zj, '时间:'), to_char(a_recordsj, 'yyyy-mm-dd')), ',数量:'), a_recordsl), ';');
temp_zj := temp_zj || '时间:' || to_char(a_recordsj, 'yyyy-mm-dd') || ',数量:' || a_recordsl || ';';
end if;
end loop;
close a_cursor;
end;
/
--了解了下listagg函数,这个比较简洁,不知道会不会出现你所说的4k限制问题。由你这个问题也让我学到了11g的新函数
create or replace procedure insert_b is
cursor a_cursor is
select bh,
'编号:' || bh || ',' ||
listagg('时间:' || to_char(sj, 'yyyy-mm-dd') || ',数量:' || sl,
';') within group(order by bh) || '。' as res
from a
group by bh;
v_bh number;
v_res varchar2(32767);
begin
open a_cursor;
loop
fetch a_cursor
into v_bh, v_res;
exit when a_cursor%notfound;
--insert into b values (v_bh, c2b(to_clob(v_res)));
insert into b values(v_bh, to_blob(rawtohex(v_res)));
end loop;
close a_cursor;
end;
/
--更新数据
begin
insert_b;
end;
/
--查询结果
select bh, to_char(b2c(zj)) from b;
--将clob类型转换为blob类型(二进制转换)
create or replace function c2b(src clob default empty_clob()) return blob is
dest blob;
src_len number := dbms_lobgetlength(src);
dest_offset number := 1;
src_offset number := 1;
amount_c integer := dbms_loblobmaxsize;
blob_csid number := dbms_lobdefault_csid;
lang_ctx integer := dbms_lobdefault_lang_ctx;
warning integer;
begin
if src_len > 0 then
--将dest建立在用户的临时表空间中,true表示将dest读到缓冲区。此处相当于初始化dest
dbms_lobcreatetemporary(dest, true);
--以readwrite模式打开dest
dbms_lobopen(dest, dbms_loblob_readwrite);
--读取src,转换字符数据为特定字符集格式,并将转换后的数据写入dest中
dbms_lobconverttoblob(dest, --目标blob
src, --源clob
amount_c, --指定要转换的字节数
dest_offset, --指定目标lob的偏移位置(字节或字符)
src_offset, --指定源lob的偏移位置(字节或字符)
blob_csid, --指定字符集标识号
lang_ctx, --指定语言上下文
warning); --存放警告信息
else
select empty_blob() into dest from dual;
end if;
return dest;
end c2b;
/
--将blob类型转换为clob类型
--varchar2类型可直接转换为clob类型
create or replace function b2c(src blob) return clob is
dest varchar2(32767);
temp varchar2(32767);
v_start pls_integer := 1;
v_buffer pls_integer := 4000;
begin
if dbms_lobgetlength(src) is null then
return '';
end if;
dest := '';
for i in 1ceil(dbms_lobgetlength(src) / v_buffer) loop
--当转换出来的字符串乱码时,可尝试使用注释掉的函数
--temp := utl_rawcast_to_varchar2(utl_rawconvert(dbms_lobsubstr(src, v_buffer, v_start), 'SIMPLIFIED CHINESE_CHINAZHS16GBK', 'AMERICAN_THE NETHERLANDSUTF8'));
temp := utl_rawcast_to_varchar2(dbms_lobsubstr(src, v_buffer, v_start));
dest := dest || temp;
v_start := v_start + v_buffer;
end loop;
return dest;
end b2c;
/
对于查询处理,可将其分为逻辑查询处理和物理查询处理。逻辑查询处理表示执行查询应该产生什么样的结果,而物理查询代表MySQL数据库是如何得到结果的。
逻辑查询处理
MySQL真正的执行顺序如下:
(8)SELECT (9)DISTINCT<select_list>
(1)FROM <left_table>
(3)<join_type>JOIN<right_table>
(2) ON <join_condition>
(4)WHERE <where_condition>
(5)GROUP BY <group_by_list>
(6)WITH {CUBE|ROLLUP}
(7)HAVING<having_condition>
(10)ORDER BY<order_by_list>
(11)LIMIT <limit_number>
FORM:对FORM子句中的左表< left_table > 和右表 < right_table >执行笛卡儿积,产生虚拟表VT1。
ON:对虚拟表VT1应用ON筛选,只有那些符合< join_condition >的行才被插入到虚拟表VT2中。
JOIN:如果指定了OUTER JOIN,那么保留表中未匹配的行作为外部行添加到虚拟表VT2中,产生虚拟表VT3。如果FROM字句包含两个以上表,则对上一个连接生成的结果表VT3和下一个表重复执行步骤1~步骤3,直到处理完所有的表为止。
WHERE:对虚拟表VT3应用WHERE过滤条件,只有符合< where_condition >的记录才被插入到虚拟表VT4中。
GROUP BY:根据GROUP BY子句中的列,对VT4中的记录进行分组 *** 作,产生虚拟表VT5
CUBE|ROLLUP:对虚拟表VT5进行 CUBE或ROLLUP,产生VT6
HAVING:对虚拟表VT6应用HAVING过滤器,只有符合< having_condition >的记录才能被插入虚拟表VT7
SELECT:第二次执行SELECT *** 作,选择指定的咧,插入到虚拟表VT8。
DISTINCT:去除重复数据,产生虚拟表VT9。
ORDER BY:将虚拟表VT9中的记录按照< order_by_list >进行排序 *** 作,产生虚拟表VT10。
LIMIT:取出指定行的记录,产生虚拟表VT11,并返回给查询用户。
物理查询处理
上面是逻辑查询处理,但是数据库也许并不会按照逻辑查询处理的方式进行查询。MySQL数据库层有Parser和Optimizer两个组件。Parser的工作就是分析SQL语句,而Optimizer的工作就是对这个SQL语句进行优化,选择一条最优的路径来选取数据,但是必须保证物理查询处理的最终结果和逻辑查询处理的结果是相等的。
如果表上建有索引,那么优化器就会判断SQL语句是否可以利用该索引来进行优化。如果没有可以利用的索引,可能整个SQL语句的执行代价非常大。
假设表A和表B都是有10万行数据,并且两个表都没有索引,因此最终SQL解析器解析的执行结果为逻辑处理的步骤,共经过11个步骤来进行数据的查询。最终根据笛卡尔积生成一张虚表VT1,共100亿行数据,执行这条SQL语句一般的电脑至少得跑一个多小时。
然而,如果这时候表B上添加一个主键值,在执行这条SQL语句,那么只需话费1秒。促使这个查询时间大幅减少的原因就是添加索引后避免了笛卡儿积表的产生。
物理查询会根据索引来进行优化。
oracle 数据库:
排序使用分析函数 : row_number() OVER ()
SELECT
row_number() OVER (partition BY ttrandate ORDER BY ttranamt) "NO",
ttrandate,
nvl(ttranamt,'小计'),
DECODE( COUNT(),'1','', COUNT()) "计数",
decode(SUM(to_number(ttranamt)),to_number(ttranamt),'',SUM(to_number(ttranamt)))"小计"
FROM testtable t GROUP BY rollup (trandate,tranamt) ;
最大值(数量或大小)对象SQLServer7
0SQLServer2000批处理大小65,536网络数据包大小165,536网络数据包大小1每个短字符串列的字节数8,0008,000每个text、ntext、或image列的字节数2最大值(数量或大小)对象SQLServer7
0SQLServer2000批处理大小65,536网络数据包大小165,536网络数据包大小1每个短字符串列的字节数8,0008,000每个text、ntext、或image列的字节数2GB-22GB-2每个GROUPBY、ORDERBY的字节数8,060每个索引中的字节数9009002每个外键的字节数900900每个主键的字节数900900每行字节数8,0608,060存储过程源文本中的字节数批处理大小之较小者或者250MB批处理大小之较小者或者250MB每个数据表的聚集索引数11GROUPBY、ORDERBY中的列数只受字节数限制GROUPBYWITHCUBE或WITHROLLUP语句中的列数或表达式数目10每个索引的列数1616每个外键的列数1616每个主键的列数1616每个基础数据表的列数1,0241,024每个SELECT语句的列数4,0964,096每个INSERT语句的列数1,0241,024每个客户端的连接个数已配置连接的最大值已配置连接的最大值数据库大小1,048,516TB31,048,516TB3每个SQLServer实例的数据库个数32,76732,767每个数据库的文件组个数256256每个数据库的文件个数32,76732,767文件大小(数据)32TB32TB文件大小(日志)4TB32TB每个数据表的外键表引用253253标识符长度(以字符计)128128每台计算机的实例数暂缺16包含SQL语句的字符串长度(批处理大小)65,536网络数据包大小165,536网络数据包大小1每个连接的锁数每个服务器的最大锁数每个服务器的最大锁数每个SQLServer实例的锁数2,147,483,647(静态)SQLServer40%的内存(动态)2,147,483,647(静态)SQLServer40%的内存(动态)嵌套存储过程层数3232嵌套子查询3232嵌套触发器层数3232每个数据表的非聚集索引个数249249SQLServer实例中同时打开的对象个数42,147,483,647(或可用内存)2,147,483,647(或可用内存)每个数据库中的对象个数2,147,483,64742,147,483,6474每个存储过程的参数个数1,0241,024每个数据表的REFERENCE个数253253每个数据表的行数受可用存储资源限制受可用存储资源限制每个数据库的数据表个数受数据库中的对象个数限制4受数据库中的对象个数限制4每个SELECT语句的数据表个数256256每个数据表的触发器个数受数据库中的对象个数限制4受数据库中的对象个数限制4每个数据表的UNIQUE索引个数或约束个数249个非聚集索引和1个聚集索引249个非聚集索引和1个聚集索引1
网络数据包大小是表格格式数据方案(TDS)数据包的大小,该数据包用于应用程序和关系数据库引擎之间的通讯
默认的数据包大小为4KB,由networkpacketsize配置选项控制
2
在SQLServer2000中,任何键的最大字节数不能超过900
可以使用可变长度的列来定义键,只要在这种列中不插入数据超过900字节的行,其最大大小就可以在900以上
有关更多信息,请参见索引键的最大值
3
当使用SQLServer2000DesktopEngine或Microsoft数据引擎(MSDE)1
0时,数据库的大小不能超过2GB
4
数据库对象包括所有的表、视图、存储过程、扩展存储过程、触发器、规则、默认值及约束
以上就是关于数据库中查询语句的完整格式是什么再举个例子说明一下~全部的内容,包括:数据库中查询语句的完整格式是什么再举个例子说明一下~、Oracle数据库分类汇总方法、ocp是什么意思等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)