一、group by 和having 的使用
group by 通常用于查询语句的分组显示。
例如select home_city,t.user_id , count(1) from users t group by t.home_city,user_id;将users表中按home_city , user_id来分组,既一个表中有多个地市和用户ID组合的数据,只显示一个,和dinstinct功能类似,起到过滤相同数据的作用。
having和group by一起使用,作用类似where,为对group by 分组后的数据,进行条件过滤。having过滤条件字段必须存在select 之后的字段中,或select之后的聚合函数。例如:
select home_city,t.user_id , count(1) from users t group by t.home_city,user_id having home_city>590;
select home_city,t.user_id , count(1) from users t group by t.home_city,user_id having count(1) > 10;
二、存储过程
1.打印hellow world ! --打印结果在DBMS Output窗口中打印出来。后续只粘贴关键语法
declare
str varchar(100);
begin
-- Test statements here
select 'hello world' into str from dual;
dbms_output.put_line(str);
end;
如果是cmd窗口,或sql windows窗口执行,要先set serveroutput on;
2.变量(普通变量、特殊变量)
普通变量
直接赋值: v_name := 'zhangsan';
语句赋值: select 'zhagnsan' into v_address from dual;
引用型变量
v_age users.age%type;//表名.字段名%type;--不直接定义某种类型而是连接表字段的类型
记录型变量(效率不如引用型变量,因为只能select * into ...)
v_user_row users%rowtype;//直接定义成某表的所有字段类型
select * into v_user_row from users where user_id = 1003;
条件分支
if condition then
do
elsif condition then //elsif 这个和java的语句有点不同
do
else
do
end if;
while 循环
i := 10;
loop
dbms_output.put_line('i=' || i);
i := i -1;
exit when i < 1;
end loop;
游标
显示游标
执行顺序:声明游标 -> 打开游标 -> 循环输出游标 -> 关闭游标
declare
cursor user_cursor is( select * from users where rownum < 3);//声明并赋值
cursor user_cursor(v_home_city users.home_city%type) is( select * from users where home_city = v_home_city and rownum <= 3);//带参数的声明并赋值
begin
open user_cursor;//打开游标
open user_cursor(591);//有传参给游标的打开游标
loop
fetch user_cursor into v_user; //每次取一条数据
exit when user_cursor%notfound; //如果最近一次没取到数据,返回true
dbms_output.put_line('username:' || v_user.user_name || ', msisdn=' || v_user.msisdn);
end loop;
close user_cursor;
end;
游标注意事项:先取数据,然后在判断是否有取到一条数据;
隐示游标,既游标由oracle内部控制
for循环时,oracle内部控制游标进行打开并遍历、关闭游标
带参游标
create or replace procedure p_hello(v_id in users.user_id%type , v_name out users.user_name%type) is
begin
dbms_output.put_line('hello world' || v_name);
end p_hello;
创建时,输入参数,输出参数都有游标后面的括号里面体现,用in、out区别
调用存储过程
p_hello(1001,v_name);//传入1001,返回的user_name用v_name接受
truncate 删除表记录
和delete一样,是做表数据删除的操作,但是有所区别
1.不带where语句,只能做全表数据清空
//如果表有做分区,删除的刚好是某个分区的数据,可以使用alter table truncate partition '分区名' 来删除该分区的数据,不影响其 他分区
2.为DDL操作,无回滚操作
3.速度相对快很多
4.无对应的回滚备用日志等产生
5.重新设置高水平线和所有的索引,释放空数据块//delete删除数据,数据块的残留,会使得即使表数据被删除,下次查询还是会扫描到原来存数据的数据块,使得虽然表数据少了,查询速度并没有加快。
数据库锁表解决
1.查询对应锁表信息
select object_name as 对象名称,s.sid,s.serial#,p.spid as 系统进程号
from v$locked_object l , dba_objects o , v$session s , v$process p
where l.object_id=o.object_id and l.session_id=s.sid and s.paddr=p.addr;
2.手动结束锁表食物
alter system kill session 'sid,serial#';--sid及serial#为第一步查出来的数据。
---------------------
作者:榕先生
来源:CSDN
原文:https://blog.csdn.net/qq_41889752/article/details/86219498
版权声明:本文为博主原创文章,转载请附上博文链接!