MySQL学习笔记

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

  • 如何登陆数据库服务器

    mysql -uroot -p
    

    image-20210419101047635

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

    show databases;
    

    image-20210419100514663

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

    use sushe;
    

    image-20210419100606162

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

    image-20210419100728472

    • 只查询Admin_ID中的一条

      select * from admin where Admin_ID=1;
      

      image-20210419102716439

    • 如何退出数据库服务器

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

      create database test;
      

      image-20210419103011881

    • 使用test数据库进行操作

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

      show tables;
      

      image-20210419103151476

    • 创建一个数据表

      CREATE TABLE pet (
      	name VARCHAR(20),
      	owner VARCHAR(20),
      	species VARCHAR(20),
      	sex CHAR(1),
      	birth DATE,
      	death DATE);
      

      image-20210419103553869

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

      show tables;
      

      image-20210419103659284

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

      describe pet;
      

      image-20210419103818698

    • 查看数据表中的记录

      select * from pet;
      

      image-20210419104228606

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

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

      select * from pet;
      

      image-20210419104507492

    • 删除数据

      delete from pet where name='Fluffy';
      

      image-20210419110249261

      image-20210419110317720

    • 修改数据

      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建表约束

    • 主键约束

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

        CREATE TABLE user (
            id INT PRIMARY KEY,
            name VARCHAR(20)
        );
        

        image-20210419111116893

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

      • 管控id的值让他可以增长
      CREATE TABLE user (
          id INT PRIMARY KEY AUTO_INCREMENT,
          name VARCHAR(20)
      );
      
      
      insert into user (name) values('zhangsan');
      
      • 忘记创建主键约束怎么办,可以通过SQL语句设置(两种方式):

        CREATE TABLE user (
            id INT,
            name VARCHAR(20)
        );
        
        
        • desc user
          

        image-20210419135347642

        • 修改表结构,添加主键
        ALTER TABLE user ADD PRIMARY KEY(id);
        ALTER TABLE user MODIFY id INT PRIMARY KEY;
        

        image-20210419140048250

        • 如何删除

          alter table user drop primary key;
          

          image-20210419140205166

    • 唯一约束

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

        alter table user add unique(name);
        

        image-20210419140558495

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

        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

      • 删除唯一约束

        alter table user drop index name;
        
      • modify添加

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

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

      • 修饰的字段不能为空

        CREATE TABLE user (
            id INT,
            name VARCHAR(20) NOT NULL
        );
        

        image-20210419141716219

      • 不传入name值会报错

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

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

        create table user(
        	id int,
            name varchar(20),
            age int default 10
        );
        

        image-20210419142616113

    • 外键约束

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

      • 主表,副表

      • 班级表

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

        create table classes(
        	id int primary key,
            name varchar(20),
            class_id int,
            foreign key(class_id) references classes(id)
        );
        

        image-20210419143103219

      • 插入四个班

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

        image-20210419143606566

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

        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)

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

        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

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

        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)

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

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

      • 订单表

        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 也是没有关系的。

      • 拆表

        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)

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

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

        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 数据库

posted @ 2021-04-19 15:44  SssuperBear  阅读(43)  评论(0编辑  收藏  举报