MySQL_day02 学习笔记 —— 多表查询、子查询、分页、数据库备份、PL/SQL编程
MySQL_day02
1. 多表连接查询
假设有两个表:
dept(主表)
id dname loc
1 第一开发部 北京
2 第二开发部 上海
3 第三开发部 太原
emp(外键表)
id ename salary deptid(外键字段)
1 张三 8000 1
2 李四 5000 3
3 王五 8000 null
1.1 笛卡尔积
两张表的记录的乘积。
eg:
create table dept(
id int auto_increment primary key,
dename varchar(50),
loc varchar(50)
);
set names gbk;
insert into dept(dename,loc) values(‘第一开发部’,‘北京’);
insert into dept(dename,loc) values(‘第二开发部’,'上海 ');
insert into dept(dename,loc) values(‘第三开发部’,‘太原’);
create table emp(
id int auto_increment primary key,
ename varchar(50),
salary float,
deptid int
);
insert into emp(ename,salary,deptid) values(‘张三’,8000,1);
insert into emp(ename,salary,deptid) values(‘李四’,5000,3);
insert into emp(ename,salary,deptid) values(‘王五’,8000,null);
select * from emp,dept;
1.2 内连接查询
把满足连接条件的数据查出来。
-
select *
from emp e,dept d
where e.deptid = d.id; -
新语法
select *
from emp e inner join dept d
on e.deptid = d.id;
1.3 外连接查询
除了把满足条件的数据查出来,还要把不满足条件的数据查出来。
1.3.1 左外连接查询
除了把满足条件的数据查出来,还要把左表不满足条件的数据查出来。
left左边的表叫左表
- select *
from emp left outer join dept
on emp.deptid = dept.id;
1.3.2 右外连接查询
right右边的表叫右表
- select *
from dept right outer join emp
on emp.deptid = dept.id;
1.3.3 全(满)外连接查询
Oracle中:full outer join
mysql中:union模拟全外连接
2. 子查询
需求:显示工资比张三高的员工信息。
select *
from emp
where salary>(
select salary
from emp
where ename=‘张三’
);
3. 分页:limit
select *
from emp
limit 0,2; // 0表示从哪条记录开始,2表示一页显示多少条数据
pageNum | start |
---|---|
1 | 0 |
2 | 2 |
3 | 4 |
start = (pageNum - 1) * 条数
4. 数据库的备份
-
导出数据库:(cmd中)
mysqldump -u用户名 -p密码 数据库名 > c:/xxx.sql -
导入数据库:
- (mysql客户端) 新建库 create database 数据库名;
-
方法一:(cmd中) mysql -u用户名 -p密码 数据库名 < c:/xxx.sql
方法二:(mysql客户端) source c:/xxx.sql
5. PL/SQL编程
5.1 存储过程
返回指定的id的姓名
创建存储过程:
-
delimiter //
定义结束符号为// -
create procedure pro_emp(in pid int,out pname varchar(40))
in 输入参数,可以省略
out 输出参数
create procedure pro_emp(inout pname varchar(40)) - begin
select ename into pname from emp where id = pid;
end // -
delimiter ;
恢复以分号为结束符号 -
call pro_emp(1,@name);
调用存储过程 - select @name;
5.2 存储函数
delimiter //
create function fun_emp(pid int) returns varchar(40)
begin
declare vname varchar(40);
select ename into vname from emp where id=pid;
return vname;
end //
delimiter ;
select fun_emp(1);
存储过程和函数的区别:
- 过程不能有返回值,函数必须有返回值
- 过程可以调用函数,函数不能调用过程
5.3 触发器
需求:修改emp表的ename时,把修改之前的ename保存到test_emp表中。
- create table test_emp(
id int auto_increment primary key,
test_ename varchar(40)
); - delimiter //
- create trigger tri_emp before update on emp
- for each row begin
insert into test_emp(test_ename) values(old.ename);
end // - delimiter ;
- update emp set ename=“zhangsan” where id=1;
不用调用,执行此语句会自动触发触发器