学oracle数据库前的话

大多数的理科知识一样,需要初学者具有一下方面的思想准备:

一是不管出于什么样的动机,都需要对新知识点产生学习兴趣,并坚持学习!

说实话,就算到现在,我也依旧无法提起对这方面知识学习的兴趣,

枯燥无味的函数命令,以及各种关键字让人看了就头疼,曾一度我都想过要放弃。

但是到后来,因为要找工作的缘故,必须要学下来。

为此,我一直在尝试如果通过最简单理解记忆的方式来学习这门课程。

二是要善于思考,归纳总结知识点。不要死记硬背。要多实践,如果没有现成的平台让你操作的话。

那么可以从网上找到相关的资源来学习。比如简书,博客园以及IT之家都可以。

三是要善于把复杂的东西简单化,要把内容冗长的内容进行片段化,通过一小段一小段地各个击破。

四是在学习新知识时要静下心,要心无旁骛地把一件事情给做好。还有一点就是,一定要学好英文!!!

    好了,我们谈谈数据库吧,可以把它理解成存放货品(数据)的仓库,如果要完成某个项目(事件),就得从中调运物料(数据).没办法,因为这是歪果仁弄出的东东,所以我们要有一定的英语基础。其次就是,英文字符要比汉字占据着更小的内存。就当前的使用频率来说,比较常用的数据库是oracle和mysql,蛮多的用人单位就是这么要求求职者具备的技能。

完整oracle数据库使用技能包含如下:

1.要会安装数据库客户端的软件(一般是公司内部提供的安装包)

2.要会配置本地服务,需要找到tnsnames.ora文件(用于远程连接数据库),用记事本或者文本文档打开,需要配置的内容包括:

      数据库服务器的IP(或主机名)

      全局数据库名称(也即sid)

      监听端口(默认是1521)

      登陆数据库还需要用户名和密码

3.要懂得基本的增删改查表的命令,要懂得复杂的分组查询命令,左右连接和子查询。

以上介绍了个大概情况,后面我将数据库的知识知识要点进行详细讲解。

                                                              一.表的创建

  无论是学习数据库还是其他的编程语言也好,都得知道它的语法结构,然后根据题目要求往上面套对应的字段即可。而创建表的格式是:

create table 表名(

                  列名1  数据类型【约束条件】,

                  列名2  数据类型【约束条件】,

                  列名3  数据类型【约束条件】,

                  ....

                  列名N  数据类型【约束条件】,

                  );

1.表名和列名都是自定义的,由字母、数字、下划线(_)组成,不要以数字开头 ;

2.数据类型经常用到三种类型:

  number(数字型):可以是整数,也可以是小数,比如:number(5,2) 一个数为5位数的有效数,2位小数 -999.99~999.99    numbe(5) -99999~99999.

  日期型:date.经常用到的函数是to_date或者sysdate(系统时间).

  字符串:char(固定长度字符),varchar2(可变长字符)。通常后者用的比较多,经常用到的函数是to_char.

3.约束条件有以下几个:

    主键(primary key):相当于身份证号码,包含非空约束和唯一约束,一个表中只有一个主键。

    唯一约束(unique):值不能重复,但是可以为null。

    非空约束(not null):值不能为空.

    检查约束(check):判断输入值是否满足某个条件,通常判定男女性别所用。

    默认值(default):默认输入值的属性,若没有给列指定默认值,那么该列的默认值是空(即null)

    外键(references):也属于表对象,用于和其他表的某个列或者字段产生关联。

举个栗子:

商品售货系统设计案例:

现有一个商品的数据、记录客户及其购物情况,由下三张表组成

商品goods(商品号goodsid,商品名goodsname,单价untiprice,商品类别category,供应商provider)

客户customer(客户号customerid,姓名name,住址address,电邮email,性别sex,身份证cardid)

购买purchase(客户号customerid,商品号goodsid,购买数量nums)

1、建表,每个表的主外键,客户的姓名不能为空值;单价必须大于0,购买数量必须在1到30之间;电邮不能重复;客户的性别必须是男或女,默认是男;

--- 商品表

create table goods(

      goodsid number primary key,

      goodsname varchar2(50),

      untiprice number check(untiprice > 0),

      category varchar2(50),

      provider varchar2(50)

);

-- 客户表

create table customer(

      customerid number primary key,

      name varchar2(50) not null,

      address varchar2(250),

      email varchar2(50) unique,

      sex char(2)  default '男' check(sex='男' or sex='女'),

      cardid varchar2(18)

);                                                                                                                                                                                                                                                                                                                                                                                                                                                              --购买表

create table purchase(

      customerid number references customer(customerid),

      goodsid number references goods(goodsid),

      nums number check(nums>=1 and nums <=30)

);

                                                          二.表内指定列的修改

1.查看表:

在 command window(命令窗口)下输入:desc 表名;

2.修改表:

