MySQL_day02 学习笔记 —— 多表查询、子查询、分页、数据库备份、PL/SQL编程

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(‘第三开发部’,‘太原’);
MySQL_day02 学习笔记 —— 多表查询、子查询、分页、数据库备份、PL/SQL编程

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);
MySQL_day02 学习笔记 —— 多表查询、子查询、分页、数据库备份、PL/SQL编程
select * from emp,dept;
MySQL_day02 学习笔记 —— 多表查询、子查询、分页、数据库备份、PL/SQL编程

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;
    MySQL_day02 学习笔记 —— 多表查询、子查询、分页、数据库备份、PL/SQL编程

1.3 外连接查询

除了把满足条件的数据查出来,还要把不满足条件的数据查出来。

1.3.1 左外连接查询

除了把满足条件的数据查出来,还要把左表不满足条件的数据查出来。
left左边的表叫左表

  • select *
    from emp left outer join dept
    on emp.deptid = dept.id;
    MySQL_day02 学习笔记 —— 多表查询、子查询、分页、数据库备份、PL/SQL编程

1.3.2 右外连接查询

right右边的表叫右表

  • select *
    from dept right outer join emp
    on emp.deptid = dept.id;
    MySQL_day02 学习笔记 —— 多表查询、子查询、分页、数据库备份、PL/SQL编程

1.3.3 全(满)外连接查询

Oracle中:full outer join
mysql中:union模拟全外连接
MySQL_day02 学习笔记 —— 多表查询、子查询、分页、数据库备份、PL/SQL编程

2. 子查询

需求:显示工资比张三高的员工信息。
select *
from emp
where salary>(
select salary
from emp
where ename=‘张三’
);

3. 分页:limit

select *
from emp
limit 0,2; // 0表示从哪条记录开始,2表示一页显示多少条数据
MySQL_day02 学习笔记 —— 多表查询、子查询、分页、数据库备份、PL/SQL编程

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;

MySQL_day02 学习笔记 —— 多表查询、子查询、分页、数据库备份、PL/SQL编程

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);
MySQL_day02 学习笔记 —— 多表查询、子查询、分页、数据库备份、PL/SQL编程
存储过程和函数的区别:

  • 过程不能有返回值,函数必须有返回值
  • 过程可以调用函数,函数不能调用过程

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;
    不用调用,执行此语句会自动触发触发器

MySQL_day02 学习笔记 —— 多表查询、子查询、分页、数据库备份、PL/SQL编程