• 一、如何使用终端操作数据库

  • 如何登陆数据库服务器

    1
    mysql -uroot -p

    image-20210419101047635

  • 如何查询数据库服务器中所有的数据

    1
    show databases;

    image-20210419100514663

  • 如何选中某一个数据库进行操作

    1
    use sushe;

    image-20210419100606162

    • SQL语句中的查询
    1
    select * from admin;

    image-20210419100728472

    • 只查询Admin_ID中的一条

      1
      select * from admin where Admin_ID=1;

      image-20210419102716439

    • 如何退出数据库服务器

      1
      exit;
    • 如何在数据库服务器中创建我们的数据库

      1
      create database test;

      image-20210419103011881

    • 使用test数据库进行操作

      1
      use test;
    • 查看数据库中的数据表

      1
      show tables;

      image-20210419103151476

    • 创建一个数据表

      1
      2
      3
      4
      5
      6
      7
      CREATE TABLE pet (
      name VARCHAR(20),
      owner VARCHAR(20),
      species VARCHAR(20),
      sex CHAR(1),
      birth DATE,
      death DATE);

      image-20210419103553869

    • 查看数据表是否创建成功

      1
      show tables;

      image-20210419103659284

    • 查看创建好的数据表的结构

      1
      describe pet;

      image-20210419103818698

    • 查看数据表中的记录

      1
      select * from pet;

      image-20210419104228606

    • 如何往数据表中添加数据记录

      1
      2
      INSERT INTO pet
      VALUES'Puffball','Diane','hamster','f','1999-03-30',NULL);
    • 再次查询

      1
      select * from pet;

      image-20210419104507492

    • 删除数据

      1
      delete from pet where name='Fluffy';

      image-20210419110249261

      image-20210419110317720

    • 修改数据

      1
      update pet set name='旺旺才' where owner='周星驰';
  • mysql常用数据类型

    • 日期选择按照格式;数值字符串按照大小!

    • MySQL支持多种类型,大致可以分为三类:

    • 数值

      类型 大小 范围(有符号) 范围(无符号) 用途
      TINYINT 1 byte (-128,127) (0,255) 小整数值
      SMALLINT 2 bytes (-32 768,32 767) (0,65 535) 大整数值
      MEDIUMINT 3 bytes (-8 388 608,8 388 607) (0,16 777 215) 大整数值
      INT或INTEGER 4 bytes (-2 147 483 648,2 147 483 647) (0,4 294 967 295) 大整数值
      BIGINT 8 bytes (-9,223,372,036,854,775,808,9 223 372 036 854 775 807) (0,18 446 744 073 709 551 615) 极大整数值
      FLOAT 4 bytes (-3.402 823 466 E+38,-1.175 494 351 E-38),0,(1.175 494 351 E-38,3.402 823 466 351 E+38) 0,(1.175 494 351 E-38,3.402 823 466 E+38) 单精度 浮点数值
      DOUBLE 8 bytes (-1.797 693 134 862 315 7 E+308,-2.225 073 858 507 201 4 E-308),0,(2.225 073 858 507 201 4 E-308,1.797 693 134 862 315 7 E+308) 0,(2.225 073 858 507 201 4 E-308,1.797 693 134 862 315 7 E+308) 双精度 浮点数值
      DECIMAL 对DECIMAL(M,D) ,如果M>D,为M+2否则为D+2 依赖于M和D的值 依赖于M和D的值 小数值
    • 日期/时间

      类型 大小 ( bytes) 范围 格式 用途
      DATE 3 1000-01-01/9999-12-31 YYYY-MM-DD 日期值
      TIME 3 ‘-838:59:59’/‘838:59:59’ HH:MM:SS 时间值或持续时间
      YEAR 1 1901/2155 YYYY 年份值
      DATETIME 8 1000-01-01 00:00:00/9999-12-31 23:59:59 YYYY-MM-DD HH:MM:SS 混合日期和时间值
      TIMESTAMP 4 1970-01-01 00:00:00/2038结束时间是第 2147483647 秒,北京时间 2038-1-19 11:14:07,格林尼治时间 2038年1月19日 凌晨 03:14:07 YYYYMMDD HHMMSS 混合日期和时间值,时间戳
    • 字符串(字符)

      类型 大小 用途
      CHAR 0-255 bytes 定长字符串
      VARCHAR 0-65535 bytes 变长字符串
      TINYBLOB 0-255 bytes 不超过 255 个字符的二进制字符串
      TINYTEXT 0-255 bytes 短文本字符串
      BLOB 0-65 535 bytes 二进制形式的长文本数据
      TEXT 0-65 535 bytes 长文本数据
      MEDIUMBLOB 0-16 777 215 bytes 二进制形式的中等长度文本数据
      MEDIUMTEXT 0-16 777 215 bytes 中等长度文本数据
      LONGBLOB 0-4 294 967 295 bytes 二进制形式的极大文本数据
      LONGTEXT 0-4 294 967 295 bytes 极大文本数据

      mysql建表约束

    • 主键约束

      • 它能够唯一确定一张表中的一条记录,也就是我们通过给某个字段添加约束,就可以使得该字段不重复且不为空。

        1
        2
        3
        4
        CREATE TABLE user (
        id INT PRIMARY KEY,
        name VARCHAR(20)
        );

        image-20210419111116893

        • – 联合主键
          – 联合主键中的每个字段都不能为空,并且加起来不能和已设置的联合主键重复。
        1
        2
        3
        4
        5
        6
        CREATE TABLE user (
        id INT,
        name VARCHAR(20),
        password VARCHAR(20),
        PRIMARY KEY(id, name)
        );
        1
        insert into user values(1,'张三','123');
    • 自增约束

      • 管控id的值让他可以增长
      1
      2
      3
      4
      5
      CREATE TABLE user (
      id INT PRIMARY KEY AUTO_INCREMENT,
      name VARCHAR(20)
      );

      1
      insert into user (name) values('zhangsan');
      • 忘记创建主键约束怎么办,可以通过SQL语句设置(两种方式):

        1
        2
        3
        4
        5
        CREATE TABLE user (
        id INT,
        name VARCHAR(20)
        );

        • ```
          desc user
          1
          2
          3
          4
          5
          6
          7
          8

          ![image-20210419135347642](https://img.imgdb.cn/item/607d33918322e6675c0e993b.png)

          * 修改表结构,添加主键

          ```sql
          ALTER TABLE user ADD PRIMARY KEY(id);
          ALTER TABLE user MODIFY id INT PRIMARY KEY;

        image-20210419140048250

        • 如何删除

          1
          alter table user drop primary key;

          image-20210419140205166

    • 唯一约束

      • 约束修饰的字段的值不能重复
      1
      2
      3
      4
      create table user(
      id int,
      name varchar(20)
      );
      • 添加唯一约束

        1
        alter table user add unique(name);

        image-20210419140558495

      • 创建表的时候添加唯一约束

        1
        2
        3
        4
        5
        6
        7
        8
        9
        10
        11
        12
        13
        14
        15
        16
        17
        18
        19
        create table user(
        id int,
        name varchar(20),
        unique(name)
        );

        // 或者

        create table user(
        id int,
        name varchar(20) unique
        );

        //unique(id,name)表示两个键在一起不重复就行
        create table user(
        id int,
        name varchar(20),
        unique(id,name)
        );

        image-20210419140816729

      • 删除唯一约束

        1
        alter table user drop index name;
      • modify添加

        1
        alter table user modify varchar(20) unique;
      • 总结:

        1
        2
        3
        4
        5
        1、建表的时候添加约束
        2、可以使用alter... add ...
        3、alter... modify ...
        4、删除alter ... drop ...

    • 非空约束

      • 修饰的字段不能为空

        1
        2
        3
        4
        CREATE TABLE user (
        id INT,
        name VARCHAR(20) NOT NULL
        );

        image-20210419141716219

      • 不传入name值会报错

        1
        2
        3
        insert into user (id) values(1);
        //正确用法
        insert into uservalues(1,'zhangsan');
    • 默认约束

      • 当我们插入字段值时,如果没有传值,就会使用默认值

        1
        2
        3
        4
        5
        create table user(
        id int,
        name varchar(20),
        age int default 10
        );

        image-20210419142616113

    • 外键约束

      • 涉及到两个表:父表,子表

      • 主表,副表

      • 班级表

        1
        2
        3
        4
        create table classes(
        id int primary key,
        name varchar(20)
        );
      • 学生表

        1
        2
        3
        4
        5
        6
        create table classes(
        id int primary key,
        name varchar(20),
        class_id int,
        foreign key(class_id) references classes(id)
        );

        image-20210419143103219

      • 插入四个班

        1
        2
        3
        4
        insert into calsses values(1,'一班');
        insert into calsses values(2,'二班');
        insert into calsses values(3,'三班');
        insert into calsses values(4,'四班');

        image-20210419143606566

      • 往对应的班级添加学生信息

        1
        2
        3
        4
        insert into calsses values(1001,'一班',1);
        insert into calsses values(1002,'二班',2);
        insert into calsses values(1003,'三班',3);
        insert into calsses values(1004,'四班',4);
      • 结论

        • 主表classes中没有的数据值,在副表中,是不可以使用的。
        • 主表中的记录被副表引用,是不可以被删除的。

    数据库的三大设计范式

    • 第一范式(1NF)

      • 数据表中的所有字段都是不可分割的原子值

        1
        2
        3
        4
        5
        6
        7
        8
        9
        create table student(
        id int primary key,
        name varchar(20),
        address varchar(30)
        );

        inser into student values(1,'张三','中国四川省成都市武侯区武侯大道100号');
        inser into student values(2,'李四','中国四川省成都市武侯区武侯大道200号');
        inser into student values(3,'王五','中国四川省成都市武侯区武侯大道300号');

        image-20210419150252138

      • 字段还可以继续拆分,就不满足第一范式

        1
        2
        3
        4
        5
        6
        7
        8
        9
        10
        11
        12
        create table student(
        id int primary key,
        name varchar(20),
        country varchar(30),
        privence varchar(30),
        city varchar(30),
        details varchar(30)
        );

        inser into student values(1,'张三','中国','四川省','成都市','武侯区武侯大道100号');
        inser into student values(2,'李四','中国','四川省','成都市','武侯区武侯大道100号');
        inser into student values(3,'王五','中国','四川省','成都市','武侯区武侯大道100号');

        image-20210419150357502

      • 范式,设计的越详细,对于某些实际操作可能更好,单不一定都是好处。

    • 第二范式(2NF)

      • 在满足第一范式的前提下,其他列都必须完全依赖于主键列。

      • 如果出现不完全依赖,只可能发生在联合主键的情况下。

      • 订单表

        1
        2
        3
        4
        5
        6
        7
        CREATE TABLE myorder (
        product_id INT,
        customer_id INT,
        product_name VARCHAR(20),
        customer_name VARCHAR(20),
        PRIMARY KEY (product_id, customer_id)
        );
      • 除了主键以外的列,只依赖于主键的部分字段。

      • 实际上,在这张订单表中,product_name 只依赖于 product_idcustomer_name 只依赖于 customer_id 。也就是说,product_namecustomer_id 是没用关系的,customer_nameproduct_id 也是没有关系的。

      • 拆表

        1
        2
        3
        4
        5
        6
        7
        8
        9
        10
        11
        12
        13
        14
        15
        CREATE TABLE myorder (
        order_id int primary key,
        product_id int,
        customer_id int
        );

        CREATE TABLE product (
        id int primary key,
        name varchar(20)
        );

        CREATE TABLE customer (
        id int primary key,
        name varchar(20)
        );
      • 拆分之后,myorder 表中的 product_idcustomer_id 完全依赖于 order_id 主键,而 productcustomer 表中的其他字段又完全依赖于主键。满足了第二范式的设计!

    • 第三范式(3NF)

      • 必须先满足第二范式,除开主键的其他列之间不能传递依赖

        1
        2
        3
        4
        5
        6
        CREATE TABLE myorder (
        order_id INT PRIMARY KEY,
        product_id INT,
        customer_id INT,
        customer_phone VARCHAR(15)
        );
      • 表中的 customer_phone 有可能依赖于 order_idcustomer_id 两列,也就不满足了第三范式的设计:其他列之间不能有传递依赖关系。

        1
        2
        3
        4
        5
        6
        7
        8
        9
        10
        11
        CREATE TABLE myorder (
        order_id INT PRIMARY KEY,
        product_id INT,
        customer_id INT
        );

        CREATE TABLE customer (
        id INT PRIMARY KEY,sql
        name VARCHAR(20),
        phone VARCHAR(15)
        );
      • 修改后就不存在其他列之间的传递依赖关系,其他列都只依赖于主键列,满足了第三范式的设计!

      • 参考文献:一天学会 MySQL 数据库