多表查询:
会出现笛卡尔积,为了避免出现笛卡尔积,要使用where 语句对字段进行关联操作
左右连接
(+)在=左边表示右连接,(+)在= 右边表示左连接
select e.name ,e.id,m.name,m.id from emp e,emp m where e.id = m.id(+);
交叉连接 cross join 产生笛卡尔积
left join 和right join
natural join
自然连接,自动进行关联字段的匹配
select * from emp e natural join dept;
using
可以使用using关键字来简化连接查询,但是只是在查询满足下面两个条件时,才能使用using关键字进行简化。
1.查询必须是等值连接。
2.等值连接中的列必须具有相同的名称和数据类型。
select * from emp e join dept d using(deptno);
on
用户自己编写连接的条件 select * from emp e join dept d on (e.deptno = d.deptno);
组函数及分组计算
count()查询所有的记录数
max() min()最大,最小值
sum()求和
avg()平均值
select deptno, count(empno ) from emp group by deptno;
一、 如果程序中使用了分组函数,则有两种可以使用的情况:
1、程序中使用了group by ,并指定了分组条件,这样可以将分组条件一起查询出来。
2、如果不使用分组的话,则只能单独的使用分组函数。
二、 在使用分组函数的时候,不能出现分组函数和分组条件之外的字段
where 语句中不能使用分组函数 ,下面这句话是错误的
select deptno , avg(sal) from emp where avg(sal)>2000 group by deptno ;
正确的写法是:select deptno , avg(sal) from emp group by deptno having avg(sal)>2000
使用分组的情况:只有在某一列上存在重复的数据才有可能使用到分组;
注意:
分组函数可以嵌套使用,但是在分组函数嵌套使用的时候,不能再出现分组条件的查询语句
错误的语句: select deptno , max(avg(sal)) from emp group by deptno;
正确的语句: select max(avg(sal)) from emp group by deptno;
子查询
select * from emp where sal >(select sal from emp where empno=74);
子查询必须在()中包括
子查询在操作中分为三类:
1、单列子查询,返回的结果是一列的一个
2、单行子查询,返回多个列,有可能是一条完整的记录
3、多行子查询,返回多条记录
在子查询中存在三种符号:
in 指定查询的范围
select * from emp where sal in (select min(sal) from emp group by deptno );
any
=any 的时候,与in 的功能完全一样
>any 比最小的值要大 all >all比最大的值要大, 主键约束(primary key ): 表示唯一标识,不可为空 创建主键 create table user ( id varchar(32) primary key; name varchar(25), ) 也可以这样设置: create table user ( id varchar(32), name varchar(25), constraint user_id_pk primary key (id) ); 唯一约束: 在一个表中,只允许建立一个主键约束,其他列如果不希望出现重复值,就可以使用 唯一约束。 constraint user_name_uk unique(name); create table user ( name varchar(25) unique); 检查约束(check):检查一个列的内容是否合法 非空约束: not null 外键约束 (foreign key): 注意: 1、在子表中设置的外键在主表中必须是主键, 2、删除时,应该先删除字表中的数据,然后删除父表数据 修改约束: alter table 表名称 add constraint 约束名称 约束类型 (约束字段) alter table 表名称 drop constraint 约束名 封装了复杂的查询语句 create view 视图名 as 子查询 drop view 视图名 修改视图 create or replace view 视图名 as 子查询 注意: 1、为了避免创建视图的条件更改之后,导致视图查询失效,可以在创建视图的时候加入条件 create view 视图名 as 子查询 with check option 2、为了避免在视图 对主表进行修改 ,在创建视图的时候要添加 条件 with read only 序列创建完成之后,所有的自动增长应该由用户自己处理,所以在序列中提供了一下两种操作: nextval 取得序列的下一个值 currval 获取序列的当前值 创建序列 create sequence 序列名; 修改序列增长幅度 increment by 长度 指定序列的开始位置 start with 数字 创建序列,并指定序列在1,3,5,7,9中循环取值 create sequece 序列名 maxvalue 10 increment by 2 cycle; create synonym 同义词名称 for 用户名.表名称(例如:dual) 创建用户:create user 用户名 identified by 密码; 授权:grant connect resource to 用户名; 让用户密码失效:alter user 用户名 password expire; 锁住用户: alter user 用户名 account lock; 解锁用户:alter user 用户名 account unlock; 将 scott用户下的某张表的权限分配给另一个用户: grant delete ,select on scott.emp to 用户名; 回收权限: revoke 权限 on 用户名.表名称 from 用户; 备份: exp 导入:imp 1、建立嵌套表的前提是指定类型: create type project_ty as object( id number(4) , name varchar(25) );/ 2、类型创建完成之后,并不意味着这个类型可以使用,因为此类型是一个完整的类型,还需指定一个名称。 create type project_nt as table of project_ty ; / 这样以后直接使用project_nt 表示project_ty 类型,就类似 varchar2表示字符串。 3、开始制定嵌套表 create table department( departId number(4) primary key , name varchar2(20), project project_nt )nested table project store as project_nt_emp ; insert into department( '1','技术部' project_nt( project_ty ('1','qq项目'), project_ty ('2','微信项目') ) ); select * from table(select project from department from where departId =1); update table(select project from department where departId =1) pro set value (pro) = (project_ty ('001','战狼项目')) where pro.id=1; 创建过程与嵌套表类似,不同点在于第二步 create type project_nt as varry(10) of project_ty ;/ 1、用法: declare cursor c is select * from emp ; begin for v_emp in c loop dbms.output.putline(v_emp.name ) end loop; end; 2、 declare cursor c is select * from emp for update ; begin for v_emp in c loop if elseif update emp set sal =sal/2 where current of c; end if; end loop; commit; end; 1、创建存储过程: create or replace procedure p is cursor c is select * from emp for update ; begin for v_emp in c loop if2000> then update emp set sal = sal *2 where current of c; elseif then update emp set sal =sal/2 where current of c; end if; end loop; commit; end; 2、执行存储过程 exec p; 创建过程: is begin if b> then c:=a; else c := b; end if ; c:=d+1; end ; 使用过程: declare a number :=1; b number :=2; c number ; d number := 5; begin p ; dbms_output.put_line(c); end create or replace function func return number; is begin return 0.3; else return 0.4; end if return 0.6; end; create or replace trigger trig after update or delete or insert on emp for each row begin if inserting then insert into log values ('user','do something','date'); end if ; end; 树状帖子表 create table article ( id number primary key, content varchar(4000), pid number, alevel number;// 0 代表非叶子节点,1代表叶子节点 vlevel number , //代表层级,表示它属于第几层 ); 创建递归过程显示帖子结构: create or replace procedure p( id article.id%type ,vlevel binary_integer) is cursor c is select article where id = id ; preStr varchar(1000) := ''; begin for i in 0..vlevel loop preStr := preStr || '------'; end loop; for temp in c loop dbms_output_putline(preStr || temp.content); if (temp.alevel = 0) then p(temp.id,temp.vlevel); end if; end loop; end;约束
视图
序列
同义词
用户管理
数据库的备份与恢复
嵌套表
注意这个“/”不能省略
插入值
查询
更新
可变数组
游标
update emp set sal = sal *2 where current of c;
存储过程
包含参数的存储过程
函数
触发器
递归存储过程