一、多表查询
语法:select * from 表名1,表名2 where 条件表达式(主键 = 外键)order by 排序
主键:必须有值(不为null)且不重复,可以用作当前行的标识
主键 = 外键:当前表中的外键必须是另一张表的主键
1.1内联查询 (where条件中的内容:主键 = 外键)
查询结果中,主键中有,外键中也有的值都会查询得到,主键中没有而外键中有的值不会查
询得到
例:查询出雇员的编号、雇员姓名、部门编号、部门名称及部门位置
selecte.empno,e.ename,d.deptno,d.dname,d.loc from emp e,dept d where
e.deptno = d.deptno;
或:selecte.empno,e.ename,d.deptno,d.dname,d.loc from emp e inner join
dept d on e.deptno = d.deptno;
即:两种表之间用inner join连接,where用on替换
1.2外联查询 (on条件中的内容:主键 = 外键)
左外联:左表中的值都会出现在查询结果中,即使右表中没有对应的数据
例:select * from dept d left join empe on d.deptno = e.deptno;
部门40依然可以查询得出,其emp中的数据由null代替
1.3自联查询(where条件中的内容:本表中的某列 = 本表中的主键列)
例1:查询出每个雇员的编号,姓名,工作,部门及上级领导的姓名
select e.empno,e.ename,e.job,m.ename,d.dname from emp e,emp m,dept d
where e.mgr = m.empno and e.deptno =d.deptno;
例2:查询出每个雇员的姓名,工资,部门名称,工资等级及上级领导的姓名和工资所在的
等级
select e.ename,e.sal,m.ename,d.dname,s.grade,m.sal,sm.grade from emp
e,emp m,dept d,salgrade s,salgrade sm wheree.mgr = m.empno and e.deptno =
d.deptno and (e.sal between s.losal ands.hisal) and (m.sal between sm.losal
and sm.hisal) ;
二、组函数及分组统计
2.1组函数
a、count(): 求出全部的记录数
用法:selectcount(*) from emp;
b、max(): 求出一组数据中的最大值
用法:selectmax(sal) from emp;
c、min(): 求出一组数据中的最小值
用法:selectmin(sal) from emp;
d、sum():求和
用法:select sum(sal) from emp wheredeptno = 20;
e、avg():求平均值
用法:select avg(sal) from emp wheredeptno = 20;
2.2分组统计 (使用group by 进行分组)
语法:select * from 表名称 where 条件表达式 group by 分组条件 order by 排序
字段
例1:求出每个部门的雇员数量,按照部门编号划分
select deptno,count(empno) from emp group by deptno;
例2:求出每个部门的平均工资
select deptno,avg(sal) from emp group by deptno;
例3:按照部门分组,并显示部门的名称,及每个部门的员工数
select d.dname,count(ename) from emp e,dept d where e.deptno = d.deptno
group by d.dname;
having 条件指令:
语法:select * form 表名称 where 条件表达式 group by 分组条件 having 条件
表达式 order by 排序字段
例4:显示出平均工资大于2000的部门编号及平均工资
select deptno,avg(sal) from emp group by deptno having avg(sal) >2000;
例5:显示非销售人员工作名称以及从事同一工作的雇员的月工资的总和,并且要满足从事
同一工作的雇员的月工资合计大于5000,输出结果按照月工资的合计升序排序
select job,sum(sal) from emp where job <> ‘SALESMAN‘ group by job
having sum(sal) >5000 order by sum(sal)asc;
例6:求出平均工资最高的部门
select max(avg(sal))from emp group by
三、子查询
概念:在一个查询的内部还包括另外一个查询
语法:select * from 表名称 where 条件表达式(select * from 表名称 where 条件表达
式 group by 分组条件 having 条件表达式 order by 排序字段) group by 分组条件
having 条件表达式 order by 排序字段
例1:查询出比7654工资要高的全部雇员信息
select * from emp where sal >(select sal from emp where empno =7654);
例2:查询出工资比7654高,同时与7788从事相同工作的全部雇员信息
select * from emp where sal >(select sal from emp where empno = 7654)and
job = (select job from emp where empno =7788);
在子查询中,存在三种查询的操作符号:in、any、all
3.1 in操作符
作用:指定一个查询的范围
例3:求出每个部门的最低工资的雇员信息
select * from emp where sal in (select min(sal) from emp group by
deptno);
3.2 any操作符
=any (与in操作符的功能完全一样)
> any (比里面最小的值要大)
< any (比里面最大的值要小)
select * from emp where sal = any(select min(sal)from emp group by
deptno);
3.3 all操作符
>all (比最大的值要大)
<all (比最小的值要小)
select * from emp where sal > all(select min(sal) from emp group by
deptno);
四、数据库更新操作
数据库的主要操作分为两种:
1、数据库的查询操作:select
2、数据库的更新操作:insert、update、delete
为了保存原始的emp表的信息,在进行增加、修改、删除操作之前,先将此表复制一份,即:
create table myemp as select * from emp;
4.1增加数据 insertinto
语法:insert into 表名称[(字段名1,字段名2...)]values(值1,值2...);
例1:为myemp表增加一条新的记录,按照标准的做法完成
insert into myemp(empno,ename,job,mgr,hiredate,sal,comm,deptno)values
(7899,‘张三‘,‘清洁工‘,7369,‘14-2月-85‘,9000,300,40);
例2:插入一个新的雇员,但此时雇员暂时没有领导,也没有奖金
1)、不明确写出要插入的字段名,没有数据的字段写成null
insert into myemp values(8881,‘李四‘,‘清洁工‘,null,‘17-5月-
86‘,9000,null,40);
2)、明确写出要插入的字段名
insert into myemp(empno,ename,job,mgr,hiredate,sal,comm,deptno)values
(8882,‘王五‘,‘清洁工‘,null,‘23-6月-87‘,9000,null,40);
3)、将一个字符串类型的数据变为date类型的数据
insertinto myemp(empno,ename,job,mgr,hiredate,sal,comm,deptno)values
(8883,‘赵六‘,‘清洁工‘,7369,to_date(‘1988-12-23‘,‘yyyy-mm-dd‘),9000,300,40);
4.2修改数据 update
语法:
1)、修改全部:update 表名称 set 要修改的字段 = 新值,要修改的字段 = 新值...
2)、修改局部:update 表名称 set 要修改的字段 = 新值,要修改的字段 = 新值...
where 修改条件
例3:将myemp表中的所有雇员的奖金修改为1000 --->全部修改
update myemp set comm = 1000;
例4: 将编号为7899的雇员的工资修改成5000 --->局部修改
update myemp set sal = 5000 where empno = 7899;
例5: 将编号7369、8899、7788的领导及奖金取消
update myemp set mgr = null,comm = null where empno in(7369,8899,7788);
4.3删除数据 delete
语法:
1)、删除全部: deletefrom 表名称
2)、删除局部: deletefrom 表名称 where 删除条件
例6: 删除编号是7899的雇员信息
delete from myemp where empno = 7899;
例7: 删除全部领取奖金的雇员
delete from myemp where comm is not null;
五、事务处理
概念:保证数据的完整性,所有的操作要么同时成功,要么同时失败。 每一个连接到数据库上
的用户表示创建了一个session,一个session对数据库所做的修改,不会立刻反映到数据库的真
实数据之上,是允许回滚的,当一个session提交所有的操作之后,数据库才真正的做出了修改。
在数据库的操作中提供了以下两个主要命令完成事物的处理:
--->提交事物:commit
--->回滚事物:rollback
例1: 创建一个只包含10部门雇员信息的临时表
create table emp10 as select * from emp where empno = 10;
例2: 删除emp10表中7782的雇员信息
delete from emp10 where empno = 7782;
事务的操作:先定义开始一个事务,然后对数据作修改操作,这时如果提交(COMMIT),这些修改就永
久地保存下来,如果回退(ROLLBACK),数据库管理系统将放弃您所作的所有修改而回到开始事务时
的状态。
事务的属性:
1、原子性:指事务是一个不可分割的工作单位,事务中的操作要么都发生,要么都不发生。
2、 一致性:事务必须使数据库从一个一致性状态变换到另外一个一致性状态。(数据不被破
坏)
3、 隔离性:指一个事务的执行不能被其他事务干扰,即一个事务内部的操作及使用的数据
对并发的其他事务是隔离的,并发执行的各个事务之间不能互相干扰。
4、持久性:指一个事务一旦被提交,它对数据库中数据的改变就是永久性的,接下来的其他
操作和数据库故障不应该对其有任何影响
多个事务并发运行时的并发问题:
1、脏读:一个事务读取了另一个事务改写但还未提交的数据,如果这些数据被回滚,则读到的
数据是无效的。
2、不可重复读:在同一事务中,多次读取同一数据返回的结果有所不同。换句话说就是,后
续读取可以读到另一事务已提交的更新数据。
3、可重复读:在同一事务中多次读取数据时,能够保证所读数据一样,也就是,后续读取不
能读到另一事务已提交的更新数据。
4、幻读:一个事务读取了几行记录后,另一个事务插入一些记录,幻读就发生了。再后来的
查询中,第一个事务就会发现有些原来没有的记录。
原文地址:http://9882931.blog.51cto.com/9872931/1614787