MySQL的学习与使用

MySQL的学习与使用

本文是基于Windows 10系统环境,学习和使用MySQL:

  • Windows 10
  • mysql-5.5.40-win64.msi for Windows

一、MySQL相关命令

(1)登入MySQL

  • 打开cmd
    MySQL的学习与使用_第1张图片
  • 在命令行终端,键入以下命令
mysql -uroot -p

MySQL的学习与使用_第2张图片
MySQL的学习与使用_第3张图片

(2)查看MySQL中的数据库

  • 在命令行终端,键入以下命令
show databases; # 一定要加“;”号

MySQL的学习与使用_第4张图片

(3)创建一个新的数据库

  • 在命令行终端,键入以下命令
create database day15; # 创建一个名为day15的数据库
create database day16 default character set utf8; # 创建并设置字符集
  • 提示以下内容,创建成功
    MySQL的学习与使用_第5张图片

(4)删除一个数据库

  • 在命令行终端,键入以下命令
drop database day15; # 删除一个名为day15的数据库

(5)查看一个数据库的默认字符集

  • 在命令行终端,键入以下命令
show create database day15; # 查看一个名为day15数据库的默认字符集

MySQL的学习与使用_第6张图片

(6)修改一个数据库的默认字符集

  • 在命令行终端,键入以下命令
alter database day15 default character set gbk; # 修改day15数据库的默认字符集

(7)进入一个数据库

  • 在命令行终端,键入以下命令
use day15; # 只有先进入数据库,才能操作该数据库下的表

(8)显示数据表

  • 在命令行终端,键入以下命令
show tables; # 显示数据表

(9)创建数据表

  • 在命令行终端,键入以下命令
create table student(sid int, sname varchar(20), sage int); # 创建数据表

(10)删除数据表

  • 在命令行终端,键入以下命令
drop table student; # 删除数据表

(11)修改数据表的名字

  • 在命令行终端,键入以下命令
alter table student rename teacher; # 修改数据表的名字

(12)查询数据表的信息

  • 在命令行终端,键入以下命令
desc student; # 查询数据表的信息

(13)增加数据表的一个新字段

  • 在命令行终端,键入以下命令
alter table student add column sgender varchar(2); # 增加数据表的一个新字段

(14)删除数据表的一个字段

  • 在命令行终端,键入以下命令
alter table student drop column sgender; # 删除数据表的一个字段

(15)修改数据表的一个字段的类型

  • 在命令行终端,键入以下命令
alter table student modify sname varchar(50); # 修改数据表的一个字段的类型

(16)修改数据表的一个字段的名字

  • 在命令行终端,键入以下命令
alter table student change sname name varchar(50); # 修改数据表的一个字段的名字

(17)增加数据

  • 在命令行终端,键入以下命令
insert into student values(1,'xuzheng',10); # 增加一条数据,需要全部填写
insert into student(sid, sname) values(3,'wang'); # 增加一条数据,可以部分填写

(18)删除数据

  • 在命令行终端,键入以下命令
delete from student where sid=3; # 删除表中sid=3的数据
delete from student; # 删除表的所有内容,不能重置删除表的约束,可以回滚(事务)
# 删除表的所有内容,会重置删除表的约束,如自增长约束,彻底删除,不可以回滚
truncate table student; 

(19)修改数据

  • 在命令行终端,键入以下命令
update student set sage=30; # 修改数据表所有age字段的值为30,此处为全部修改
update student set sage=30 where sid=3; # 修改数据表中sid=3的age字段的值为30
# 修改数据表中sid=3的多个字段
update student set sname='li', sage=30 where sid=3; 

(20)查询数据

  • 查询所有列
select * from student; # 查询表的所有列
  • 查询指定列
select sid,sname from student; # 查询表的所有列
select sid as '编号',sname as '姓名' from student; # 查询表的指定列
  • 查询时增加一个常量列
select sid,sname,sage,'China' as country from student; # 查询表时增加一个常量列
  • 查询时合并列
select sid,sname,(servlet+jsp) as total from student; # 查询时合并列
# 注意事项,只能合并数值类型的字段
  • 查询时去除重复记录
select distinct(gender) from student; # 查询时合并列
# 注意事项,只能合并数值类型的字段

(21)条件查询

  • 逻辑条件
  • and(与) or(或)
 # 查询表中gender为female与country为China的列
select * from student where gender='female' and country='China';
  • 比较条件
  • < > >= <= = <>(不等于) between and
 # 查询表中sage>20的列
select * from student where sage>20;
select * from student where sage between 20 and 30; # sage>=20 and sage<=30
  • 判空条件
  • is null is not null =’’ <>’'
 # 查询表中sname为空的列
select * from student where sname is null;
select * from student where sname is null or sname='';
select * from student where sname is not null and sname<>'';
  • 模糊条件
  • like
  • % 匹配任意多个字符
  • _ 匹配任意一个字符
select * from student where sname like '张%'; # 张三  张大大
select * from student where sname like '张_'; # 张三
  • 聚合查询
  • sum() avg() max() min() count()
 # 查询表中所有成员的年龄之和
