zoukankan      html  css  js  c++  java
  • 【oracle笔记1】增删改,数据类型,用户操作

      什么是数据库?数据库就是用来存储和管理数据的仓库。首先我来简单介绍一下各数据库的背景,常见的数据库如下,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(列名 列类型,列名,列类型,...);//赋值用[default 列值]

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

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

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

        8.修改列名:alter table 表名 rename column 原列名 to新列名;

      (二)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 条件。

          //注意:update修改值后必需使用commit提交,否则只在当前session有效。而且在给列值修改为Null时也用=,而不用is;

        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 NVL(com,0)+1000 from emp;  -->NVL(com,0)如果com中存在null值,那么当成0来运算。

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

                  select NVL(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;//注意这里条件后面的null用is来赋值。

        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条件,最后在进行排序。

      

  • 相关阅读:
    第三章 函数式编程中的异常处理
    第二章 函数式数据结构
    android 轮播图
    模仿qq列表信息滑动删除效果
    android绘制圆形图片的两种方式
    android图片验证码--自绘控件
    MPAndroidChart 3.0——LineChart(折线图)
    提交本地项目到github服务器
    android 帧动画,补间动画,属性动画的简单总结
    android AsynTask处理返回数据和AsynTask使用get,post请求
  • 原文地址:https://www.cnblogs.com/shaokai7878/p/9391754.html
Copyright © 2011-2022 走看看