本文是基于Windows 10系统环境,学习和使用MySQL:
mysql -uroot -p
show databases; # 一定要加“;”号
create database day15; # 创建一个名为day15的数据库
create database day16 default character set utf8; # 创建并设置字符集
drop database day15; # 删除一个名为day15的数据库
show create database day15; # 查看一个名为day15数据库的默认字符集
alter database day15 default character set gbk; # 修改day15数据库的默认字符集
use day15; # 只有先进入数据库,才能操作该数据库下的表
show tables; # 显示数据表
create table student(sid int, sname varchar(20), sage int); # 创建数据表
drop table student; # 删除数据表
alter table student rename teacher; # 修改数据表的名字
desc student; # 查询数据表的信息
alter table student add column sgender varchar(2); # 增加数据表的一个新字段
alter table student drop column sgender; # 删除数据表的一个字段
alter table student modify sname varchar(50); # 修改数据表的一个字段的类型
alter table student change sname name varchar(50); # 修改数据表的一个字段的名字
insert into student values(1,'xuzheng',10); # 增加一条数据,需要全部填写
insert into student(sid, sname) values(3,'wang'); # 增加一条数据,可以部分填写
delete from student where sid=3; # 删除表中sid=3的数据
delete from student; # 删除表的所有内容,不能重置删除表的约束,可以回滚(事务)
# 删除表的所有内容,会重置删除表的约束,如自增长约束,彻底删除,不可以回滚
truncate table student;
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;
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; # 查询时合并列
# 注意事项,只能合并数值类型的字段
# 查询表中gender为female与country为China的列
select * from student where gender='female' and country='China';
# 查询表中sage>20的列
select * from student where sage>20;
select * from student where sage between 20 and 30; # sage>=20 and sage<=30
# 查询表中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<>'';
select * from student where sname like '张%'; # 张三 张大大
select * from student where sname like '张_'; # 张三
# 查询表中所有成员的年龄之和
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的记录,查询两行
select * from student limit 0,2;
# 查询表中从标号为3的记录,查询两行
select * from student limit 2,2;
# 年龄正序查询
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;
# 查询人数大于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
# 导出数据库day15,并输出为day15.sql文件
mysqldump -uroot -p day15 > day15.sql
# 使用dir命令查看当前目录下,是否存在day15.sql文件
dir
# 创建一个空的数据库,并且注意其字符集与sql文件中的数据库保持一致
create database day15;
# 进入刚创建好的空数据库day15
use day15;
# 将sql文件导入,生成数据库里的表
# 一定要注意路径名中的斜线‘/’
source C:/Users/bailang/day15.sql
show tables;
select * from student;
create table test(id int, address varchar(20) default 'beijing');
create table test(id int, gender varchar(2) not null);
create table test(id int unique, gender varchar(2));
create table test(id int primary key, gender varchar(2));
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));
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));
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));
student : id name
001 张三|狗剩 # 违反了第一范式
# 修改后
student : id name old_name
001 张三 狗剩
employee : id name deptId deptName # deptName符合第二范式
employee : id name deptId deptName # deptName违反了第三范式
delimiter $ # 声明存储过程的结束符
create procedure pro_test()
begin
select * from student; # 可以写多个sql语句
end $
call pro_test();
delimiter $ # 声明存储过程的结束符
create procedure pro_findById(in eid int) # in: 输入参数
begin
select * from student where id=eid; # 可以写多个sql语句
end $
call pro_findById(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;
drop procedure pro_testOut;
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;
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;
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;
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('员工表删除一条记录');
use mysql;
update user set password=password('123456') where user='root';
# 授予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';
mysqldump -uroot -p day15 > d:/day15.sql;
drop database day15; # 删除原来的数据库
create database day15; # 新建一个空的数据库
mysql -uroot -p day15 < d:/day15.sql; # 恢复数据库