欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

【oracle笔记1】基础知识大集锦:增删改,数据类型,用户操作,持续更新中···

程序员文章站 2022-04-16 21:37:11
什么是数据库?数据库就是用来存储和管理数据的仓库。首先我来简单介绍一下各数据库的背景,常见的数据库如下,oracle:甲骨文公司(市场占用率最高),oracle也是一个公司名,翻译过来就是甲骨文的意思。sql server:微软公司(大学课堂经常用到)。DB2:IBM公司,mysql:甲骨文公司,S ......

  什么是数据库?数据库就是用来存储和管理数据的仓库。首先我来简单介绍一下各数据库的背景,常见的数据库如下,oracle:甲骨文公司(市场占用率最高),oracle也是一个公司名,翻译过来就是甲骨文的意思。sql server:微软公司(大学课堂经常用到)。DB2:IBM公司,mysql:甲骨文公司,Sysbase:赛尔斯公司。

  关于mysql这里有个小插曲,不妨来说一下。最早mysql是个开元的项目,08年Sun公司把他收购了,在泡沫经济最厉害的时候,价值达到2000亿美金。由于经营不善,加上mysql开元免费,最后坚持不下去了。Sun公司跟IBM公司关系非常好,打算把mysql卖给IBM。但是呢IBM出的价钱没有达到Sun要求的价钱,好像是每股差1毛钱,不欢而散。这时候oracle说了,我多给你一毛。最后,Sun一生气,得,我就跟他成交了,我就不跟你IBM成交。最后核算下来是74亿美金,IBM的开价是73亿美金,差了一亿。2000亿的东西卖了70多亿。(PS:大家看看就好啦~别太认真,权当了解一下。)

  我所在的公司用的是oracle数据库,也是这几天才开始学习,持续更新。有很多需要思考的地方。

  i.专业术语:

    RDBMS:关系型数据库管理系统。

    ddl:对数据库或表的结构操作。

    dml:对表的记录进行更新。

    dql:对表的记录查询。

    dcl:对用户的创建及授权。

  ii.数据类型:

    double:浮点型。例如double(5,2)表示最多五位,其中必须有两位小数,最大值为999.99。

    decimal:浮点型。本意是十进制的意思,不会出现精度缺失,多用来表示与钱相关的。

    int:整型;char:固定长度字符串类型;varchar:可变长度字符串类型。

    clob:表示大字符;blob:表示二进制字符,用来存储电影音频等;

    date:日期类型,格式为:yyy--mm--dd;

    time:时间类型,格式为:hh:mm:ss;

    timestamp:时间戳类型,年月日分时秒。

  注意:在数据库中所有的字符串类型必须使用单引号,不能使用双引号,日期类型也用单引号。

  (一)ddl:对表的操作。

    1.创建表:create table 表名(列名 列类型,列名 列类型);

    2.查看数据库中所有表名称:show tables;

    3.删除表:drop table 表名;

    4.对表添加列:前缀:alter table 表名 add(列名 列类型,列名,列类型,...);

    5.改变表的列类型:alter table 表名 modify 列名 列类型;

    6.更改表名: alter table 表名 rename to 新名;

    7.删除列:alter table 表名 drop 列名;

    8.修改列名:alter table 表名 change 原列名 新列名 列类型;

  (二)dcl(理解):对用户的创建及授权:

    创建用户:create user 用户名@IP地址 IDENTIFIED BY'密码',用户只能在指定IP上登录。

         create user 用户名@'%' IDENTIFIED BY'密码',用户可以在任意IP上登录。

    给用户授权:grant all on 数据库 .* to 用户名@IP地址;

    撤销授权:REVOKE 权限1 ON 数据库 .* from 用户名@IP地址;

    查看权限:show grants for 用户名@IP地址;

    删除用户:drop user 用户名@IP地址;

  (三)dml:数据库操作语言,它是对表记录的操作(增、删、改)。

    1.插入数据:insert into 表名 (列名1,列名2,...)values(列值1,列值2,...)。

            >在表名后给出要插入的列名,其他没有指定的列等同于插入Null值,所以插入数据都是一行,没有半行。

            >在values后给出列值,值的顺序和个数必须与前面指定的列相同。

          insert into 表名 values(列值1,列值2)。

            >没有给出要插入的列,那么表示要插入所有列。

            >值的个数必须是该表列的个数,值的顺序必须与表创建时给出的列顺序相同。

    2.修改数据:update 表名 set 列名1 = 列值1,列名2=列值2,......where 条件。条件是可选的

    3.删除数据:*delete from 表名 where 条件;  * truncate table 表名: truncate是ddl语句,它是先drop该表,再create该表,而且无法回滚!

  (四)dql:对表的记录查询 :

    i.基本查询:

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

      2.查询指定列:select 列名1,[列名2,...,列名N]from 表名;

      3.完全重复记录只一次:select distinct * | 列名1,[列名2,...,列名N]from 表名;

        例如select  distinct sal from emp;查询员工表的工资,如果存在完全相同的工资只显示一次!

      4.列运算:1)数据类型相同的列可以做加减乘除运算。这只是一种查询手段,不修改数据库的值,只在查询结果后追加一列。

              select sal *1.5 from emp; select sal+com from emp;        emp是员工表,sal表示工资,com表示佣金; 

          2) 转换NULL值:有时需要把null值转换成其他值,例如com+1000时,如果com列存在null值,那么null+1000还是null,而我们希望把null值当成0来运算。

              select IFNULL(com,0)+1000 from emp;  -->IFNULL(com,0)如果com中存在null值,那么当成0来运算。

           3)给列起别名:你也许已经注意到了,当使用列运算后,查询出的结果集中的列名称很不好看,这时我们需要给列起个别名,这样结果集中就能显示别名

              select IFNULL(com,0)+1000 as 奖金 from emp;--->其中as可以省略。

    ii.条件查询:与前面介绍的update和delete语句一样,select语句也可以使用where子句来控制记录。

          select empno, sal from emp where sal>15000;

          练习:找出部门编号为10中所有经理,和部门编号为20中所有销售员的详细资料。

          select * from emp where (deptno = 10 and job='经理') or (deptno=20 and job='销售员');

          练习:找出部门编号为10中所有经理,和部门编号为20中所有销售员,还有既不是经理又不是销售员但其工资大于或登陆20000的所有员工的详细资料。 

          select * from emp where (deptno =10 and job='经理') or (deptno=20 and job='销售员') or(job not in('经理',‘销售员’) AND sal >=20000);

          练习:无奖金或奖金低于1000的员工;

          select * from emp where com is null or com<1000;

    iii.模糊查询:当你想查询姓张,并且名字一共由两个字组成时,就可以使用模糊查询。

          select * from emp where name like '张_';-->模糊查询需要使用like运算符,其中'_'匹配一个字符,注意,只匹配一个而不是多个。

          当你想查询姓张,名字几个字都行的时候,就要使用'%'了。

          select * from emp where name like '%张%';-->其中%可以匹配0到多个字符。

  排序:

     规则: order by 列 序, 列 序;

    1.升序:select * from emp order by sal ASC;-->按sal排序,升序!其中,ASC可以省略,省略默认升序。

    2.降序:select * from emp order by sal DESC;-->按sal降序排序。DESC不能省略。

    3.使用多列作为排序条件:select * from emp order by sal ASC ,com DESC;

  聚合函数:聚合函数用来做某列的纵向运算。

    1.count(*):计算所有行不为空的数。()中可传入参数

      select count(*)  from emp;计算emp表中所有列不为Null的记录的行数。

      select count(com)from emp;计算emp表中com列不为null的记录的行数。

    2.sum():

      select  sum(sal) from emp;查询工资和;

    3.max():

      select max(sal) from emp;查询最高工资;

    4.min():

      select min(sal) from emp;查询最低工资;

    5.avg():

      select avg(sal) from emp;查询平均工资;

  分组查询:group by。

  举个通俗的例子,全班的同学站排,男生站一排,女生站一排,这就是用性别来分组。当然,用来分组的列必需有重复列才有意义,如果按名字或者身份证号来分,会分出很多单一的组,这样是毫无意义的。分完组之后,还要相应的查询组信息。组信息跟单行记录的信息是不同的,比如分好组之后,你属于男生这排还是女生这排,这就是在问你组信息。而你这个人的信息就是单行记录的信息。总之记住一句话,分组查询查的是组信息,不能 携带个人信息。组信息有个特点,就是都用聚合函数来表示。

  select job,count(*) from emp ;没分组之前。

  select job,count(*) from emp group by job;分组之后。逗号之前的字段也就是红色字体必需跟group by后面的字段一一对应。

    例:select deptno,count(*)from emp where sal>15000 group by deptno having count(*)>=2;

    注:前置条件用where,后置条件用having;emp是员工表,deptno是该表的列表示部门编号,sal是员工表的列表示薪水。

      以部门分组,查询每组记录数。前置条件为工资大于15000,后置条件为记录数大于等于2。这句话的意思是,查询员工工资大于15000且员工数量超过2个的部门编号。

  总结一下sql语句执行顺序。select from where, group by, having, order by。先执行where条件,筛选完之后分组,分完组执行having条件,最后在进行排序。