一.DQL数据查询
1.1 基本select语句
三种方式别名 select a.empno as id,a.ename username,a.hiredate "My Hirdate" from emp a;
拼sql 需求:查询emp表,用户的工作 select b.ename|| q'\ 's job is: \' || b.job from emp b 使用引用符 q'\??????\'
1.2.函数类型
a.字符函数
需求:用户名大写、小写、首字母大写 select upper(a.ename),lower(a.ename),initcap(a.ename) from emp a
b.数字函数
--需求:四舍五入、取模、截取 select round(45.456,2) from dual --四舍五入 select trunc(5.456,2) from dual --截取位数 select mod(1600,300) from dual --取余数
c.日期函数
alter session set nls_date_format ='YYYY-MM-DD'; select sysdate,trunc(sysdate,'mm') from dual;
d.转换函数
字符转日期: select to_date('19810101','yyyymmdd') from dual; 数字转字符串: select to_char(sal,'$9,999.00') from emp;
1.3 过滤和排序
1.基本语法 a.where子句中不能出现列的别名 b.order by放最后 c.字符串和日期需要用单引号 2 数据库默认日期格式 SYS@PROD> alter session set nls_date_format='yyyy/mm/dd hh24:mi:ss'; 3.where过滤条件 = > < != betweeen 1 and 20 in like: %(多个) _(单个) is null或者is not null 4 order by 子句 5.like:模糊匹配 %:1个或多个字符;_:1个字符;escape:指定转义符 select * from emp where ename like '%$_%' escape '$';
1.4 分组函数
类型:avg\max\min\sum\count 需求:查询emp表销售人员工资的平均值,最大值、最小、工资总和 select avg(a.sal),max(a.sal),min(a.sal),sum(a.sal) from emp a --group by 需求:查询各个部门平均工资 select a.deptno,avg(a.sal) from emp a group by a.deptno --having排除 查询部门最高工资大于2900的部门? select a.deptno,max(a.sal) from emp a group by a.deptno having max(a.sal) >2900
1.5 多表查询
5.1 内连接(等值) 需求:统计每个部门的部门和名称 select a.deptno,b.dname from emp a,dept b where a.deptno = b.deptno 5.2 外连接 a.左连接 需求:统计每个员工所有部门信息? select * from dept m,emp n where m.deptno = n.deptno(+) b.右外连接 需求:统计部门的员工信息 select * from emp m,dept n where m.deptno = n.deptno(+) c.全外连接 select n.*,m.* from dept m,emp n where m.deptno = n.deptno(+) union select m.*,n.* from emp m,dept n where m.deptno = n.deptno(+) select * from emp m full outer join dept n on (n.deptno= n.deptno)
1.6 子查询
需求:查询emp表谁的工资最少的员工 select * from emp b where b.sal = (select min(a.sal) from emp a) 需求:查询工资比各个部门平均工资都高的员工 select * from emp m where m.sal > all ( select avg(a.sal) from emp a group by a.deptno) > all :大于最大值 < all:小于最小值 !=all :not in < any:小于最大值 > any: 大于最小值 = any:in
二、DML数据操纵
2.1 insert语句
##案例1 向表dept中插入两行数据 insert into dept values(50,'IT','beijing'); ##案例2 向emp表插入指定列的数据 insert into emp(empno,ename,job,hiredate,sal) values(1008,'jem','it',sysdate,2300); --创建表 create table emp1 as select * from emp where 1=2; insert into emp1 select * from emp t where t.empno =1008;
2.2 update语句
##案例1 把emp表7782员工从10号部门调到20号部门 update emp t set t.deptno = 20 where t.empno =7782; ##案例2(多列子查询) 修改emp表7698号员工的职位和部门号与7499一样 update emp t set(t.job,t.deptno) = (select a.job,a.deptno from emp a where a.empno=7499) where t.empno =7698; ##更新空值 update emp set job=null; update emp set job ='';
2.3 delet语句
##案例1 删除dept表部门号为50,60的数据 delete from dept w where w.deptno in (50,60);
2.4 Merge语句
#案例1 merge into test1 t1 using test2 t2 on(t1.deptno=t2.deptno) when matched then update set t1.dname=t2.dname,t1.loc=t2.loc when not matched then insert(deptno,dname,loc) values(t2.deptno,t2.dname,t2.loc); 注解:条件满足更新,不满足时候是插入
三、DCL数据控制
3.1 用户登陆
密码验证方式 sqlplus scott/tiger conn scott/tiger OS认证的方式:sqlplus / as sysdba
3.2. 创建用户
##创建用户damon create user damon identified by damon; ##给用户解锁 select USERNAME,ACCOUNT_STATUS from dba_users; alter user hr identified by hr account unlock;
3.3. 系统权限
系统权限都把包括: create session; create table; create sequence; create view; create procedure; ##新建的用户如何赋予向系统权限 创建角色,把权限给角色,再把角色赋予用户 SYS@PROD> create role manger; SYS@PROD> grant create session to manger; SYS@PROD> grant manger to damon; ##赋予系统默认的角色(保证使用数据最基本的一些功能) SQL> select * from role_sys_privs where role in ('CONNECT','RESOURCE'); SYS@PROD> grant connect,resource to damon;
3.4. 对象权限
SYS@PROD> grant select on scott.emp to DAMON;
3.5. 权限数据字典
select * from role_sys_privs; select * from user_tab_privs_recd; select * from user_sys_privs;
四、DDL数据定义
4.1 创建表
用户要建表,需要有 create table 权限,有存储空间(表空间) 一张表中最多有 1000 个列 create table test ( dname varchar2(14), col1 number, col2 date default sysdate ); create table DEPT01 AS select * from scott.dept --复制表
4.2 数据类型
#字符 char(n) 固定长度字符数据,读取效率快,存储时使用空格填满空白内容。 --n 默认值 1,范围 1~2000 字节。 varchar2(n) 可变长度字符数据,节省存储空间。 --n 必须指定,范围 1~4000 字节。 #数字 number(p,s) 数值数据,包括零、负数、正数。 --p 是 precision 精度,总有效数据位数,最大值是 38,默认是 1; --s 是 scale 刻度,小数点后位数; #日期 date 日期和时间值,包括世纪、年、月、日、小时、分、秒,必须指定年、月、日 timestamp(n):时间戳,表示日期和时间,比 date 更精准 --n 表示秒向下划分的精度范围, n 取值 0~9,默认 6 select systimestamp from dual; #大对象 BLOB:Binary Large Object (二进制大对象),例如图片、视频、音频。 CLOB:Character Large Object(字符型大对象),例如文本
4.3 修改表
#添加一个新列 为 dept01 表新增加一列 job ,类型 varchar2(9) alter table dept01 add (job varchar2(9)); #修改现有的列的长度 alter table dept01 modify (ename varchar2(15)); #新的列定义默认值 alter table dept01 modify (ename varchar2(20) default 'jem'); #删除一列 删除列job alter table dept01 drop column job; 生产中建议使用以下命令: 设置列不可用:alter table dept_bak SET UNUSED (LOC); 删除不可用的列:alter table dept_bak drop unused columns; #重命名列 重命名列deptno为ID alter table dept01 rename column deptno to id; #将表更改为只读状态(备份时用) alter table dept01 read only; alter table dept01 read write;
4.4 约束
常用的约束 非空(not null)、唯一(unique)、主键(primary key)、外键(foreign key)、检查(check) #增加非空约束(emp1表empno) alter table emp1 modify empno not null; #增加主键(emp1表empno) 唯一+非空 alter table emp1 add primary key (EMPNO); #外键 为emp表增加一个外键约束,保证员工不能安排到一个不存在于dep中的部门 create table emp as select * from scott.emp; create table dept as select * from scott.dept; 满足条件: 基表的字段必须是主键 alter table dept add primary key (deptno); alter table emp add constraint fk_emp_deptno foreign key (deptno) references dept(deptno) 测试数据 insert into emp(empno,deptno) values(1008,40)
4.4.视图
#创建简单视图 create or replace view emp_view as select empno,ename,job from emp1 select * from emp_view --查看视图sql文本 select d.view_name, d.text from user_views d where d.view_name = 'EMP_VIEW' #静态数据字典 select * from dba_users; select * from dba_tables; select * from dba_tab_cols where table_name='EMP1'; DBA_ :数据库拥有的所有对象(dba权限) ALL_:用户拥有及可以操作其他用户的记录 USER_:用户拥有的对象 #动态性能视图: select * from v$sql; select * from v$session;
4.5 索引
目的是加快Oracle查询的速度,数据自动维护,以空间换时间 ```bash #唯一索引 create unique index emp1_idx on emp1(ename); #非唯一索引 create index emp1_idx on emp1(ename); #创建函数索引 create index fun_emp1_job on emp1(lower(job)); #删除索引 drop index fun_emp1_job;
4.6 序列
可共享,不同的用户可共同调用,如果Number型号,可以按照顺序产生 #如何创建序列 create sequence dept_seq increment by 1 start with 100 maxvalue 9999999 nocache nocycle; --nocache:不往内存缓存 --nocycle到最大值后从1请开始 ---cycle:可以指定4 select * from user_sequences d where d.sequence_name ='DEPT_SEQ' ##生成序列号 select DEPT_SEQ.Nextval from dual
4.7 同义词
Oracle当中,表名比较长,或者某个用户表经常被访问,简化对象的访问,可以创建同义词 public:共有同义词,只要有权限的用户都可以访问 私有同义词:只能自己访问
SYS@PROD> show user USER is "SYS" ##授权用户创建同义词的权限 SYS@PROD> grant create public synonym to scott; --公有同义词 SYS@PROD> grant create synonym to scott; --私有同义词 ##创建共有同义词 SYS@PROD> conn scott/tiger SCOTT@PROD> create public synonym scottemp for emp; ##其他用户访问 SCOTT@PROD> conn hr/hr HR@PROD> select * from scottemp; select * from scottemp * ERROR at line 1: ORA-00942: table or view does not exist ##管理员授权 HR@PROD> conn / as sysdba SYS@PROD> grant select on scott.emp to hr; HR@PROD> select * from scott.emp;
五、TCL事务控制
5.1 属性(ACID)
原子性:事务必须都完成,或者不完成 一致性:查询的结果必须与开始查询的状态一致 隔离性:做出变更的会话,其他会话看不到未提交的记录 持久性:事务一旦完成,所有的用户立即看到
5.2 事务的开始和结束
SYS@PROD> update emp t set t.ename='jem' where t.empno =7369; 1 row updated. SYS@PROD> commit; --提交 SYS@PROD> rollback; --回滚 DDL语句:默认提交