暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

关系型数据库:MySQL(小白入门)

拾玖屿 2020-03-25
289

增删改查:

增加 insert into table values();

删除 delete from table where ...;

修改 update ... set ... where ...;

查询 select

查看数据表结构

mysql> describe table;


约束

1、主键约束(不可重复,不可为空)

    Primary key约束,联合主键值加起来不重复即可
    自增约束
    重复则自动增长
    后添加主键Alter table table_name add primarykey(id);
    删除alter table table_name drop primary key;

    2、唯一约束

      Unique禁止重复
      Unique(id,name)表示两个键在一起不重复即可
      删除alter table table_name drop index name;
      添加alter table table_name modify namevarchar(20) unique;
      建表就添加约束
      可使用alte...add..
      alter...modify...
      删除alter...drop..


       

      3、非空约束

      修饰字段不能为空 NULL

       

      4、默认约束

      插入字段,未传值,则用默认值

      传值了,则不会使用默认值

       

      5、外键约束

      涉及:主表,副表

      1、主表没有的数据,副表不能用

      2、主表记录被副表引用,不能删除

       

      三大设计范式

       

      第一范式(拆字段)

      1NF

      字段可继续拆,则不满

      范式,设计越详细,对某些操作可能更好,但不一定都是好处

       

      第二范式

      2NF

      1NF+除主键外的每一列都必须完全依赖与主键

      如果不完全依赖,只可能发生在联合组件

       

      问题,除主键以外的其他列,只依赖与主键的部分字段,怎么办?

      答:拆表

      分成三个后,就满足第二范式

        例:
        createtable myorder(
        product_idint,
        customer_idint,
        product_namevarchar(20),
        customer_namevarchar(20),
        primarykey(product_id,customer_id)
        );


        拆分:
        createtable myorder(
          order_idint primary key,
        product_idint,
        customer_idint,
        );
        createtable product(
        idint primary key
          namevarchar(20)
        );

        createtable customer(
          idint primary key,
        name varchar(20)
        );

        分成三个后,就满足第二范式

        第三范式

        3NF

        2NF+除主键外的其他列之间不能有传递依赖关系

         

        mysql查询练习

        distinct(排除重复)

        查询区间between...and...

        表示或关系 in

        表或者 or

        降序desc,升序asc

        统计count

        分组 group by

        联合求并集 union

        表示任意一个 any

        表示所有 all

        别名 as

        最大max(…),最小min(…)

         

         

        SQL的四种连接查询

         

        一、内连接

              innerjoin 或 join

              内联查询,其实就是两张表中的数据,通过某个字段相等,查询出相关记录数据。

         

        二、外连接

        1、左连接 left join 或者 left outer join        

        左外连接,会把左边表里面所有数据取出来,而右边表中的数据,如果有相等的,就显示出来,没有,会补NULL

        2、右连接 right join 或者 right outer join

        右外连接,会把右边表里面所有数据取出来,而左边表中的数据,如果有相等的,就显示出来,没有,会补NULL

        3、完全外连接 full join 或者 full outer join

        mysql不支持 full join

         

         

        mysql事务

         

        mysql中,事务其实是一个最小的不可分割的工作单元,事务能够保证一个业务的完整性,比如银行转账。

         

        实际的程序中,如果只有一条语句执行成功了,而另外一条没有执行成功?

        因为出现数据前后不一致。

         

        多条sql语句,可能会有同时成功的要求,要么就是同时失败。

         

          那么mysql中如何控制事务呢?

         

           自动提交?@@autocommit

           手动提交?commit;

           事务回滚?rollback;

         

        mysql默认是开启事务的。(自动提交)

          mysql> select @@autocommit;
          +--------------+
          | @@autocommit |
          +--------------+
          | 1 |
          +--------------+
          1 row in set (0.00 sec)

          默认事务开启的作用是什么?

                当我们去执行一个sql语句的时候,效果会立即体现出来,且不能回滚。

          事务回滚:撤销sql语句执行效果(rollback)

           

                 设置mysql自动提交为false

            set autocommit=0;
            mysql> select @@autocommit;
            +--------------+
            | @@autocommit |
            +--------------+
            | 0 |
            +--------------+
            1 row in set (0.00 sec)
            上面的操作,关闭了mysql的自动提交(commit)

             

                再一次插入数据

                手动提交数据

                再撤销是不可以撤销的(持久性)

             

                如果这时候插入数据:

                事务给我们提供了一个返回的机会;

             

                begin; 或者 start transaction都可以手动开启一个事务;

                开启事务后,事务回滚,没有被撤销

                手动开启事务后,回滚,被撤销

                事务开启后,一旦commit提交,就不可以回滚(即提交时就结束了)

             

            事务的四大特性(ACID):

                原子性(Atomicity)事务单元最小的单位,不可再分割。

                一致性(Consistency):失误要求,同一事务中的sql语句,必须保持同时成功或者同时失败。

                隔离性(Isolation):事务1 和事务2 之间具有隔离性。

                持久性(Durability):事务一旦结束(commit,rollback),就不可以返回

             

            事物的隔离性:

            1、readuncomitted; 读未提交的

            2、readcommitted; 读已提交的

            3、repeatableread; 可以重复读

            4、serializable;串行化

             

            --如何查看数据库的隔离级别?

              mysql  8.0;
              --系统级别
              select @@global.transaction_isolation;
              --会话级别
              select @@transaction_isolation;

              mysql 5.x;
              select @@global.tx_isolation;
              select @@tx_isolation;

              --mysql默认隔离级别 REPEATABLE-READ          

               

              --如何修改隔离级别?

              mysql> set global transaction isolationlevel 级别;

               

              1-read uncomitted

              如果有事务a,和事务b.

              a 事务对数据进行操作,在操作过程中,事务没有被提交,但是b 可以看见a 操作的结果

               

                    如果两个不同的地方,都在进行操作,如果事务a开启之后,他的数据可以被事务读取到。这样就会出现(脏读)

                    脏读:一个事务读取到另外一个事务没有提交的数据。

                    实际开发是不允许脏读出现的。

               

              2、readcommitted;  读已提交的

                    虽然只能读取到另外一个事务提交的数据,但还会出现问题

                    读取同一个表的数据,发现前后不一致。

                    不可重复读取现象:read committed

               

              3、repeatableread;  可以重复读

                    会导致幻读:

                    即事务a 和事务b 同时操作一张表,事务a 提交的数据,也不能被事务b 读取到,就可以造成幻读。

               

              4、serializable;  串行化

              sql语句被卡住

                    当表被另外一个事务操作的时候,其他事务里面的写操作,是不可以进行的。

                    进入排队状态(串行化),直到d 事务结束后,c 这个的写入操作才会执行。

                    在没有等待超时的情况下

               

              *串行化问题,性能差!!

               

              性能优到差(隔离级别越高,性能越差):

              READ-UNCOMMITTED>READ-COMMITTED>REPEATABLE-READ>SERIALIZABLE

              mysql 默认隔离级别为 REPEATABLE-READ


                   个人观点,学数据库应该多加练习,做到熟悉增删改查。

                   最后希望大家能在公众号给我留言,需要改正的地方。

              文章转载自拾玖屿,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

              评论