mysql基础

502 阅读4分钟

mysql基础
主从复制一
主从复制二

链接数据库

Mysql -h localhost -uUserName -pPassWd

查看所有库,选择库,删除库,创建库

查看所有表,删除表,创建表,清空表,查看表结构(desc)

清空表:

  1. truncate table_name 扔掉重建
  2. delete 删除

如何破解数据库的密码?

  1. 通过任务管理器或者服务管理,关掉mysqld(服务进程)

  2. 通过命令行+特殊参数开启:Mysqld --skip-grant-tables

  3. 此时,mysqld服务进程已经打开,并且,不需要权限检查.

  4. mysql -uroot 无密码登陆服务器.

  5. 修改权限表

    • use mysql;
    • update user set Password = password('11111') where User = 'root';
    • flush privileges;
  6. 通过任务管理器,或服务管理,关掉mysqld服务进程.

  7. 再次通过服务管理,打开mysql服务.

对表数据增删改查:

  1. insert into table_name (v1,v2...) values (v1,v2...);
  2. Update 表名 Set 列1 = 新值 1,列n = 新值n..... Where expr;
  3. Delete from 表名 where expr;
  4. Select 列1, 列2, 列3,...列n From 表名 Where expr;

整型,字符,日期

  1. char型:如果不够M个字符,内部用空格补齐,取出时再把右侧空格删掉(这意味着,如果右侧本身有空格,将会丢失
  2. Date 日期 1998-12-31
  3. Time 时间 13:56:23
  4. datetime 时期时间 1998-12-31 13:56:23
  5. timestamp

修改表

为什么建表时,加not null default '' / default 0

不想让表中出现null值.

为什么不想要的null的值

不好比较,null是一种类型,比较时,只能用专门的is null 和 is not null来比较. 碰到运算符,一律返回null 效率不高,影响提高索引效果.

用count(*),count(1),谁好呢?

  1. 对于myisam引擎的表,没有区别的.这种引擎内部有一计数器在维护着行数.
  2. Innodb的表,用count(*)直接读行数,效率很低,因为innodb真的要去数一遍.

清除重复值

SELECT DISTINCT 字段名 FROM 表名

like模糊查询( % ,_ )

子查询

  1. 子查询的结果是单行单列
    • SELECT 查询字段 FROM 表 WHERE 字段=(子查询);
  2. 子查询的结果是多行单列
    • SELECT 查询字段 FROM 表 WHERE 字段 IN (子查询);
  3. 子查询的结果是多行多列
    • SELECT 查询字段 FROM (子查询) 表别名 WHERE 条件;

多表查询

  1. A left OUTER join B on 条件
  2. A inner join B

sql1 union sql2 (列数相同)

1. mysql的函数肯定是要影响查询速度.

应该在建表时,通过合理的表结构减少函数的使用. 比如 email ,按@ 前后拆分.

2. 如果确实要用函数,

比如 时间的格式化 在mysql里用date_format,在php里用date可以实现 优先放在业务逻辑层,即php层处理.

3. 在查询时使用了函数,最大的一个坏处,

以 date_format(A)为例 则A列的索引将无法使用.

事务

  1. 原子性
  2. 隔离性
  3. 一致性
  4. 持久性
  • innobdb

  • start transaction;

  • Commit 提交

  • rollback 回滚

脏读,不可重复读(update),幻读(insert,delete)

索引

索引的创建原则:

  1. 不要过度索引
  2. 在where条件最频繁的列上加.
  3. 尽量索引散列值,过于集中的值加索引意义不大.

索引的类型

  1. 普通索引: index 仅仅是加快查询速度.
  2. 唯一索引: unique index 行上的值不能重复
  3. 主键索引: primary key 不能重复.
  4. 主键必唯一,但是唯一索引不一定是主键.
  5. 一张表上,只能有一个主键, 但是可以用一个或多个唯一索引.
  6. 全文索引 : 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 (列名)   // 不要加索引名,因为主键只有一个

删除索引

  1. 删除非主键索引:Alter table 表名 drop index 索引名;
  2. 删除主键: alter table 表名 drop primary key

查看现有的存储过程:

Show procedure status

删除存储过程

Drop procedure 存储过程的名字

调用存储过程

Call 存储过程名字();