(1)增加列 :

        语法格式:alter table 表名

                        add(字段名1 数据类型 [not null | null],字段名2 数据类型 [not null | null]);

                      (如果要新增多个列,则要用逗号将各列定义分开。)

        例:向student表中增加一个性别和住址字段

                  alter table student

                  add(score number,addr varchar2(50));

  (2)修改列:

        语法格式:alter table 表名

                          modify(列名  数据类型  [default 默认值] [not null | null]);

                          (如果要修改多个列,则要用逗号将各列定义分开)

          例:修改student表的name字段类型为varchar2(50),且默认值为"永杰"。

                alter table t_student

                modify name varchar2(20) default '永杰' not null;

    (3)删除列:

        语法格式:alter table 表名

                        drop column 列名;

      例:删除student的score列;

                alter table student

                drop column score;

    (4)删除表:

        语法格式:drop table 表名;


        例:删除studen表;

              drop table student;

                                                              三.表的查询

  在表的增删改查操作中,表的查询是重中之重,需要重点记忆。

  在oracle中,一般会自带三张表:

  emp 员工信息表,包含字段:

  empno 雇员编号(工号), ename 员工姓名,

  job 工种(CLERK秘书,SALESMAN销售,MANAGER经理,ANALYST分析员,PRESIDENT总经理),

  mgr 员工上级的编号, hiredate 入职日期, sal 薪水, comm 奖金, deptno 部门号;

  dept 部门表,包含的字段:

  dname 部门名称(ACCOUNTING财务部,RESEARCH研发部,SALES销售部,OPERATIONS运营部),

  loc工作地址;

    salgrade工资等级表,包含字段:

    GRADE等级(LOSAL最低工资, HISAL最高工资);

    (若无特殊说明,后面的查询案例,如无特殊说明,均以系统中存在的emp和dept两个表为例)

    单表简单查询:1-8;


  1.查询emp表所有列:select * from emp;


  2.查询emp表指定列:select empno,ename,job,sal from emp;


  3.简单的条件查询:

    例:查找出工资超过2000的所有人员信息。

          select * from emp where sal>2000;


    例:查询1980年入职人员的信息。

            select * from emp where to_char(hiredate,'yyyy')='1980';

    例: 查询1980年12月到1982年12月入职人员的信息。

            select * from emp where to_char(hiredate,'yyyymm')  between '198012' and '198212';


  4.筛选重复查询内容时就要用到关键字distinct.

      例:查找出20号部门中有那些不同的工种。

            select distinct job from emp

            where deptno = 20

  5.多条件过滤之逻辑运算符:not,and,or以及!

      格式:

      select 列1,列2...列N或*

      from 表名

      where 过滤条件1 and 过滤条件2 or 过滤条件3.....

    例:查找出不是30号部门中的所有经理的所有信息。

        select * from emp

        where deptno !=30 and job='MANAGER';

    6.多值比较运算符:(not)between 值1 and 值2, in, not in.


      例:查找出工资在2000到3000之间的职工姓名、工种和工资.

          select ename,job,sal from emp

          where sal between 2000 and 3000;

      例:查询出工资分别是1500,2500,3000的分析员或推销员的姓名、工种、工资和所在部门号.

          select ename,job,sal,deptno from emp

          where job=ANY in ('ANALYST','SALESMAN') and sal in(1500,2500,3000);

      7.模糊查询:like

      %表示匹配任意长度的字符串

        %test%:表示匹配中间字符串为test的任意长度的字符串.


      例:查询出名字以"SCO"开头的,长度为5位的全部职工的姓名、工种、工资和部门号

            select ename,job,sal,deptno from emp

            where ename like 'SCO__';

      8.排序查询:

      格式:

      ORDER BY 字段名 ASC/DESC;

      (ASC升序,DESC降序)


      例:计算每个销售人员的年度总报酬,并按总报酬由高到低顺序显示.

          select ename,job,comm,sal,12*(sal+comm) from emp

          where job='SALESMAN'

          order by 12*(sal+comm) DESC;


      9.单表复杂查询:

          分组/聚合/统计函数:

          count(字段名):计算指定字段为非空的行数

          count(*):计算表中的全部行数,包括重复行和空行

          avg(字段名):计算指定字段的平均值

          min(字段名):计算指定字段的最小值

          max(字段名):计算指定字段的最大值

          sum(字段名):计算指定字段的总和

          例:计算emp表中公司职工的最低工资、最高工资、平均工资和总工资的和

                  select min(sal),max(sal),avg(sal),sum(sal) from emp;

          例:计算emp表中公司职工的总人数及工种数

                  select count(*),count(distinct job) from emp;

        10.带条件的分组查询:

            /*查询的总语句

            select 列1,列2,列3...列N 或 *

            from 表名/(表达式) -- 数据池

            [where 过滤条件]

            [group by 分组内容]

            [having 组内条件]

            [order by 排序方式]

            */

  #分组函数只能出现在选择列表、having、order by 子句中

  #如果在select语句同时含有group by、having、order by,那么他们的顺序是group by、having、order by

  #group by 有一个原则,就是 select 后面的所有字段,必须出现在 group by 后面,否则,有语法错误(重要)

  #有having 一定有group by.


  例:查询出至少有两名秘书的所有部门的部门号,并按人数降序排序。

        select deptno,count(*) from emp

        where job='CLERK'

          group by deptno

          having count(*) >= 2

          order by count(*);

        11.多表查询:

            语法格式:

            select 表别名1.列名1,表别名1.列名2....  或 表别名1.*,表别名2.*

            from 表名1 表别名1,表名2 表别名2,...表名n,表别名n

            where 表名1或表别名1.列名=表名2或表别名2.列名 and 表名(n-1)或表别名(n-1).列名=表名n或表别名n.列名


            例:查询部门号是20,30,40的职工的员工编号,姓名,工资,部门所在位置。

                  select e.empno,e.ename,e.sal,d.loc

                  from emp e,dept d

                  where e.deptno = d.deptno and e.deptno in(20,30,40);

              多表查询解题思路:

  @分析题目涉及哪几张表;

  @如果查询的数据来自于多张表,找到这些表的相同字段,在where后面,把这些字段用等于号连接起来;

  @如果需要对单条记录进行过滤,就把过滤条件追加到where子句后面,用and连接起来;

  @需要对多组数据进行统计,使用group by进行分组;

  @分组后的过滤,只能使用having;

  @需要排序,就用orader by。


              12.外连接查询(左右连接)  :


              语法格式:

              select 列名

              from 表名1 表别名1,表名2 表别名2

              where 表别名1.列名=表别名2.列名(+) 或 表别名1.列名(+)=表别名2.列名;

              select ... from table1 t1,table2 t2 where t1.id = t2.id(+); --左连接

              select ... from table1 t1,table2 t2 where t1.id(+) = t2.id; --右连接

              PS :左连接,等号左边的表为主表,等号右边的表为从表.

                    右连接,等号右边的表为主表,等号左边的表为从表.


            左右连接的另一种写法:

            select * from A2 right JOIN B2 ON A2.id=B2.bid

            select * from A2 left JOIN B2 ON A2.id=B2.bid

          例:显示出所有部门的编号、名称和其职工的姓名与工种。

                select d.deptno,d.dname,e.ename,e.job from dept d, emp e where d.deptno = e.deptno(+)

              或者也可写成以下格式:

              select d.deptno,d.dname,e.ename,e.job from emp e right join dept d on e.deptno = d.deptno;

              select d.deptno,d.dname,e.ename,e.job from dept d left join emp e on d.deptno = e.deptno;



            13.子查询:


              语法格式:

                    SELECT <列名表>

                    FROM 表名

                    WHERE 列表或表达式 比较运算符(SELECT 列名

      FROM 表名

      WHERE 条件);

                                  ( 注意:子查询必须要用圆括号括起来) 

                (1)单行值子查询的解题思路:

                  例:查找出与“yongjie”在同一个部门工作的所有职工姓名及工资


                  分析思路:

                  首先查找要查找部门的所有职工姓名及工资:

                    select e.ename,e.sal

                    from emp e

                      where deptno =  (与“yongjie”在同一个部门)

                  接着查找SMITH所在的部门:

                  select deptno from emp where ename = 'yongjie'

                -将两种综合就是最终答案:

                  select e.ename, e.sal

                  from emp e

                  where deptno = (select deptno from emp where ename = 'yongjie');         

              (2)多行值子查询解题思路:

                  多行子查询,是指子查询会返回多个值,此时,需要用到多值比较运算符:[NOT]IN

                例:查找出部门20中的工种相同的职工的姓名与工种。

                        select e.ename, e.job

                        from emp e

                        where e.deptno = 20

                        and job in (select job from emp

                                          where deptno = 20

                                          group by job

                                          having count(*) >= 2);                   


