数据库从零开始(1)

    以Oracle来开始学习数据库,和其他数据库不同的是,Oracle要先建立表空间,一切操作基于表空间。

/*创建物理表空间*/
CREATE TABLESPACE SC1907_data
LOGGING
DATAFILE 'C:\oraclexe\app\oracle\oradata\XE\SC1907_data.dbf'
SIZE 10M
AUTOEXTEND ON
NEXT 2M MAXSIZE 50M;

/*创建临时表空间,用于存放临时数据*/
CREATE TEMPORARY TABLESPACE SC1907_temp
TEMPFILE 'C:\oraclexe\app\oracle\oradata\XE\SC1907_temp.dbf'
SIZE 5M
AUTOEXTEND ON
NEXT 1M MAXSIZE 20M;

/*创建用户*/
CREATE USER admin IDENTIFIED BY root
DEFAULT TABLESPACE SC1907_data
TEMPORARY TABLESPACE SC1907_temp;

/*给新创用户授权*/
GRANT CONNECT,RESOURCE TO admin;

建表之三范式3NF:
    1NF: 需要细分各个字段,分到不可再分;
            比如地址要细分为: 省, 市, 区, 街道四列,而不应该为就一列: 地址..
            以下这种情况也不可以:

            比如姓名:  不能分为  姓 ,名

    2NF: 确保每一行数据的唯一性;
            解决办法: 使用主键或唯一键;

    3NF:非主键字段不能相互依赖;

           满足第三范式(3NF)必须先满足第二范式(2NF)。

在表空间的基础上创建简单学生表(SQL不区分大小写 ps:推荐大写):

/*建表*/
create table t_student(
       stu_number number(4),
       stu_name varchar(20),
       gender char(1),
       birthday date,
       sal number(8.2)
);
/*提交才能真正持久化(写入硬盘)*/
commit;

SQL数据类型:number保存数字,number(8.2)表示可以有8位整数2位小数,char保存字符串,date保存日期,varchar保存字符串并且可以根据字符串长度调整大小,与char相比效率低。

varchar与varchar2的区别:

      1.varchar2把所有字符都占两字节处理(一般情况下),varchar只对汉字和全角等字符占两字节,数字,英文字符等都是一个字节;

      2.varchar2把空串等同于null处理,而varchar仍按照空串处理;

      3.varchar2字符要用几个字节存储,要看数据库使用的字符集, 大部分情况下建议使用varchar2类型,可以保证更好的兼容性。

数据的增删改及简单查询:

/*查询*/
SELECT * FROM T_STUDENT;
/*插入数据*/
INSERT INTO T_STUDENT VALUES(9527,'周星星','1',sysdate,100.59);
INSERT INTO T_STUDENT(stu_name,sal) VALUES('pig',695);
/*修改*/
UPDATE T_STUDENT SET sal = 100 WHERE stu_number is null;
/*删除*/
DELETE FROM T_STUDENT WHERE STU_NUMBER = 9527;
TRUNCATE TABLE T_STUDENT;
DROP TABLE T_STUDENT;

三种删除的比较:

   1.删除数据不删除定义,记录日志,删除速度慢,可以带条件,可以还原。

      delect [from] 表名 [where 列名 m = 值 m ... ]
      dml
  2.截断表,不带条件,不删除定义,删除日志和数据 ,速度快,不能还原
     truncate table 表名
     ddl

  3.删除表定义和数据
     drop table 表名
     ddl

判断null必须用 is null 不能用=null,判断非null 必须用 is not null。

设置主键:

ALTER TABLE T_STUDENT ADD CONSTRANINT stu_pk primary key (STU_NUMBER);

主键:一个表只能有一个主键(PS:一个主键可以是单列也可以是联合组件,即多列组合的主键),主键不能为null,且不能重复。

SQL语言一共分为4大类:数据定义语言DDL,数据操纵语言DML,数据查询语言DQL,数据控制语言DCL 。

1.数据定义语言DDL(Data Definition Language)

       对象: 数据库和表

  关键词: create alter drop truncate(删除当前表再新建一个一模一样的表结构)

  创建数据库:create database school;

  删除数据库:drop database school;

  切换数据库:use school;

  创建表:create table student(

      id int(4) primary key auto_increment,

      name varchar(20),

      score int(3)

    );

  查看数据库里存在的表:show tables;

2.数据操纵语言DML(Data Manipulation Language) 

        对象:纪录(行)

  关键词:insert update delete

  插入:insert into student values(01,'tonbby',99); (插入所有的字段)

     insert into student(id,name) values(01,'tonbby'); (插入指定的字段)

  更新:update student set name = 'tonbby',score = '99' where id = 01;

  删除:delete from tonbby where id = 01;

3.数据查询语言DQL(Data Query Language)

       select ... from student where 条件 group by 分组字段 having 条件 order by 排序字段

  执行顺序:from->where->group by->having->order by->select

  注意:group by 通常和聚合函数(avg(),count()...)一起使用 ,经常先使用group by关键字进行分组,然后再进行集合运算。group by与having 一起使用,可以限制输出的结果,只有满足条件表达式的结果才会显示。

  having和where的区别:

    两者起作用的地方不一样,where作用于表或视图,是表和视图的查询条件。having作用于分组后的记录,用于选择满足条件的组。

4.数据控制语言DCL(Data Control Language)  

         数据控制语言DCL用来授予或回收访问数据库的某种特权,并控制数据库操纵事务发生的时间及效果,对数据库实行监视,用户,权限,事务等。

         关键词:grant:授权,rollback:回滚。commit:提交。

日期格式详解:

          sysdate:获取系统时间,精确到秒;

          to_date:按固定格式得到日期数据,可以+1(单位天),如果要加一小时则为+1/24;

          to_char:按固定格式得到字符串数据,连接两个字符串用“||”。

--系统时间
SELECT SYSDATE FROM dual;
--将字符串转化为日期
SELECT to_date('2018-9-10 16:30:59','yyyy-mm-dd hh24:mi:ss') FROM dual;
--将日期转为字符串
SELECT to_char(SYSDATE,'yyyy/mm/dd hh24:mi:ss') FROM dual;

    注意:dual是Oracle自带的表,hh24也可为hh但hh24能表示13:30:59,hh不能。

你可能感兴趣的:(数据库从零开始(1))