好得很程序员自学网

<tfoot draggable='sEl'></tfoot>

Mysql:多表查询

所用到的数据库代码如下:

--  部门表
CREATE TABLE dept (
  id INT PRIMARY KEY PRIMARY KEY,  --  部门id
  dname VARCHAR(  50 ), --  部门名称
  loc VARCHAR(  50 ) --  部门所在地
);

 --  添加4个部门
INSERT INTO dept(id,dname,loc) VALUES 
(  10 , ‘  教研部  ‘ , ‘  北京  ‘  ),
(  20 , ‘  学工部  ‘ , ‘  上海  ‘  ),
(  30 , ‘  销售部  ‘ , ‘  广州  ‘  ),
(  40 , ‘  财务部  ‘ , ‘  深圳  ‘  );



 --  职务表,职务名称,职务描述
CREATE TABLE job (
  id INT PRIMARY KEY,
  jname VARCHAR(  20  ),
  description VARCHAR(  50  )
);

 --  添加4个职务
INSERT INTO job (id, jname, description) VALUES
(  1 ,  ‘  董事长  ‘ ,  ‘  管理整个公司,接单  ‘  ),
(  2 ,  ‘  经理  ‘ ,  ‘  管理部门员工  ‘  ),
(  3 ,  ‘  销售员  ‘ ,  ‘  向客人推销产品  ‘  ),
(  4 ,  ‘  文员  ‘ ,  ‘  使用办公软件  ‘  );



 --  员工表
CREATE TABLE emp (
  id INT PRIMARY KEY,  --  员工id
  ename VARCHAR(  50 ), --  员工姓名
  job_id INT,  --  职务id
  mgr INT ,  --  上级领导
  joindate DATE,  --  入职日期
  salary DECIMAL(  7 , 2 ), --  工资
  bonus DECIMAL(  7 , 2 ), --  奖金
  dept_id INT,  --  所在部门编号
  CONSTRAINT emp_jobid_ref_job_id_fk FOREIGN KEY (job_id) REFERENCES job (id),
  CONSTRAINT emp_deptid_ref_dept_id_fk FOREIGN KEY (dept_id) REFERENCES dept (id)
);

 --  添加员工
INSERT INTO emp(id,ename,job_id,mgr,joindate,salary,bonus,dept_id) VALUES 
(  1001 , ‘  孙悟空  ‘ , 4 , 1004 , ‘  2000-12-17  ‘ , ‘  8000.00  ‘ ,NULL, 20  ),
(  1002 , ‘  卢俊义  ‘ , 3 , 1006 , ‘  2001-02-20  ‘ , ‘  16000.00  ‘ , ‘  3000.00  ‘ , 30  ),
(  1003 , ‘  林冲  ‘ , 3 , 1006 , ‘  2001-02-22  ‘ , ‘  12500.00  ‘ , ‘  5000.00  ‘ , 30  ),
(  1004 , ‘  唐僧  ‘ , 2 , 1009 , ‘  2001-04-02  ‘ , ‘  29750.00  ‘ ,NULL, 20  ),
(  1005 , ‘  李逵  ‘ , 4 , 1006 , ‘  2001-09-28  ‘ , ‘  12500.00  ‘ , ‘  14000.00  ‘ , 30  ),
(  1006 , ‘  宋江  ‘ , 2 , 1009 , ‘  2001-05-01  ‘ , ‘  28500.00  ‘ ,NULL, 30  ),
(  1007 , ‘  刘备  ‘ , 2 , 1009 , ‘  2001-09-01  ‘ , ‘  24500.00  ‘ ,NULL, 10  ),
(  1008 , ‘  猪八戒  ‘ , 4 , 1004 , ‘  2007-04-19  ‘ , ‘  30000.00  ‘ ,NULL, 20  ),
(  1009 , ‘  罗贯中  ‘ , 1 ,NULL, ‘  2001-11-17  ‘ , ‘  50000.00  ‘ ,NULL, 10  ),
(  1010 , ‘  吴用  ‘ , 3 , 1006 , ‘  2001-09-08  ‘ , ‘  15000.00  ‘ , ‘  0.00  ‘ , 30  ),
(  1011 , ‘  沙僧  ‘ , 4 , 1004 , ‘  2007-05-23  ‘ , ‘  11000.00  ‘ ,NULL, 20  ),
(  1012 , ‘  李逵  ‘ , 4 , 1006 , ‘  2001-12-03  ‘ , ‘  9500.00  ‘ ,NULL, 30  ),
(  1013 , ‘  小白龙  ‘ , 4 , 1004 , ‘  2001-12-03  ‘ , ‘  30000.00  ‘ ,NULL, 20  ),
(  1014 , ‘  关羽  ‘ , 4 , 1007 , ‘  2002-01-23  ‘ , ‘  13000.00  ‘ ,NULL, 10  );



 --  工资等级表
CREATE TABLE salarygrade (
  grade INT PRIMARY KEY,    --  级别
  losalary INT,   --  最低工资
  hisalary INT  --  最高工资
);

 --  添加5个工资等级
INSERT INTO salarygrade(grade,losalary,hisalary) VALUES 
(  1 , 7000 , 12000  ),
(  2 , 12010 , 14000  ),
(  3 , 14010 , 20000  ),
(  4 , 20010 , 30000  ),
(  5 , 30010 , 99990  );

 --  需求:

 --  1  .查询所有员工信息。查询员工编号,员工姓名,工资,职务名称,职务描述

 --  2  .查询员工编号,员工姓名,工资,职务名称,职务描述,部门名称,部门位置
   
 --  3  .查询员工姓名,工资,工资等级

 --  4  .查询员工姓名,工资,职务名称,职务描述,部门名称,部门位置,工资等级

 --  5  .查询出部门编号、部门名称、部门位置、部门人数
 
 --  6 .查询所有员工的姓名及其直接上级的姓名,没有领导的员工也需要查询
View Code

 

 

FOREIGN KEY (dept_id) REFERENCES dept(id) -- 外键,关联部门表(部门表的主键)

笛卡尔积:
  有两个集合A,B .取这两个集合的所有组成情况。
  要完成多表查询,需要消除无用的数据

多表查询的分类:
   一. 内连接查询:
     1. 隐式内连接:使用where条件消除无用数据
       例子:
        -- 查询所有员工信息和对应的部门信息

         SELECT * FROM emp,dept WHERE emp.`dept_id` = dept.`id`;

         -- 查询员工表的名称,性别。部门表的名称
          SELECT emp.name,emp.gender,dept.name FROM emp,dept WHERE emp.`dept_id` = dept.`id`;

       SELECT
        t1.name, -- 员工表的姓名
        t1.gender,-- 员工表的性别
        t2.name -- 部门表的名称
      FROM
        emp t1,
        dept t2
      WHERE
        t1.`dept_id` = t2.`id`;

 

Mysql:多表查询

标签:办公软件   view   级别   dep   loading   create   job   src   位置   

查看更多关于Mysql:多表查询的详细内容...

  阅读:34次