一、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 数据库名称
二、字段类型
三、表操作命令
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);