select sum(sage) from student;
 # 查询表中所有成员的平均年龄
select avg(sage) from student;
 # 查询表中所有成员的最大年龄
select max(sage) from student;
 # 查询表中所有成员的最小年龄
select min(sage) from student;
 # 查询表中所有成员的数量
select count(*) from student;
  • 分页查询
  • 起始行从0开始
 # 查询表中从标号为0的记录,查询两行
select * from student limit 0,2;
 # 查询表中从标号为3的记录,查询两行
select * from student limit 2,2;
  • 排序查询
  • asc:数值递增 、字母(a-z)
  • desc:数值递减、字母(z-a)
 # 年龄正序查询
select * from student order by sage asc;
 # 年龄逆序查询
select * from student order by sage desc;
 # 多条件排序
select * from student order by servlet asc, jsp desc;
  • 分组查询
 # 查询男女各多少人
select gender, count(*) as '人数' from student group by gender;
  • 分组之前的条件使用where关键字,分组之后的条件使用having关键字
 # 查询人数大于2个的性别
select gender, count(*) as total from student group by gender having total>2;
  • 关联查询
# 查询员工姓名和部门名
# 多表查询规则:1)确定查询哪些表	2)确定查询哪些字段	3)确定表和表之间的连接条件
# 内连接查询(只有满足条件的结果才可以显示)
select empName, deptName ---- 2)确定查询哪些字段
	from employee, dept  ---- 1)确定查询哪些表
	where employee.deptId=dept.id ---- 3)确定表和表之间的连接条件
# 内连接查询另一种写法
select empName, deptName ---- 2)确定查询哪些字段
	from employee   	 ---- 1)确定查询哪些表 
	inner join dept		 ---- 3)确定表和表之间的连接条件
	on employee.deptId=dept.id  
# 使用别名
select e.empName, d.deptName ---- 2)确定查询哪些字段
	from employee as e   	 ---- 1)确定查询哪些表 
	inner join dept	as d	 ---- 3)确定表和表之间的连接条件
	on e.deptId=d.id  
# 左外连接查询(使用左表的数据去匹配右表的数据,如果符合连接条件的结果则显示,如果不符合连接条件的结果则显示null)
select d.deptName, e.empName 		---- 2)确定查询哪些字段
	from dept as d   	 			---- 1)确定查询哪些表 
	left outer join employee as e	---- 3)确定表和表之间的连接条件
	on d.id=e.deptId  
# 自连接查询(使用左表的数据去匹配右表的数据,如果符合连接条件的结果则显示,如果不符合连接条件的结果则显示null)
select e.empName, d.deptName
	from employee as e
	left outer join employee as b
	where e.bossId=b.id

二、数据库sql文件的导出和导入

(1)数据库导出sql文件

  • 打开cmd,并键入以下的命令
  • 然后再输入密码
# 导出数据库day15,并输出为day15.sql文件
mysqldump -uroot -p day15 > day15.sql
# 使用dir命令查看当前目录下,是否存在day15.sql文件
dir

MySQL的学习与使用_第7张图片

(2)将sql文件导入mysql,生成数据库

  • 首先,在mysql中创建一个空的数据库,命名为day15
# 创建一个空的数据库,并且注意其字符集与sql文件中的数据库保持一致
create database day15;

MySQL的学习与使用_第8张图片

# 进入刚创建好的空数据库day15
use day15;
# 将sql文件导入,生成数据库里的表
# 一定要注意路径名中的斜线‘/’
source C:/Users/bailang/day15.sql

MySQL的学习与使用_第9张图片

  • 通过以下命令可以看出,sql文件导入成功
show tables;
select * from student;

MySQL的学习与使用_第10张图片

三、数据约束

(1)默认值

  • 建一张数据表
  • 如果不插入值,系统自动给address分配默认值‘beijing’
  • 如果插入NULL,那么就是NULL,默认值不起作用
create table test(id int, address varchar(20) default 'beijing');

(2)非空

  • 建一张数据表
  • gender字段必须有值,非空约束,也不能赋空值
create table test(id int, gender varchar(2) not null);

(3)唯一

  • 建一张数据表
  • id字段是唯一约束,不能重复,但是可以是空值NULL
create table test(id int unique, gender varchar(2));

(4)主键

  • 非空+唯一
  • 建一张数据表
create table test(id int primary key, gender varchar(2));

(5)自增长

  • 自动地递增
  • 建一张数据表
create table test(id int primary key auto_increment, gender varchar(2));
# 四位,零填充,0001 xu
create table test(id int(4) zerofill primary key auto_increment, gender varchar(2));

(6)外键

  • 解决数据冗余问题
  • 约束employee表的deptId不可以随意插入,应该遵循dept表的Id
  • 建一张数据表(副表/从表)
create table employee(id int primary key, empName varchar(20), deptId int,
constraint employee_dept_fk foreign key(deptId) references dept(id));
  • 建另一张数据表(主表)
  • 主表的参考字段必须为主键
create table dept(id int primary key, deptName varchar(20));
  • 1.有了外键约束,添加数据的顺序:先添加主表,再添加副表数据
  • 2.有了外键约束,修改数据的顺序:先修改副表,再添加主表数据
  • 3.有了外键约束,删除数据的顺序:先删除副表,再删除主表数据