四.表的增删改

1.增加数据:

  语法格式:insert into 表名(列1,列2...列N)values(值1,值2...值N);

                  commit | rollback;

                  ( commit 提交,rollback回滚)


        如果向表中插入时间格式的数据时,则需要用到to_date()函数把字符串转换为时间格式

        语法:to_date(char,'format')


      例:向emp表中插入数据:(123,'CLERK','1997-07-01')后提交数据。

            insert into emp values(123,'CLERK',to_date('1997-07-01','YYYY-MM-DD'));

            commit;


3.修改数据:

    语法格式: update 表名

                    set 列1 = 值1,列2 = 值2...列N = 值N

                    [where过滤条件];

  例:将职工yongjie提升为经理,工资变更为8000,奖金增加20%的比例。

      update emp

      set job='MANAGER',sal=8000,comm=1.2*comm

      where ename='yongjie';

4.删除数据:

  语法格式:delete [from] 表名

                  [where过滤条件]

    例:删除emp表中工资低于500元的所有员工的信息.

          delete from emp

          where sal < 500;


5.删除表的两种方式:

  truncate table 表名;

  delete table 表名;

  delete:会发起事务,可以有where过滤条件(即删除指定的数据),属于dml语句,删除效率比truncate低

    truncate:不会发起事务,不能有where过滤条件(即只能删除表中所有的数据),属于ddl语句,删除效率比delete高,但有危险性.

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。