链接数据库
Mysql -h localhost -uUserName -pPassWd复制代码
查看所有库,选择库,删除库,创建库
查看所有表,删除表,创建表,清空表,查看表结构(desc)
清空表:
- truncate table_name 扔掉重建
- delete 删除
如何破解数据库的密码?
-
通过任务管理器或者服务管理,关掉mysqld(服务进程)
-
通过命令行+特殊参数开启:Mysqld --skip-grant-tables
-
此时,mysqld服务进程已经打开,并且,不需要权限检查.
-
mysql -uroot 无密码登陆服务器.
-
修改权限表
- use mysql;
- update user set Password = password('11111') where User = 'root';
- flush privileges;
-
通过任务管理器,或服务管理,关掉mysqld服务进程.
-
再次通过服务管理,打开mysql服务.
对表数据增删改查:
- insert into table_name (v1,v2...) values (v1,v2...);
- Update 表名 Set 列1 = 新值 1,列n = 新值n..... Where expr;
- Delete from 表名 where expr;
- Select 列1, 列2, 列3,...列n From 表名 Where expr;
整型,字符,日期
- char型:如果不够M个字符,内部用空格补齐,取出时再把右侧空格删掉(这意味着,如果右侧本身有空格,将会丢失)
- Date 日期 1998-12-31
- Time 时间 13:56:23
- datetime 时期时间 1998-12-31 13:56:23
- timestamp
修改表
为什么建表时,加not null default '' / default 0
不想让表中出现null值.
为什么不想要的null的值
不好比较,null是一种类型,比较时,只能用专门的is null 和 is not null来比较. 碰到运算符,一律返回null 效率不高,影响提高索引效果.
用count(*),count(1),谁好呢?
- 对于myisam引擎的表,没有区别的.这种引擎内部有一计数器在维护着行数.
- Innodb的表,用count(*)直接读行数,效率很低,因为innodb真的要去数一遍.
清除重复值
SELECT DISTINCT 字段名 FROM 表名
like模糊查询( % ,_ )
子查询
- 子查询的结果是单行单列
- SELECT 查询字段 FROM 表 WHERE 字段=(子查询);
- 子查询的结果是多行单列
- SELECT 查询字段 FROM 表 WHERE 字段 IN (子查询);
- 子查询的结果是多行多列
- SELECT 查询字段 FROM (子查询) 表别名 WHERE 条件;
多表查询
- A left OUTER join B on 条件
- A inner join B
sql1 union sql2 (列数相同)
1. mysql的函数肯定是要影响查询速度.
应该在建表时,通过合理的表结构减少函数的使用. 比如 email ,按@ 前后拆分.
2. 如果确实要用函数,
比如 时间的格式化 在mysql里用date_format,在php里用date可以实现 优先放在业务逻辑层,即php层处理.
3. 在查询时使用了函数,最大的一个坏处,
以 date_format(A)为例 则A列的索引将无法使用.
事务
- 原子性
- 隔离性
- 一致性
- 持久性
-
innobdb
-
start transaction;
-
Commit 提交
-
rollback 回滚
脏读,不可重复读(update),幻读(insert,delete)
索引
索引的创建原则:
- 不要过度索引
- 在where条件最频繁的列上加.
- 尽量索引散列值,过于集中的值加索引意义不大.
索引的类型
- 普通索引: index 仅仅是加快查询速度.
- 唯一索引: unique index 行上的值不能重复
- 主键索引: primary key 不能重复.
- 主键必唯一,但是唯一索引不一定是主键.
- 一张表上,只能有一个主键, 但是可以用一个或多个唯一索引.
- 全文索引 : fulltext index
建立索引
可以在建表时,直接声明索引,即在列声明完毕后,声明索引. 例如下:
create table test5 ( id int, username varchar(20), school varchar(20), intro text, primary key (id), unique (username), index (school), fulltext (intro) ) engine myisam charset utf8;复制代码
查看一张表上所有索引
Show index from 表名
添加索引
Alter table 表名 add index /unique/fulltext [索引名] (列名)Alter table 表名 add primary key (列名) // 不要加索引名,因为主键只有一个复制代码
删除索引
- 删除非主键索引:Alter table 表名 drop index 索引名;
- 删除主键: alter table 表名 drop primary key
查看现有的存储过程:
Show procedure status复制代码
删除存储过程
Drop procedure 存储过程的名字
调用存储过程
Call 存储过程名字();