最近几天学习了一下oracle数据库,顺手做的笔记
一直使用的一个工具叫做pl/sql devloper,一边可以运行,一边可以做笔记,很方便
oracle安装会自动的生成sys 和 system用户
一般讲,对数据维护,使用system用户登录就可以
conn system/root;
当用特权用户身份连接时,必须带上 as sysdba 或者是 as sysoper
disc[onnect]
passw[ord]
show user
exit
显示行的宽度 linesize 默认是80个字符
set linesize 50
desc tableName
查看表结构
权限分为两类
角色相当于是拥有某些权限的用户,使用角色的目的就是为了简化指定权限的过程
给某个用户指定某个角色,使得该用户拥有某些特定权限
角色分两类
create user NAME identified by PASSWORD
具有dba权限的用户才能创建密码是以字母开头
conn system/root as sysdba;
create user tom identified by m123;
刚创建的用户是连接不上的,因为没有任何权限,需要指定相应的权限,由sys/system指定
grant connect to tom;
用tom用户创建表,又提示权限不够
grant resource to tom;
创建表 create table table_name();
create table stu (id number , nmae varchar2(20),sex varchar2(4));
希望别的用户可以查看tom的stu表
--创建Jerry用户
conn system/root as sysdba;
create user jerry identified by m123;
--权限
grant connect,resource to jerry;
--查看tom的stu表
select * from tom.stu;
结果是 ORA-00942: 表或视图不存在
,原因还是因为权限.需要给jerry用户赋予权限。
希望查看的是tom用户的stu表,所以这个权限需要由tom用户给jerry指定.
conn tom/m123;
grant select on stu to jerry;
然后在登录jerry用户看看是否能够查看了
conn jerry/m123;
select * from tom.stu;
可以查看
赋予jerry可以修改、删除、查询tom的stu表的权限
grant all on stu to jerry;
修改密码
删除用户,以dba权限删除 drop user
revole select on stu from jerry;
profile是口令限制,资源限制的命令的集合。
当建立数据库时,oracle会自动创建名称为default的profile
当建立用户没有制定profile选项,那oracle就会将default分配给用户
账户锁定
制定该用户登录时最多可以输入密码的次数,也可以指定用户锁定的时间(天)
一般用dba身份去执行命令
create profile aa limit failed_login_attempts 3 password_lock_time 2;
创建一个profile名字是aa,登录失败次数限制为3次,3次都失败则账户锁定2天
alter user tom profile aa;
可以尝试一下故意输错密码
ORA-28000: the account is locked
用户已经锁定
解锁
alter user tom account unlock;
终止口令
为了让用户定期修改密码
create profile bb limit password_life_time 10 password_grace_time 2;
创建profile bb 密码的时长是10天,宽限2天
alter user tom profile bb;
口令历史
如果希望用户在修改密码的时候,不能使用以前使用过的密码,可以使用口令历史,这样oracle就会将口令修改的信息存放到数据字典中,当用户修改密码时,就会对新旧密码进行比较,发现新密码和旧密码一样时,就提示用户重新输入新密码
create profile password_history limit password_life_time 10 password_grace_time 2 password_reuse_time 10;
password_reuse_time 10;//旧密码 10 天后可以重用.
drop profile aa ;
如果指定了用户 需要 CASCADE
date 年月日时分秒
timestamp
create table student(
xh number(4),
xm varchar(20),
sex char(4),
birthday date,
sal number(7,2)
);
添加一个字段
alter table student add (classId number (2));
修改字段的长度
alter table student modify (xm varchar2(30));
修改字段的类型/或者是名字(不能有数据)
alter table student drop column sal;
修改表的名字
rename student to stu;
删除表
drop table student;
truncate;
drop;
添加数据
insert into STUDENT values ( 1,'小明','男','9-9月-1999',2345.6,12);
date默认的日期格式是‘DD-MON-YY’
修改日期格式
alter session set nls_date_format='yyyy-mm-dd';
插入部分字段
insert into student (xh,xm,sex) values (''''''');
插入空值
insert into student (xh,xm,sex) values (''''''',null);
查询空值
select * from student where birthday is null;
修改一个字段
update student set sal = sal/2 where...
update studen set sex = '女' where xh = '1'
修改多个字段用逗号隔开
删除数据
delete from student
savepoint a;
rollback;
drop table student
删除表的结构和数据truncate table student
删除所有记录,表结构还在,不写日志,速度快,不可恢复表的管理(创建 维护)
各种查询技巧
创建新的oracle数据库
表名和列的命名规范
必须以字母开头
长度不能超过30字符
不能使用oracle保留字
别名 select last_name a,first_name b from s_emp;
nvl函数处理null值
select sal*13 + nvl (comm,0)* 13 “年工资” ,ename from emp;
有序排列 order by
降序排列 desc
where 子句操作符
= 等于
<> 不等于
!= 不等于
< 小于
<= 小于等于
! 不小于
> 大于
>= 大于等于
!< 不大于
between 在制定的两个值之间
is null 为null值
AND
OR
IN 用来制定要匹配值得清单的关键字,功能与OR相当
NOT
%通配符 多个
以s开头的词 's%'
中间有s '%s%'
以s开头s结尾 's%s'
_通配符 单个
UPPER()函数 讲文本转换为大写 select last_name,UPPER(first_name) from s_emp order by 2 desc;
LOWER() 讲字符串转换为小写
RTRIM()函数 去除列值右边的空格
LTRIM() 去除左边的空格
LEFT() 返回字符串左边的字符
RIGHT() 范湖字符串右边的字符
LENGTH() 返回字符串的长度
SOUNDEX() 返回字符串的soundex值 发音类似的
ABS() 绝对值
COS() 余弦
EXP() 指数值
PI() 圆周率
SIN() 正弦
SQRT() 平方根
TAN() 正切
AVG() 平均值
COUNT() 某列的行数
MAX() 某列的最大值
MIN() 最小值
SUM() 总和
分组 GROUP BY和 HAVING
select username ,count(*) as namecount from users group by username;
having支持所有where操作符
查询所有表
select table_name from tabs;
https://www.douban.com/note/31849478/
如果查询字段中有sum、count类似的聚合函数 那么其他字段必须要在group by 中出现
不是单独分组函数
此处不允许使用分组函数
having后面是 条件
group by后面是字段
两张表:a,b
如果没有条件则是 一对 多的关系 相当于a.columnNum * b.columnNum条数据
加上条件才是一对一
a.xId = b.xId;
多表查询的条件是:至少不能少于表的个数-1
select ??? from a,b where a.x = b.x;
一张员工表 emp 、一张工资级别表 salgrade
select a.name,a.sal,b.grade from emp a,salarygrade b where a.sal between b.low and b.high;
显示员工姓名,员工工资及所在部门,并按部门排序
select a.name,a.sal,b.deptname from emp a,dept b where a.deptid = b.deptid order by a.deptid;
自连接
查询某个员工的上级领导的姓名
查询该员工的姓名及manager_id
select first_name,manager_id from s_emp where first_name='Mai';
自连接查询
select worker.first_name,boss.first_name from s_emp worker,s_emp boss where worker.manager_id=boss.id and worker.first_name='Mai';
查询与Smith相同部门的员工信息
–1.查询Smith的部门
select dept_id from s_emp where last_name = 'Smith';
–2.显示员工信息
select * from s_emp where dept_id=
(select dept_id from s_emp where last_name = 'Smith');
多行子查询 返回多行数据
in
多列查询
select * from s_emp where (dept_id,title)= (select dept_id,title from s_emp where last_name='Smith');
–查询各个部门的平均工资和部门号
select dept_id ,avg (salary) from s_emp group by dept_id;
–把上面的看做一张子表
select a1.dept_id,a1.avg_sal,a2.dept_id,a2.first_name ,a2.salary from s_emp a2, (select dept_id,avg(salary) avg_sal from s_emp group by dept_id ) a1
where a2.dept_id = a1.dept_id and a2.salary > a1.avg_sal;
1.
select * from s_emp;
2.
select a.* ,rownum rn from (select * from s_emp)a where rownum <= 10;
3.
select a.*,rownum rn from (select a.* ,rownum rn from (select * from s_emp)a where rownum <= 10) a where rownum <= 5;
4.几个查询变化
a.指定查询列,只需修改最里层的子查询
select a.*,rownum rn from (select a.* ,rownum rn from (select * from s_emp)a where rownum <= 10) a where rownum <= 5;
b.排序 修改最里层
select a.*,rownum rn from (select a.* ,rownum rn from (select last_name from s_emp order by salary ///desc) a where rownum <= 10) a where rownum <= 5;