基础操作
登录:
- -h:主机名
- -u:用户名
- -p:使用密码登录
管理:
use DB;
show database
show tables
show columns form 表
show index form 表
exit
数据库操作:
创建:
CREATE DATABASE 数据库名;
删除:
drop database 数据库名;
数据表操作:
- 创建:
CREATE TABLE table_name ('列名' 类型 属性, 列名 类型, 主键('xxx'));
CREATE TABLE IF NOT EXISTS `runoob_tbl`( `runoob_id` INT UNSIGNED AUTO_INCREMENT, // 自增 `runoob_title` VARCHAR(100) NOT NULL, // 非空 `runoob_author` VARCHAR(40) NOT NULL, `submission_date` DATE, PRIMARY KEY ( `runoob_id` ) // 主键 )ENGINE=InnoDB DEFAULT CHARSET=utf8;
删除:
DROP TABLE table_name ;
插入:
INSERT INTO xxx (field1, field2,...fieldN) VALUES(field1, field2,...,fieldN)
查询:
SELECT column_name, column_name FROM table_name [WHERE Clause] [LIMIT N][ OFFSET M]
LIMIT 4
读取四条;LIMIT 2, 4
:第三条起读取四条。分页LIMIT startRow,pageSize;
limit 4 offset 9
:返回四行,从第十行开始更新:
UPDATE table_name SET field1=new-value1, field2=new-value2 [WHERE Clause]
删除:
DELETE FROM table_name WHERE age<20
Like:条件,
%
字符来表示任意字符,类似正则*
。'%COM'
UNION:连接两个查询的集合,删除重复数据。
SELECT A, B FROM tables WHERE XX UNION [ALL | DISTINCT] SELECT A, C FROM tables WHERE XX;
DISTINCT默认就是删除重复,加不加无用。ALL返回所有结果集,包含重复的
ORDER BY:
ORDER BY XXX DESC
,默认升序。GROUP BY:按字段分组,并统计数目。
GROUP BY name
得到:name | count数目
连接:
INNER JOIN(内连接, 或等值连接):获取两个表中字段匹配关系的记录。
LEFT JOIN(左连接):获取左表所有记录,即使右表没有对应匹配的记录。
RIGHT JOIN(右连接): 与 LEFT JOIN 相反,用于获取右表所有记录,即使左表没有对应匹配的记录。
Alter:修改数据表名或字段。
ALTER TABLE testalter_tbl DROP i;
删除表的i字段ALTER TABLE testalter_tbl ADD i INT;
表添加字段,默认是末尾ALTER TABLE testalter_tbl ADD i INT FIRST;
第一列添加ALTER TABLE testalter_tbl ADD i INT AFTER c;
c列之后添加ALTER TABLE testalter_tbl MODIFY c CHAR(10);
改类型ALTER TABLE testalter_tbl CHANGE i j BIGINT;
改i为j,类型为BIGINTALTER TABLE testalter_tbl RENAME TO alter_tbl;
改表名
- 创建:
InnoDB和MySAM
- InnoDB和MySAM
- 操作性:
- InnoDB具有事务,支持四个事务隔离级别。
- 适用于大量INSERT或UPDATE操作。
- 不支持全文索引,新版本支持。
- 支持外键
- MyISAM管理非事务表
- 它提供高速存储和检索,以及全文搜索能力。
- 如果应用中需要执行大量的SELECT查询,那么MyISAM是更好的选择
- 不支持事务、外键
- 存储:
- MyISAM在磁盘上存储成三个文件。表定义 .frm,数据文件.MYD, 索引文件.MYI。跨平台转移麻烦
- InnoDB:空间数据文件和它的日志文件,InnoDB 表的大小只受限于操作系统文件的大小
- 索引:
- InnoDB(索引组织表):能缓存索引,也能缓存数据,必须得有主键
- MyISAM(堆组织表):只能缓存索引。非聚类
- InnoDB 在做SELECT的时候,要维护缓存数据和索引和其余的,慢一些。MyISAM只缓存索引块
- MyISAM引擎使用B+Tree作为索引结构,叶节点的data域存放的是数据记录的地址。
- B+树搜索算法搜索索引-取出data值-以此为地址读取数据记录
- 主索引要求key是唯一的,而辅助索引的key可以重复
- InnoDB也使用B+Tree作为索引结构,数据文件本身就是索引文件。
- 叶节点data域就是数据记录,称之聚类索引
- 本身要按主键聚类,所以必须要主键(设置自增主键),没有的话分裂维持特性会十分低效。没指定的话会自动选择合适的或自动生成一个隐含字段。长度为6的长整型
- 辅助索引data存储的主键值
索引
索引可以看作一张表,指向实体表记录
唯一索引,保证每行数据的唯一性
加大检索速度,特别是分组和排序
加速表和表之间的连接速度
缺点:创建和维护要耗时(增删时要动态维护),占用物理空间
总结:会提高查询速度,但是DML会变慢(更新维护索引)
语法:
CREATE INDEX indexName ON mytable(username(length));
ALTER table tableName ADD INDEX indexName(columnName)
DROP INDEX [indexName] ON mytable;
添加主键命令:
mysql> ALTER TABLE testalter_tbl MODIFY i INT NOT NULL;
mysql> ALTER TABLE testalter_tbl ADD PRIMARY KEY (i);
导出数据
mysqldump -u root -p dbs_name table_name > dump.sql [--all-databases]
mysql -u root -p dbs_name < dump.sql
create database adc;
use abc;
set names ytf8;
source /xx/xx/xx/abc.sql
范式
第一范式:当关系模式R的所有属性都不能在分解为更基本的数据单位时,称R是满足第一范式的,简记为1NF。满足第一范式是关系模式规范化的最低要求,否则,将有很多基本操作在这样的关系模式中实现不了。
第二范式:如果关系模式R满足第一范式,并且R得所有非主属性都完全依赖于R的每一个候选关键属性,称R满足第二范式,简记为2NF。
第三范式:设R是一个满足第一范式条件的关系模式,X是R的任意属性集,如果X非传递依赖于R的任意一个候选关键字,称R满足第三范式,简记为3NF.
注:关系实质上是一张二维表,其中每一行是一个元组,每一列是一个属性
第四范式:要求把同一表内的多对多关系删除。
第五范式:从最终结构重新建立原始结构。
BC范式(BCNF):符合3NF,并且,主属性不依赖于主属性。若关系模式R属于第一范式,且每个属性都不传递依赖于键码,则R属于BC范式。
优化方法
- 微博整理
- null值容易引发灾难,
id is null
而不是id=null
- 用
union
代替or
- null值容易引发灾难,
- 数据库设计
- 避免全表扫描,在where 及 order by 涉及的列上建立索引
- 避免在 where 子句中对字段进行 null 值判断,引擎会放弃索引而使用全局扫描。可以考虑把null默认值设为0
- 一个表的索引数最好不要超过6个,在一些不常用到的的列不需要索引。因为会降低插入、修改的速度
- 避免更新索引数据,若该列频繁更新,考虑索引的必要性
- 字符会一一比较,数字只需要比较一次。所以能用数值尽量不要用字符
- 尽可能的使用
varchar/nvarchar
代替char/nchar
,变长字段存储空间小,可以节省存储空间 - 尽量少使用临时表
- SQL语句
- 避免在Where使用 != 或 <>,以及or,否则引擎放弃使用索引而进行全表扫描。
select id from t where num=10 or num=20
select id from t where num=10 union all select id from t where num=20
能用 between 就不要用 in,not in
where 子句中使用参数,也会导致全表扫描。强制加上索引
select id from t where num=@num
select id from t with(index(索引名)) where num=@num
- 避免在 where 子句中对字段进行表达式操作:=”左边进行函数、算术运算或其他表达式运算
select id from t where num/2=100
select id from t where num=100*2
具体的字段列表代替“*”,不要返回用不到的任何字段。
避免使用游标,超过一万行就考虑改写
避免大事务操作