(7)级联操作

  • 当有了外键约束的时候,必须先修改或者删除副表中所有的关联数据,才能修改或删除主表,但是我们希望通过直接修改或删除主表数据,从而影响副表数据
  • 级联修改:on update cascade
  • 级联删除:on delete cascade
  • 建一张数据表(副表/从表),然后设置级联
create table employee(id int primary key, empName varchar(20), deptId int,
constraint employee_dept_fk foreign key(deptId) references dept(id) on update cascade on delete cascade);
  • 建另一张数据表(主表)
  • 主表的参考字段必须为主键
create table dept(id int primary key, deptName varchar(20));

四、数据库中表的设计原则——三大范式

(1)第一范式

  • 要求表的每一个字段必须是不可分割的独立单元
student :   id    name
	       001	  张三|狗剩    #  违反了第一范式
# 修改后
student :   id    name   old_name
	       001	  张三     狗剩

(2)第二范式

  • 要求每张表只表达一个意思,表的每个字段都和表的主键有依赖
employee :   id    name   deptId  deptName  # deptName符合第二范式

(3)第三范式

  • 要求每张表的主键之外的其他字段都和表的主键有直接决定性的依赖
employee :   id    name   deptId  deptName  # deptName违反了第三范式

五、存储过程

(1)定义

  • 带有逻辑的sql语句,条件或者循环

(2)创建一个存储过程

delimiter $  # 声明存储过程的结束符
create procedure pro_test()
begin
	select * from student; # 可以写多个sql语句
end $
  • 执行一个存储过程
call pro_test();

(3)创建一个带有输入参数的存储过程

delimiter $  # 声明存储过程的结束符
create procedure pro_findById(in eid int)  # in: 输入参数
begin
	select * from student where id=eid; # 可以写多个sql语句
end $
  • 执行一个存储过程
call pro_findById(4);

(4)创建一个带有输出参数的存储过程

delimiter $  # 声明存储过程的结束符
create procedure pro_testOut(out str varchar(20))  # out: 输出参数
begin
	set str='this is a procedure';
end $
  • 执行一个存储过程
call pro_testOut(@name);
select @name;

(5)删除一个存储过程

drop procedure pro_testOut;

(6)创建一个带有输入输出参数的存储过程

delimiter $  # 声明存储过程的结束符
create procedure pro_testInOut(inout n int)  # inout: 输入输出参数
begin
	select n;
	set n=500;
end $
  • 执行一个存储过程
set @n=10;
call pro_testInOut(@n);
select @n;

(7)创建一个带有条件判断的存储过程

delimiter $  # 声明存储过程的结束符
create procedure pro_testIf(in n int,out str varchar(20)) 
begin
	if n=1 then
		set str='one';
	elseif n=2 then
		set str='two';
	else
		set str='other';
	end if;
end $
  • 执行一个存储过程
call pro_testInOut(1, @str);
select @str;

(8)创建一个带有循环功能的存储过程

delimiter $  # 声明存储过程的结束符
create procedure pro_testWhile(in n int,out result int) 
begin
	declare i default 1;
	declare vsum default 0;
	while i<=n do
		set vsum = vsum + i;
		set i = i + 1;
	end while;
	set result = vsum;
end $
  • 执行一个存储过程
call pro_testWhile(100, @result);
select @result;

(9)存储过程练习

  • 如果学生的英语成绩平均分小于等于70,则输出一般
  • 如果学生的英语成绩平均分大于70,且小于等于90,则输出良好
  • 如果学生的英语成绩平均分大于90,则输出优秀

六、触发器

(1)创建一个触发器

create trigger tri_empAdd after insert on employee for each row
	insert into test_log(content) values('员工表插入一条记录');
# 也可以执行一个存储过程
create trigger tri_empAdd after insert on employee for each row
	call pro_test();
create trigger tri_empAdd after update on employee for each row
	insert into test_log(content) values('员工表修改一条记录');
create trigger tri_empAdd after delete on employee for each row
	insert into test_log(content) values('员工表删除一条记录');

七、数据库权限

(1)root权限

  • root:拥有所有权限

(2)修改mysql密码

use mysql;
update user set password=password('123456') where user='root';

(3)分配权限

  • 权限:select insert delete update drop create all
# 授予172.30.12.59的eric用户对于表day16.employee的select权限
grant select on day16.employee to 'eric'@'172.30.12.59' identified by 'password';
# 只有localhost的eric用户对于表day16.employee具有insert权限
grant insert on day16.employee to 'eric'@'localhost' identified by 'password';
# 任何地址的eric用户对于表day16.employee都有delete权限
grant delete on day16.employee to 'eric'@'%' identified by 'password';

八、数据库备份和恢复

(1)数据库备份

mysqldump -uroot -p day15 > d:/day15.sql;

(2)数据库恢复

drop database day15;  # 删除原来的数据库
create database day15; # 新建一个空的数据库
mysql -uroot -p day15 < d:/day15.sql; # 恢复数据库

你可能感兴趣的:(mysql,mysql)