本文共 4936 字,大约阅读时间需要 16 分钟。
在大部分场景下,基本的curd操作就已经满足要求。而且对于不是专门从事数据库开发的人而言,数据库其实应该遵从“用时即查”的方式。并不需要太过于系统的学习。但是,接触的实际操作太少,使得我门并不能很好地练习数据库。另外,数据库并不是单单的数据库,这其中的技术不仅仅设计复杂的数据结构的应用,还涉及到各种工程化的技术,多线程优化,等等。基本上,数据库的很多构建逻辑,已经包含了很多实际用到的其他技术。
为了进一步加深对数据库的知识体系的认识,暂且做一个mysql的总体笔记,包含所有的知识构建,参考书以《mysql必知必会》。
sql基本概念
数据库database:即存储数据的仓库; 表table:仓库里面的每一个箱子,箱子的样式有很多种 模式schema: 列column:箱子的抽屉的格式,字段类型,如id、name 行row:一行数据 基本数据类型datatype: 主键primary key:必须定义主键;主键唯一;不能为null;不能重复;不能更改变化(比如商品价格)。 sql:sql即structured query language,结构化查询语言基本操作
2.1. 数据库查询: 显示数据库:show database; 进入数据表:use tablename; 2.2. 查询数据: select id from tablename; select * from tablename;尽量不要使用全查找*:要求不明确,效率低。 限制条件: 不重复:distinct (类似于Python中的set函数) 分页:limit n,m或者limit m offset n:表示从偏移量第n个取(不包括n),取m条数据 2.3 数据排序 order by salary DESC; 指定排序方向:默认从小到大即正序:ASC;倒序需指定为DESC 2.4 过滤数据/条件判断 where id=10086 数据过滤也可以通过客户端判断,但这样将大大增加时间。 另外where和order by组合使用时,需要将where放在前面,否则出错 几个常用条件:不等于<>或!=;之间between and或者in(100,200);空值检查is null; 组合条件:and、 or、 not 2.5 通配符匹配过滤wildcard like操作符: %:匹配任何字符任何长度 _:同%一样,但是下划线只能匹配单个字符 例子:select name from tablename where name like 'zhang%'
[]:匹配括号中的任意一个字符;[JM]%:即匹配J或M开头的数据 ^:否定。[^JM]%:不匹配J或M开头的数据 通配符注意事项 select name from tablename where name REGEXP 'zhang'
字段将匹配名字中含有zhang的数据,这里与like全局匹配不同 另外正则中.表示匹配任意一个字符;另一个不同是like不区分大小写,但是regexp区分大小写 or:使用|:regexp ‘1000|2000’ 匹配几个字符之一:regexp ‘[123]Ton’ 匹配范围:regexp ‘[01234]’或[0-4];[a-z] 匹配特殊字符:._等字符有特殊汉子,需要转义;使用’\.’对点号进行转义 匹配多个字符: 定位符: 2.7 数据聚合/字段计算 字段拼接concatenate:concat(firstname,lastname) 删除字段左右多余的空格:RTrim(name),LTrim(name) 使用别名:select firstname AS name 算数计算:支持+-*/计算 2.8 使用数据处理函数select name from tablename1 where id in (select id from tablename2)
2.11 联结表join 内连接:多个表进行联结有两种方式,一种直接使用select * from table1,table2;另一种使用inner join on:select * from table1 inner join table2 on table1.id = table2.id 2.12 高级联结 外链接:左右连接left join 和right join;之间的区别就是,左连接将显示所有的左表,共同数据为空;右连接相反 2.13 组合查询union 组合查询用于将相同的查询数据进行组合,比如男性的薪水UNION女性的薪水,就是所有的薪水,UNION一般直接用在两个select之间 注:UNION列类型并不需要相同,但是需要兼容;默认去重,如果不去冲,需要使用UNION ALL 2.14 全文索引(略)插入、更新、删除、创建
3.1 插入数据 例:insert into tablename(id,name) value (10086,'中国联通')
性能提高:实际运行时,查询服务是最重要的,所以可以通过LOW_PROIRITY来降低插入的优先级,update和delete同样 3.2 更新数据 例:update table set id= 100 where
3.3 删除数据 例:delete from table where id =100
3.4 创建和操纵表 create table tablename ( id int not null auto_increment, name char(15) not null, primary key (id), )ENGINE=InnoDB; 注:每个表的自增字段只有一个,而且必须被索引 默认值指定:default 1 注:默认值只能是常量,不能使函数;开发中最好是用默认值,而不是null值 引擎类型: alter table tablename ADD name char(15)
add、drop、 删除表:drop table tablename
重命名表:rename table tablename1 to tablename2
create view viewname AS select id from table1,table2 where
4.2 使用存储过程(略) 4.3 触发器 什么是触发器:触发器相当于一个事件监听,比如我们买东西之前需要交钱,进门之前要按铃,即触发器是指在一个事件发生之前或之后触发另一个事件执行。 目前只有update、insert、delete支持触发器,其他不支持 创建触发器:create trigger newproduct after insert on tablename for each row select 'product added'
解析:上面创建一个名为newproduct的触发器,当tablename中插入每一行数据时,都会显示product added。 删除触发器:drop trigger triggername 后续:缺页 4.4 事务处理 mysql中只有InnoDB支持事务处理; 事务即一个事件,一个完整事件,有许多小步骤组成,比如我们喝茶:烧水,放茶叶,倒水等步骤,为了方式数据出现差错,这些单个的动作不能单独执行,比如如果水都没烧开,还是照样执行后面的倒水语句,那么茶基本上是喝不了,这样就出现了错误。所以事务是为了防止语句出错。即要么完全执行,要么一步都不执行。 应用场景:事务的应用场景很多,比如电商支付等 事务的几个术语:转载地址:http://seepi.baihongyu.com/