目录

MySQL摘要

基本概念

  1. 关系数据库与非关系区别

    1. 关系数据库具有事务一致性,ACID
    2. 非关系数据库具有高并发能力
  2. select、from、where、group by、having、order by、limit

    插入数据:insert into … values()、更新数据:update … set … where …、删除数据:delete from … where …

    创建表:create table test(xx int not null auto_increment,xx char(50) null default 1,…)engine=innodb;

    更新表:alter table xx add name char(10); add添加字段 drop删除字段

    删除表:drop table xxx;

    创建视图:create view

    删除视图:drop view

  3. 主键通常定义在表的一列上,但这并不是必需的,也可以一起使用多个列作为主键。在使用多列作为主键时,上述条件必须应用到构成主键的所有列,所有列值的组合必须是唯一的(但单个列的值可以不唯一)。

  4. 不能部分使用DISTINCT

    DISTINCT关键字应用于所有列而不仅是前置它的列。如果给出SELECT DISTINCT vend_id, prod_price,除非指定的两个列都不同,否则所有行都将被检索出来。

  5. where在匹配时不区分大小写

  6. LIKE匹配整个列。如果被匹配的文本在列值中出现,LIKE将不会找到它,相应的行也不被返回(除非使用通配符)。而REGEXP在列值内进行匹配,如果被匹配的文本在列值中出现,REGEXP将会找到它,相应的行将被返回。这是一个非常重要的差别。

  7. 分组:group by ,过滤分组 having

  8. 子查询总是从内向外处理

  9. 联结表:等值联结(也称为内部联结)、自联结、自然联结和外部联结

    联结是一种机制,用来在一条SELECT语句中关联表,因此称之为联结。使用特殊的语法,可以联结多个表返回一组输出;由没有联结条件的表关系返回的结果为笛卡儿积

    内部联结:两个及以上表的联结(笛卡尔积);返回所有数据,相同的列可多次出现

    自联结:自身与自身联结

    自然联结:类似内部联结,但相同的列只出现一次

    外部联结:许多联结将一个表中的行与另一个表中的行相关联。但有时候会需要包含没有关联行的那些行;,联结包含了那些在相关表中没有关联行的行,这种类型的联结称为外部联结

  10. 组合查询 union:

    • 将select结果合并输出,默认去除重复项,若显示重项,则union all
    • UNION的使用很简单,所需做的只是给出每条SELECT语句,在各条语句之间放上关键字UNION
    select id from t_table_name1 where xx union select id from t_table_name2 where xx;
    
  11. InnoDB不支持全文本搜索

  12. 视图:视图的最常见的应用之一是隐藏复杂的SQL :create view viewname as sql..

  13. 存储过程:存储过程简单来说,就是为以后的使用而保存的一条或多条MySQL语句的集合,相当于批处理

    执行存储过程:CALL接受存储过程的名字以及需要传递给它的任意参数:call xxname(@low,@high);

  14. 游标:检索出来的行中前进或后退一行或多行,MySQL游标只能用于存储过程(和函数)

  15. 触发器:是MySQL响应以下任意语句而自动执行的一条MySQL语句:delete、insert、update

    创建:create trigger

    只有表才支持触发器,视图不支持

  16. 事务处理(transaction processing):可以用来维护数据库的完整性,它保证成批的MySQL操作要么完全执行,要么完全不执行

    • 事务(transaction)指一组SQL语句;
    • 回退(rollback)指撤销指定SQL语句的过程;
    • 提交(commit)指将未存储的SQL语句结果写入数据库表;
    • 保留点(savepoint)指事务处理中设置的临时占位符(placeholder),你可以对它发布回退(与回退整个事务处理不同)。

    start transaction;

    insert …

    delete …

    savepoint xx;

    rollback;

    rollback to savepointname;

    commit;

    ROLLBACK只能在一个事务处理内使用(在执行一条STARTTRANSACTION命令之后)。事务处理用来管理INSERT、UPDATE和DELETE语句。你不能回退SELECT语句。(这样做也没有什么意义。)你不能回退CREATE或DROP操作。事务处理块中可以使用这两条语句,但如果你执行回退,它们不会被撤销。

    简单的ROLLBACK和COMMIT语句就可以写入或撤销整个事务处理。但是,只是对简单的事务处理才能这样做,更复杂的事务处理可能需要部分提交或回退。为了支持回退部分事务处理,必须能在事务处理块中合适的位置放置占位符。这样,如果需要回退,可以回退到某个占位符。这些占位符称为保留点savepoint

    1. 事务ACID

      • 原子性(atomicity)一个事务必须被视为一个不可分割的最小工作单元,整个事务中所有操作要么全部提交成功,要么全部失败回滚,对于一个事务来说,不可能只执行其中的一部分操作

      • 一致性(consistency)数据库总是从一个一致性的状态转换到另外一个一致性的状态

      • 隔离性(isolation)一个事务所做的修改在最终提交以前,对其他事务是不可见的

      • 持久性(durability)一旦事务提交,则其所做的修改就会永久保存到数据库中

    2. 四种隔离级别

      • READ UNCOMMITTED(未提交读),事务中的修改,即使没有提交,对其他事务也都是可见的,事务可以读取未提交的数据,也被称为脏读(Dirty Read),这个级别会导致很多问题

      • READ COMMITTED(提交读),大多数数据库系统的默认隔离级别,一个事务开始时,只能“看见”已经提交的事务所做的修改,一个事务从开始直到提交之前,所做的任何修改对其他事务都是不可见的,也叫不可重复读(nonrepeatable read),有可能出现幻读(Phantom Read),指的是当某个事务在读取某个范围内的记录时,另外一个事务又在该范围内插入了新的记录,当之前的事务再次读取该范围的记录时,会产生幻行(Phantom Row)

      • REPEATABLE READ(可重复读),通过InnoDB和XtraDB存储引擎,是MySQL的默认事务隔离级别

      • SERIALIZABLE(可串行化)最高级别,通过强制事务串行执行,避免了幻读问题,会在读取的每一行数据上都加锁,可能导致大量的超时和锁争用的问题

常用操作

查看表结构

desc [table_name]

show create table [table_name] 可看字段注释

字符串相关

  • like
    • 模糊查询
  • concat
    • 字符串拼接
  • instr
    • 可用来查询子字符串,返回子串第一次出现的位置

索引

  • primary
    • 主键:不为空,不可重复
  • unique
    • 唯一索引:不可重复、但可为空
  • index
    • 普通索引:可重复、可为空
1. CREATE INDEX indexName ON table_name(column_name)
2. ALTER table tableName ADD INDEX indexName(columnName)

时间转时间戳

select unix_timestamp(‘2022-12-2 21:2:21’);

建表

CREATE TABLE `test` (`id` INT UNSIGNED AUTO_INCREMENT, `desc` VARCHAR(100) NOT NULL, PRIMARY KEY(`id`)) ENGINE=InnoDB DEFAULT CHARSET=uft8mb4;

join

从笛卡尔积中选出符合条件的

join、left join、right join、outer join

SELECT * FROM t_blog JOIN t_type ON t_blog.typeId=t_type.id;

更改表

更改表名
alter table table_name rename to table_new_name;
添加索引
alter table table_name add index(field);