美文网首页
MySQL(三)——DML、TCL和数据库的对象

MySQL(三)——DML、TCL和数据库的对象

作者: 贾里 | 来源:发表于2017-11-15 21:26 被阅读51次

    1.DML


    1.1INSERT

    INSERT INTO table [(column [, column...])] VALUES (value [, value...]);
    

    一般来说,一条INSERT只能插入一条数据,因为MYSQL没有batch操作,所以,MYSQL也支持在一条INSERT中插入多条数据

    INSERT INTO table [(column [, column...])] VALUES (value [, value...]),(value [, value...]),...
    

    当然,一条SQL的长度是有限的,可以通过调整max_allowed_packet参数;

    1.2UPDATE

    UPDATE   table
    SET column = value [, column = value] …
    [WHERE   condition];
    

    UPDATE语句也可以使用表连接,子查询等多种方式执行;

    1.3DELETE

    DELETE [FROM]   table
    [WHERE  condition];
    

    在delete语句中,where子句是可选的部分,如果使用了where子句,则删除的数据是符合where条件的所有记录;如果省略了where子句,则全表的数据都会被删除,delete语句的where条件也同样支持子查询,但是一定注意,删除语句中的where条件不能是要删除的数据表中的数据;所以,在涉及到删除的数据是通过要删除的表中的数据查询出来的,一般会把查询结果临时保存到另一张表,再通过delete语句删除;

    2.TCL


    2.1数据库事务概念

    在数据库中,所谓事务是指一组逻辑操作单元,使数据从一种状态变换到另一种状态。

    为确保数据库中数据的一致性,数据的操纵应当是离散的成组的逻辑单元:当它全部完成时,数据的一致性可以保持,而当这个单元中的一部分操作失败,整个事务应全部视为错误,所有从起始点以后的操作应全部回退到开始状态。

    说白了: 把多个操作看成是一个不可分割的整体(事务):

    • 如果多个操作都成功了,则认为成功. ------>提交事务
    • 如果多个操作中有一个失败,则认为失败.------>回滚事务.

    在MySQL中,InnoDB支持事务,MyISAM不支持.

    事务的操作:先定义开始一个事务,然后对数据作修改操作,这时如果提交(COMMIT),这些修改就永久地保存下来,如果回退(ROLLBACK),数据库管理系统将放弃您所作的所有修改而回到开始事务时的状态。

    2.2事务的ACID属性:

      1. 原子性(Atomicity)原子性是指事务是一个不可分割的工作单位,事务中的操作要么都发生,要么都不发生。
      1. 一致性(Consistency)事务必须使数据库从一个一致性状态变换到另外一个一致性状态。(数据不被破坏)
      1. 隔离性(Isolation)事务的隔离性是指一个事务的执行不能被其他事务干扰,即一个事务内部的操作及使用的数据对并发的其他事务是隔离的,并发执行的各个事务之间不能互相干扰。
      1. 持久性(Durability)持久性是指一个事务一旦被提交,它对数据库中数据的改变就是永久性的,接下来的其他操作和数据库故障不应该对其有任何影响

    2.3数据库的事务由下列语句组成:

    一组DML语句,修改的数据在他们中保持一致

    一个 DDL (Data Define Language) 语句

    一个 DCL (Data Control Language)语句

    • DCL(Grant(赋于权限 ) / Revoke(回收权限 ))

    2.4控制语句

    COMMIT和 ROLLBACK可以显示的控制事务。
    好处:
    1、保证数据一致性,修改过的数据在没有提交之前是不能被其他用户看到的。
    2、在数据永久性生效前重新查看修改的数据
    3、将相关操作组织在一起,一个事务中相关的数据改变或者都成功,或者都失败。

    1、开始于第一个执行的语句
    2、结束于:
    用户执行COMMIT 或 ROLLBACK

    单个的DDL or DCL 语句

    用户连接异常错误,或者用户断开连接

    系统崩溃


    image.png image.png

    2.4数据库的事务并发问题

    image.png image.png image.png image.png image.png image.png

    为了解决这些问题:数据库提出了隔离级别:

    image.png

    SELECT * FROM dept for update;获取锁.
    只能有一个线程去操作数据库,其他线程只能等着该线程提交或者回滚之后,才能继续操作.

    3.数据库的对象

    数据库对象:表,索引,视图,图表,缺省值,规则,触发器,语法,函数等。
    1、对象名称必须以字母开头
    2、有效的字符包括数字、字母和三个特殊字符(# _ $)
    3、不要使用保留字作为对象名称
    4、同一用户下的对象不能同名,即使是不同的对象类型

    3.1表

    3.1.1创建表:定义表的结构(有哪些列,每一列存储什么类型的数据)

    create table 表名(
    列名 类型 约束,
    列名 类型 约束,
    列名 类型 约束
    );

    简单的创建表语句

    CREATE TABLE emp_copy AS SELECT * FROM emp
    CREATE TABLE emp_copy AS SELECT * FROM emp WHERE 1=2
    

    使用select的方式拷贝表结构,不会拷贝表的索引等结构,
    所以一般使用
    CREATE TABLE emp_bak LIKE emp :来复制表结构(不会拷贝外键);

    3.1.2修改表结构
    • 增加表字段
    ALTER TABLE table
    ADD    (column datatype [DEFAULT expr]
               [, column datatype]...);
    

    使用 ADD 子句增加字段,新的字段只能被加到整个表的最后,并且不能与表中原有的字段重名

    alter table employee add column sex char(1);
    
    • 修改表字段
    ALTER TABLE table
    MODIFY     (column datatype [DEFAULT expr]
               [, column datatype]...);
    

    可修改列的数据类型,大小

    alter table employees modify sex tinyint;
    

    不是任何情况都可以修改的,当字段只包含空值时,类型、大小都可以修改,否则修改可能不能成功

    • 删除表字段
    ALTER TABLE table
    DROP  column     (columns);
    

    可以从表中删除列:

    ALTER TABLE employee  DROP COLUMN sex;
    

    从每行中删除掉字段占据的长度和数据,释放在数据块中占用的空间。删除大表中的字段将需要比较长的时间.

    3.1.3删除表

    drop table:删除表,但并不释放表所占空间;

    TRUNCATE TABLE 语句
    清除表中所有的记录,delete可以选择删除表中的一部分
    是DDL语句,不可以回滚,delete可以使用rollback回滚,放弃修改。
    释放表的存储空间,delete不释放空间
    2、 是删除数据的方法之一
    3、TRUNCATE TABLE table_name;

    注意:
    1、表中所有数据将被删除
    2、没有完成的事务被提交
    3、所有相关的索引被删除
    4、这个删除操作不能回滚

    3.2表的约束(针对于某一列):

    • 1.非空约束:NOT NULL,不允许某列的内容为空。
    • 2.设置列的默认值:DEFAULT。
    • 3.唯一约束:UNIQUE,在该表中,该列的内容必须唯一。
    • 4.主键约束:PRIMARY KEY, 非空且唯一。
    • 5.主键自增长:AUTO_INCREMENT,从1开始,步长为1。
    • 6.外键约束:FOREIGN KEY,A表中的外键列. A表中的外键列的值必须参照于B表中的某一列(B表主键)。

    3.3索引

    3.3.1原理

    索引是:
    一个数据库对象
    用来加速对表的查询
    通过使用快速路径访问方法快速定位数据,减少了磁盘的I/O
    与表独立存放
    由数据库自动维护

    索引为什么能够加快查询?

    3.3.2创建索引

    自动:
    当在表上定义一个PRIMARY KEY时,自动创建一个对应的唯一索引.
    当在表上定义一个外键时,自动创建一个普通索引;

    手动:
    用户可以创建索引以加速查询.
    在一列或者多列上创建索引.

     CREATE INDEX index ON table (column[, column]...);
    

    如果多列在一起,就叫做复合索引;在很多情况下,复合索引比单个索引更好(理解原理即可);

    3.3.3优化索引

    哪些值可以创建索引?
    1,外键一般要创建索引
    2,经常使用的查询条件要创建索引。如果使用like ‘%’操作,不会使用索引。
    3,索引不是越多越好
    4,不要在可选值很少的属性上面创建索引
    5,MySQL索引的使用,并不是所有情况下都会使用索引,只有当MySQL认为索引足够能够提升查询性能时才会使用;

    3.4视图

    3.4.1概念

    视图也就是虚表,实际上视图就是一个命名的查询,用于改变基表数据的显示。

    可以限制对数据的访问
    可以使复杂的查询变的简单
    提供了数据的独立性
    提供了对相同数据的不同显示

    3.4.2创建视图

    语法:
    在CREATE VIEW语句后加入子查询.

    CREATE [OR REPLACE] VIEW view
         [(alias[, alias]...)] 
         AS subquery
         [WITH READ ONLY];
    

    创建视图

    CREATE OR REPLACE VIEW emp_v_30
    AS SELECT  empno, ename, sal
    FROM    emp
    WHERE   deptno =30;
    

    在子查询中使用别名创建视图.

    CREATE VIEW     sal_v_10
    AS SELECT  employee_id ID, last_name NAME,
    salary*12 ANN_SALARY
    FROM    employees
    WHERE   department_id = 10;
    

    在视图中的列名使用的是子查询中列的别名.

    3.4.3使用视图

    在查询时,不需要再写完全的Select查询语句,只需要简单的写上从视图中查询的语句就可以了

    SELECT * FROM sal_v_10;
    

    默认情况下,可以直接通过对视图的DML操作去修改视图对应表中的内容(前提是视图中没有通过公式导出的列);

    3.4.4删除视图

    删掉视图不会导致数据的丢失,因为视图是基于数据库的表之上的一个查询定义.

    DROP VIEW view_name;
    

    相关文章

      网友评论

          本文标题:MySQL(三)——DML、TCL和数据库的对象

          本文链接:https://www.haomeiwen.com/subject/zfefvxtx.html