什么是数据库?数据库就是用来存储和管理数据的仓库。首先我来简单介绍一下各数据库的背景,常见的数据库如下,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条件,最后在进行排序。