一、Mysql数据库的操作命令

1、登录:mysql -h 服务器地址 -u 登录名 -p 密码

mysql -h 127.0.0.1 -u root -p root

2、数据库备份:mysqldump -h 服务器地址 -p  数据库名 > 文件名

3、数据恢复:mysql  -h服务器地址  -u登录名   -p   数据库名 < 文件名

4、创建数据库:create  database  数据库名称  【charset  数据库编码】 【collate  排序规则】

5、删除数据库:drop  database  【 if  exists 】 数据库名称   

6、修改数据库:alter  database   数据库名称    charset  新的编码名   collate  新的排序规则名

7、显示所有数据库:show  databases

8、显示数据库创建语句:show  create  database  数据库名称

9、进入数据库:use  数据库名称

二、字段类型

Mysql数据库知识点合集_字段名

三、表操作命令

auto_increment:自动增长

primary  key:设置为主键

unique  key:设置唯一索引

not  null:设置不为空

default  某值:设置默认值

comment:设置字段说明

1、创建表:creat  table  表名称(字段名称  类型  字段属性) 【表选项】

create table a (
id int auto_increment primary key,
username varchar(32) not null unique key,
password varchar(32) not null comment '密码',
age tinyint default 18
)charset=utf8,engine=myisam;

2、索引

  • 普通索引

    key(字段名)

    就是一个索引而已,没有其他作用,只能加快查找速度

  • 唯一索引

    unique key(字段名)

    是一个索引,而且还可以设定其字段的值不能重复(唯一性)

  • 主键索引

    primary  key(字段名称)

    是一个索引,而且,还具有区分该表中的任何一行数据的作用(其实也是唯一性)它其实比唯一性索引多一点功能:唯一性可以为空null,而主键不能为空;

  • 全文索引

    fulltext(字段名)

  • 外键索引

    foreign  key (字段名) references  其他表  (对应其他表中的字段名)

create table a (
id int auto_increment,
username varchar(32) not null,
password varchar(32) not null comment '密码',
age tinyint default 18,
primary key(id), --创建索引
unique key(username)
)charset=utf8,engine=myisam;

3、修改表

添加字段:alter  table 表名 add  [column] 新字段名 字段类型  [字段属性列表]

alter table a add date_entered datetime;

修改字段(并可改名):alter  table 表名 change [column] 旧字段名 新字段名 新字段类型 [新字段属性列表];

alter table a change date_entered addtime int;

删除字段:alter  table  表名 drop  [column] 字段名;

alter table a drop addtime;

添加普通索引:alter  table 表名 add  key  [索引名]  (字段名1[,字段名2,...]);

alter table a add key date_entered (date_entered);

添加唯一索引(约束):alter table 表名 add unique key (字段名1[,字段名2,...]);

alter table a add unique key (username);

添加主键索引(约束):alter table 表名 add primary key (字段名1[,字段名2,...]);

alter table a add primary key (id);

修改表名:alter  table  旧表名   rename  [to] 新表名;

alter table a rename b;

 4、删除表

drop  table  【if  exists】 表名;

其他表的相关语句:

显示当前数据库中的所有表: show tables;

显示某表的结构: desc 表名; 或:describe 表名;

显示某表的创建语句:show create table 表名;

重命名表:rename table 旧表名 to 新表名;

从已有表复制表结构:create table [if not exists] 新表名 like 原表名;

四、定义视图

1、语法:create  view  视图名 【(字段名1,字段名2,字段名3,....)】   as   select语句;

create view view_b as select * from b where id > 10;

2、删除视图:drop  view  【if  exists】 视图名;

drop view if exists view_b;

五、操作数据语句

1、插入数据:

  insert [into]  表名 [(字段名1,字段名2,....)] values (值表达式1,值表达式2,....)

  replace [into] 表名 [(字段名1,字段名2,....)] values (值表达式1,值表达式2,....)

  其跟insert into几乎一样:唯一区别是,如果插入的数据的主键或唯一键“有重复”,则此时就会变成“修改该行数据”

insert into b (username, password, age) values ('yy', '123', 18);

2、修改数据:update  表名  set  字段1=值1,字段2=值2,......  【where 条件】 【order by排序字段】 【limit 限定行数】;

update b set username = 'yang' where id = 1;

3、删除数据:delete  from  表名  【where 条件】 【order by排序字段】 【limit 限定行数】;

delete from b where id = 1;

4、查询数据:select  [all | distinct]  字段或表达式列表  [from子句]  [where子句]  [group by子句]   [having子句]   [order by子句]   [limit子句];

all 和 distinct用于设定select出来的数据,是否消除“重复行”,可以不写,那就是默认值all:

all:表示不消除,即所有都出来,默认值;

distinct:表示会消除;使用all(跟不使用结果是一样的)

六、高级查询

1、连接查询

连接查询分类:

  • 交叉连接(cross  join)
  • 左连接(left  join)
  • 右连接(right  join)
  • 内连接 (inner  join)

1、内连接:select  *  from  表1  【inner】  join  表2  on  连接条件;

2、左连接:select  *  from  表1  left  join  表2  on  连接条件;

3、右连接:select  *  from  表1  right  join  表2  on  连接条件;

