数据库学习

218 阅读4分钟
  1. Oracle所能够定义的数据类型

     CHAR:固定长度的字符串,没有存储字符的位置,用空格填充。
     VARCHAR2:可变长度的字符串,自动去掉前后的空格。
     NUMBER(M, N):数字型,M是位数总长度, N是小数的长度。
     DATE:日期类型,包括日期和时间在内。
     BOOLEAN:布尔型,即逻辑型。
    
  2. Mysql所能够定义的数据类型

     INT或者INTEGER(占据4字节)
     FLOAT(4字节):单精度浮点数值
     DOUBLE(8字节):双精度浮点值
     DATE(3字节):日期值YYYY-MM-DD
     CHAR(0-255):变长字符串
     VARCHAR(0-65535):变长字符串
     TEXT(0-65535):长文本数据
    
  3. MYSQL所能够创建的数据约束

     primary key (PK)      #标识该字段为该表的主键,可以唯一的标识记录,主键就是不为空且唯一当然其还有加速查询的作用
     foreign key (FK)      #标识该字段为该表的外键,用来建立表与表的关联关系
          类似的使用foreign key(dep_id) references dep(id)     
     not null              #标识该字段不能为空
         name varchar(10) not null
     unique key (UK)       #标识该字段的值是唯一的
         id int unique key
     auto_increment        #标识该字段的值自动增长(整数类型,而且为主键)
         id int auto_increment
     default               #为该字段设置默认值
         grade int default 60
    
    • 可以对约束进行命名,例如:

        constraint pk_name primary key(id);
      
    • 当约束作用于多个属性时,可以在表创建的最后书写,比如

            unique key(属性1,属性2,属性3)
      
    • 具体实例:在创建表时使用了几种比较常见的约束

       CREATE TABLE publishing_company(
              pub_com_number    INT PRIMARY KEY auto_increment,
        	pub_com_name      VARCHAR(20) NOT NULL,
        	address 	  VARCHAR(10)  NOT NULL,
        	telephone_number  VARCHAR(12)
        );
      
      • 上面语句运行后的结果
    • 外键约束的使用

      • 语法[CONSTRANT 约束名] FOREIGN KEY(列名1,列名2,...)REFERENCES 表名(列名1,列名2,...) - -

      • 如果子记录存在,则不允许删除主记录

      • 创建两个数据表,first作为主表,second作为子表,second创建一个外键约束

          CREATE TABLE first(
              	id int PRIMARY KEY,
              	first_name 	VARCHAR(10) NOT NULL,
              	address VARCHAR(20) NOT NULL
          );  
          CREATE TABLE second(
          	second_id int PRIMARY KEY,
          	first_name 	VARCHAR(10) NOT NULL,
          	address VARCHAR(20) NOT NULL,
          	FOREIGN KEY(second_id) REFERENCES first(id)
          );
        
      • 创建表的结果

  • 在子表中插入数据:此时主表中存在下方这两条记录

                 mysql> select * from first;
                         +----+------------+---------+
                         | id | first_name | address |
                         +----+------------+---------+
                         |  1 | gjirgje    | fajifas |
                         |  2 | gjagrt     | gkjoig  |
                         +----+------------+---------+
                         2 rows in set (0.08 sec)           
    
  • 在子表中插入记录,但是待插入记录中外键索引的列的值在主表中不存在,那么将无法插入成功,通过下图可看出确实是这样子,其中插入的表second的id列的值为3,但是fisrt表中并不存在id值为3的记录,此时插入将失败

    • 当子记录存在时(子表中的记录),主记录将不被允许删除(主表中的记录)

  • 第二种语法,如果子记录存在,则删除主记录时,级联删除子记录

      [CONSTRANT 约束名] FOREIGN KEY(列名1,列名2,...)REFERENCES 表名(列名1,列名2,...)on delete cascade
    
      - 通过下面语句将数据表second删除,重新创建出second数据表
      drop table second;
      CREATE TABLE second(
      	second_id int PRIMARY KEY,
      	first_name 	VARCHAR(10) NOT NULL,
      	address VARCHAR(20) NOT NULL,
      	FOREIGN KEY(second_id) REFERENCES first(id) ON DELETE CASCADE
      );
    
    • 删除主表的记录时,子表中的记录也会被随之删除

    • 此时数据表first和second中存在的数据

    • 运行以下语句

        mysql> delete from first where id  = 1;
      
    • 结果如下所示,可以看出删除主表的记录之后,子表对应的记录也被随之删除

    • 外键约束能够设置成以下约束

      第三种语法,如果子记录存在,则更新主记录时,级联更新子记录:

        [CONSTRANT 约束名] FOREIGN KEY(列名1,列名2,...)REFERENCES 表名(列名1,列名2,...)on update cascade (oracle 9i 不支持)
      

      第四种语法,如果子记录存在,则删除主记录时,将子记录置成空:

        [CONSTRANT 约束名] FOREIGN KEY(列名1,列名2,...)REFERENCES 表名(列名1,列名2,...)on delete set null其中的表名为要参照的表名。
      
  1. 显示表的结构

          DESCRIBE 表名
    
  2. 通过查询结果创建表

    • ORACLE语法

         CREATE TABLE 表名(列名...) AS SQL查询语句;
      
    • MYSQL语法

        CREATE TABLE 表名(SQL语句),SQL语句中待查询的列就是新表的列;
      
    • 具体实例:

      • 数据库本来存在的数据表

      • 通过查询语句创建表

      • 创建出的表的结果

    • 在复制表时如果不想要复制数据,只需要在查询语句后面添加一个不可能实现的语句即可