第二部分 数据库
注:如果PLSQL登录时出现"无监听",打开"服务",启动
“OracleServerXE”,“OracleXETNSListener”,就可以了;
——————————————————————————————
Oracle:
where子句和having子句都可以使用普通字段直接进行筛选,但是where效率高于having;
where执行顺序:from——>where——>group by——>select——>order by
having执行顺序:from——>group by——>select——>having——>order by
group by:分组
count(*):代指数据表中的所有数据,如果括号中不是“*”,那作用就是判断当前字段中是否为NULL;可以让其他字段与其进行四则运算,如果没有经过count(字段),其他字段的值万一与空值进行运算则也会变为空值;
———————————————————————————————————————
转换函数:
to_number():将字符数据转换为数值,但是字符数值本身值为数值;
to_char():将数值数据或者日期数据转换为字符数据;
to_date():将字符数据转换为日期数据,但是字符为日期格式;
———————————————————————————————————————
增:
insert into 表名 (字段名1,字段名2…) values (值1,值2…);
如果是全字段输入(表中有多少字段就输入多少值),就可以省略 (字段名1,字段名2…),例:
insert into emp values(1,“张三”,2000);
———————————————————————————————————————
删:
delete from 表名 where 条件;
truncate table 表名; 删除表内所有信息,但是比"delete from 表名;"效率高;
———————————————————————————————————————
改:
update 表名 set 字段1=值1,字段2=值2; (会将字段名改为对应的值)
update 表名 set 字段1=值1,字段2=值2 where 条件; (将符合条件的数据改为新的值)
———————————————————————————————————————
查:
select * from where 条件;
———————————————————————————————————————
数据的备份:
表级别备份:
全部备份: create table 新表名 as select * from 备份表名;
例: create table deptBack01 as select * from dept;
注:只是备份表的数据和结构,约束不会备份,比如主键;
部分备份: create table 新表名 as select 字段名1,字段名2…from 备份表名;
例: create table deptBack02 as select deptno,dname from dept;
数据整体插入:
insert into 插入表名 select * from 表名;
insert into deptBack02 select deptno,dname from dept;
注:查询语句结果的字段数据必须和插入表名的字段数量相同;
———————————————————————————————————————
多表联合查询:
SQL92方式;
1.笛卡尔积
将多个表的数据进行一一对应,所得到的结果为多表的笛卡尔积;
select * from emp,dept;
2.等值连接
先做表的笛卡尔积,然后筛选,筛选条件为等值筛选;接下来的判断处理就和单表查询一样;最好每个字段前加上它所属的表名, 比如:
emp.ename;为了省事,可以把表名简化:from emp e,dept d,用等号作为判断符,字段的名字可以不同;
3.不等值连接
查询员工姓名,工作,工资,工资等级
select * from emp e,salgrade s where e.sal>=s.losal and e.sal<=s.hisal;
4.自连接
查询员工姓名,工作,薪资,及上级领导姓名;
select e1.ename,e1.job,e1.sal,e2.ename from emp e1,emp e2 where e1.mgr = e2.empno;
5.外连接
左外连接:
两张表做笛卡尔积,但是不是所有的两张表都是有相同行数的,这样的话,万一查那条信息在另一张表也有相应不相同的信息但是不全,正常查询会把那条漏掉,所以需要表明,我们同样需要没有信息的那条。
select * from emp e,dept d where e.deptno = d.deptno(+);
右外连接:
两张表做笛卡尔积,左部分的表如果有空白,但是右部分的需要,如下:
select * from emp e,dept d where e.deptno(+) = d.deptno;
———————————————————————————————————————
SQL99方式;
注意1:依然可以给表添加别名;
注意2:如果使用on或者 using 关键字对结果进行筛选,必须使用inner join作为表与表的连接,其中inner可以不写;
注意3:外连接的outer关键字可以省略不写;
注意4,:依然可以继续使用分组,having排序等;
———————————————————————————————————————
笛卡尔积:使用cross join 关键字
select * from 表名1 cross join 表名2;
筛选:
自然连接:使用关键字 natural join
select 内容 from 表名 natural join 表名
特点:底层先笛卡尔积,然后按照所有的同名同值字段自动进行等值筛选;
问题1:如果只想按照部分字段结果筛选怎么办?
问题2:如果想按照字段名不同,但是值相同进行等值筛选怎么办?
select * from emp natural join dept;
解决1:使用using关键字
作用1:指明使用指定的字段对联合查询的结果进行等值筛选
注意:指明的字段必须是两表的同名同值字段
select 内容 from 表名 inner join 表名 using (字段名1,字段名2…)
例:select * from emp inner join dept using (deptno);
解决2:使用on关键字进行自定义连接条件筛选(等值筛选,不等值筛选)
注意:普通筛选条件使用where进行筛选,不要使用on进行。好处是语句的可读性变强;
select 内容 from 表名 inner join 表名 on 连接条件 where 普通筛选条件
select * from emp inner join dept on emp.ename = dept.deptno;
———————————————————————————————————————
注:多表联合查询用关键字“on”,普通查询用“where”;可以放在一个句子里;
———————————————————————————————————————
外连接:
左外连接:select 内容 from 表名 left outer join 表名 on 连接条件
例:查询员工姓名,工作,薪资,部门名称及没有部门的员工信息
select * from emp e left outer join dept d on e.deptno = d.deptno
右外连接:select 内容 from 表名 right outer join 表名 on 连接条件
例:查询员工姓名,工作,薪资,部门名称及没有员工的部门信息
select * from emp e right outer join dept d on e.deptno = d.deptno
全外连接:select 内容 from 表名 full outer join 表名 on 连接条件
select * from emp e full outer join dept d on e.deptno = d.deptno
自连接(自己连自己):
例:查询员工及其上级领导姓名:
select e1.*,e2.ename from emp e1 inner join emp e2 on e1.mgr = e2.empno;
———————————————————————————————————————
SQL92&SQL99实现三表联合查询:
SQL99使用: SQL92使用:
select 内容 from 表名1 | select 内容(别名,连接符,去重复,函数, inner join 表名2 | 逻辑运算)
on 连接条件 | from 表名1,表名2…
inner join表名3 | where 条件(连接条件,筛选条件,where)
on 连接条件 | group by 分组字段
where 普通筛选条件 | having 多行函数筛选
group by 分组 | order by 排序
having 多行函数筛选 |
order by 排序 |
———————————————————————————————————————
子查询:
注:当查询的筛选条件不明确时,考虑使用子查询;
单行子查询:
注:筛选条件不明确,需要执行一次查询,并且查询结果只有一个数据;
where子句中允许出现查询语句,该查询语句称为子查询;
例:查询所有比雇员(CLARK)工资高的员工信息;
select * from emp where sal>(select sal from emp where ename =’CLARK’);
例:查询工资高于平均工资的员工的名字和工资
select ename,sal from emp where sal > (select avg(sal) from emp);
例:查询和soctt属于同一部门且工资比他低的员工资料
select * from emp where deptno = (select deptno from emp where ename = ‘SCOTT’)and sal <(select sal from emp where ename=‘SCOTT’);
例:查询工资最高的员工资料
select * from emp where deptno = (select deptno from emp where ename = ‘SCOTT’)and sal <(select sal from emp where ename=‘SCOTT’);
多行子查询:
注:子查询的结果只有一个字段但是字段有n个值,考虑使用多行子查询,其实就是使用关键字
关键字1:any 任意
select 内容 from 表名 where 字段名 比较运算符 any 子查询语句
例:查询工资高于任意一个CLERK的所有员工信息
select * from emp where sal> any(select sal from emp where job = ‘CLERK’);
关键字2:all 所有
select 内容 from 表名 where 字段名 比较运算符 all 子查询语句
例:查询工资高于所有SALESMAN的员工信息
select * from emp where sal> all (select sal from emp where job = ‘SALESMAN’);
关键字3:in 表示任意存在,相当于any
select 内容 from 表名 where 字段名 in 子查询语句
select 内容 from 表名 where 字段名 not in 子查询语句
例:查询部门20中和部门10的雇员工作一样的雇员信息
select * from emp where job in (select job from emp where deptno = 10)and dept = 20;
———————————————————————————————————————
账户管理学习
权限:具备某类事物的操作的能力,此能力称为权限;
角色:一系列权限的集合;
Oracle自带账户:
system 管理账户 密码:123456
特点:具备大部分Oracle的操作权限,主要用来管理普通账户及Oracle的数据
使用者:Oracle数据维护工作人员
sys超级管理员账户 密码:123456
特点:具备所有system的所有权限,同时又具备其他的权限
使用者:Oracle工程师
创建账户:
使用system账户,并使用dba身份,登录Oracle管理系统
创建用户:
create user 用户名 identified by 密码;
运行这行代码,其实当前已经创建好用户,不过无法登录,因为没有授权;
维护账户:
赋予权限:
grant connect to 用户名;——————给用户赋予登录权限;
grant resource to 用户名;——————给用户赋予资源操作权限;
一般的用户创建到这个就可以了,不过可以赋予更高级别的权限,让它可以创建别 的用户;
grant dba to 用户名;————————给用户赋予dba权限;
select * from 用户名.表名;—————————查看其它用户的表;
删除权限:
revoke 权限或角色名 from 用户名;
删除账户:
drop user 用户名;
Oracle的二维表管理
数据类型:
number类型:
整型:number(a): 总长度为a;
浮点型:number(a,b): 总长度为a,小数位数长度为b;
varchar2类型:
varchar2(long):long表示字符的最大长度,实际存储内存长度是根据字符大小来分配的,但是最大不能超过long;
特点:动态分配存储空间,节省空间;
char类型:
字符类型char(long):不管字符数据长度是多大,直接开辟long大小的空间存储数据;
特点:存储效率高于varchar2();
date类型:
创建表:
格式:create table 表名(字段名 类型,字段名,类型);
例:create table 表名(
id number(10),
name varchar2(100),
age number(3),
sex char(4),
job varchar2(500),
birth date
)
添加测试数据
insert into 表名 values (1,’张三’,18,’男’,’职员,’01-01月-2000’);
insert into 表名 values (2,’李四’,20,’男’,’组长,to_date(‘19948-01-01’,’yyyy-mm-dd’));
二维表创建约束:
如上创建二维表的话,会有很多问题,比如可以输入多个相同id的信息,其他的字段亦是如此;这时候就需要约束条件来限制数据输入;
添加主键:primary key
特点:
———————————————————————————————————————
视图:
创建视图:
create view 视图名 as select 对外提供的内容 from 真实表名;
删除视图:
drop view 视图名;
视图特点:
1.保护真实表,隐藏重要字段的数据,保护数据;
2.在视图中的操作会映射执行到真实表中;
3.可以手动开启只读模式(1),使用关键字 with read only;
注:视图的创建必须拥有dba权限,我们可以在system账号(2)上对普通账号的数据表进行权限赋予;
(1)create view stu2 as select sno,sname,sage from student with read only;
(2)create view stu as select sno,sname,sage from bjsxt.student