2、子查询

select * from product  where  price = (select  max(price)  from product );

使用in的子查询

select  *  from  product  where  protype_id  in( select  protype_id  from  product_type  where  protype_name  like ‘%电%’);

使用any的子查询

select  *  from  tab1  where  id >  any  (select  f1  from  tab2);

使用all的子查询

select  *  from  tab2  where  f1  >  all  ( select  id  from   tab1 );

使用exists的查询

select * from product where exists (select * from product_type where like '%电%' and protype_id = product.protype_id);

3、联合查询union

语法:

select 语句1

union 【all | distinct】

select 语句2

1、要求多条查询语句的查询列数是一致的!

2、要求多条查询语句的查询的每一列的类型和顺序最好一致

3、union关键字默认去重,如果使用union all 可以包含重复项 

七、用户管理

1、删除用户:drop  user  ‘用户名’@’允许登录的地址或服务器名’;

2、修改自己的密码:set password = password('密码');

3、修改他人密码:set password  for  '用户名'@'允许登录的地址' = password('密码');

4、授权:grant  权限列表  on  某库.某个对象  to  ‘用户名’@’允许登录的位置’  【identified  by  ‘密码’】;

5、取消权限:revoke  权限列表  on  某库.某个对象  from  ‘用户名’@’允许登录的位置’

 八、事务

事务执行的基本流程

1,开启一个事务:start  transaction; //也可以写成:begin;

2,执行多条增删改语句; //也就是相当于希望这多条语句要作为一个“不可分割”的整体去执行的任务

3,判断这些语句执行的结果情况,并进行提交或回滚:

if(  没有出错 ){

commit; //提交事务;此时就是一次性完成;

}else{

rollback; //回滚事务;此时就是全部撤销;

}

数据库引擎Innodb有效

start transaction;
insert into test(name, age) values ('yang', 18);
commit;

九、存储过程、触发器

1、定义变量:

  • declare  变量名  类型名   【default  默认值】; //普通变量必须先这样定义

  赋值形式:set  变量名  =  值;

  取值:就直接使用变量名;

  注:只能在存储过程或者函数内申明变量

  • set  @变量名  =  值;

  注:基本上哪里都可以用

2、函数:

  create  function  函数名 (参数1  类型1,参数2  类型2,。。。)  returns  返回类型

  begin

    #这里写函数内容

    return  返回值

  end

注意事项:

1, 在函数内容,可以有各种变量和流程控制的使用;

2, 在函数内部,也可以有各种增删改语句;

3, 在函数内部,不可以有select或其他“返回结果集”的查询类语句;


create  function  test() returns int
begin
return 1;
end;

  调用:select  函数  as 别名

  删除函数:drop function 函数名

3、存储过程:

create procedure test(【in | out | inout】 a int)

begin

  --这里写完整的过程中语句

  --其中可以有各种流程控制

  --还可以是增删改查等

  --其中查询语句会作为存储过程调用的结果

end;

说明:

1,in:用于设定该变量是用来“接收实参数据”的,即“传入”;默认不写,就是in

2,out:用于设定该变量是用来“存储存储过程中的数据”的,即“传出”,即函数中必须对他赋值;

3,inout:是in和out的结合,具有双向作用;

4,对于,out和inout设定,对应的实参,就“必须”是一个变量,因为该变量是用于“接收传出数据”;

create  procedure  test(in a int)
begin
insert into test (name, age) values ('haha', 18);
end;

  调用存储过程:call  存储过程名  (实参1,实参2);

call test(1);

  删除存储过程:drop  procedure  过程名称;

3、触发器:

create  trigger  触发器名  触发时机  触发事件   on  表名   for  each  row  as

begin

  //这里,才是编程的位置,也就是触发器的内部语句

end;

说明:

1,触发时机,只有2个:  before(在....之前),  after(在....之后);

2,触发事件,只有3个:insert,  update,  delete

3,即其含义是:在某个表上进行insert(或update,或delete)之前(或之后),会去执行其中写好的代码(语句);即每个表只有6个情形会可能调用该触发器;

4,通常,触发器用于在对某个表进行增删改操作的时候,需要同时去做另外一件事情的情形;

5,在触发器的内部,有2个关键字代表某种特定的含义,可以用于获取有关数据:

new:它代表当前正要执行的insert或update的时候的“新行”数据;通过它,可以获取这一新行数据的任意一个字段的值,形式为:

set  @v1 = new.id; //获得该新插入或update行的id字段的值(前提是有该id)

set  @v2 = new.age; //同上;

old:它代表当前正要执行的delete的时候的“旧行”数据,通过它,可以获取这一旧行数据的任意一个字段的值,形式为:

set  @v1 = old.id; //获得该插入或update行的id字段的值(前提是有该id)

set  @v2 = old.age; //同上;

CREATE TRIGGER SumOfSalary BEFORE INSERT ON tb_emp8 FOR EACH ROW SET @sum=@sum+NEW.salary;
CREATE TRIGGER double_salary AFTER INSERT ON tb_emp6 FOR EACH ROW INSERT INTO tb_emp7 VALUES (NEW.id,NEW.name,deptId,2*NEW.salary);