MySQL摘要
基本概念
-
关系数据库与非关系区别
- 关系数据库具有事务一致性,ACID
- 非关系数据库具有高并发能力
-
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
-
主键通常定义在表的一列上,但这并不是必需的,也可以一起使用多个列作为主键。在使用多列作为主键时,上述条件必须应用到构成主键的所有列,所有列值的组合必须是唯一的(但单个列的值可以不唯一)。
-
不能部分使用DISTINCT
DISTINCT关键字应用于所有列而不仅是前置它的列。如果给出SELECT DISTINCT vend_id, prod_price,除非指定的两个列都不同,否则所有行都将被检索出来。
-
where在匹配时不区分大小写
-
LIKE匹配整个列。如果被匹配的文本在列值中出现,LIKE将不会找到它,相应的行也不被返回(除非使用通配符)。而REGEXP在列值内进行匹配,如果被匹配的文本在列值中出现,REGEXP将会找到它,相应的行将被返回。这是一个非常重要的差别。
-
分组:group by ,过滤分组 having
-
子查询总是从内向外处理
-
联结表:等值联结(也称为内部联结)、自联结、自然联结和外部联结
联结是一种机制,用来在一条SELECT语句中关联表,因此称之为联结。使用特殊的语法,可以联结多个表返回一组输出;由没有联结条件的表关系返回的结果为笛卡儿积
内部联结:两个及以上表的联结(笛卡尔积);返回所有数据,相同的列可多次出现
自联结:自身与自身联结
自然联结:类似内部联结,但相同的列只出现一次
外部联结:许多联结将一个表中的行与另一个表中的行相关联。但有时候会需要包含没有关联行的那些行;,联结包含了那些在相关表中没有关联行的行,这种类型的联结称为外部联结
-
组合查询 union:
- 将select结果合并输出,默认去除重复项,若显示重项,则
union all - UNION的使用很简单,所需做的只是给出每条SELECT语句,在各条语句之间放上关键字UNION
select id from t_table_name1 where xx union select id from t_table_name2 where xx; - 将select结果合并输出,默认去除重复项,若显示重项,则
-
InnoDB不支持全文本搜索
-
视图:视图的最常见的应用之一是隐藏复杂的SQL :create view viewname as sql..
-
存储过程:存储过程简单来说,就是为以后的使用而保存的一条或多条MySQL语句的集合,相当于批处理
执行存储过程:CALL接受存储过程的名字以及需要传递给它的任意参数:call xxname(@low,@high);
-
游标:检索出来的行中前进或后退一行或多行,MySQL游标只能用于存储过程(和函数)
-
触发器:是MySQL响应以下任意语句而自动执行的一条MySQL语句:delete、insert、update
创建:create trigger
只有表才支持触发器,视图不支持
-
事务处理(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
-
事务ACID
-
原子性(atomicity)一个事务必须被视为一个不可分割的最小工作单元,整个事务中所有操作要么全部提交成功,要么全部失败回滚,对于一个事务来说,不可能只执行其中的一部分操作
-
一致性(consistency)数据库总是从一个一致性的状态转换到另外一个一致性的状态
-
隔离性(isolation)一个事务所做的修改在最终提交以前,对其他事务是不可见的
-
持久性(durability)一旦事务提交,则其所做的修改就会永久保存到数据库中
-
-
四种隔离级别
-
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);