码迷,mamicode.com
首页 > 数据库 > 详细

查询数据库

时间:2015-02-17 23:40:46      阅读:268      评论:0      收藏:0      [点我收藏+]

标签:数据库   表达式   inner   where   null   

一、多表查询

  语法: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连接,whereon替换

  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组函数

    acount() 求出全部的记录数

       用法:selectcount(*) from emp;

    bmax() 求出一组数据中的最大值

       用法:selectmax(sal) from emp;

    cmin() 求出一组数据中的最小值

       用法:selectmin(sal) from emp;

    dsum():求和 

       用法:select sum(sal) from emp wheredeptno = 20;

    eavg():求平均值

       用法: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);

  在子查询中,存在三种查询的操作符号:inanyall

    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、数据库的更新操作:insertupdatedelete

为了保存原始的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: 将编号736988997788的领导及奖金取消

     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、幻读:一个事务读取了几行记录后,另一个事务插入一些记录,幻读就发生了。再后来的

查询中,第一个事务就会发现有些原来没有的记录。

   


查询数据库

标签:数据库   表达式   inner   where   null   

原文地址:http://9882931.blog.51cto.com/9872931/1614787

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!