创建虚拟数据

  1. -- [创建公司职员表] --
  2. DROP TABLE IF EXISTS `company_staff`; -- 如果company_staff表存在则先删除重建
  3. CREATE TABLE `company_staff` (
  4. `id` int(11) NOT NULL AUTO_INCREMENT,
  5. `name` varchar(50) NOT NULL,
  6. `age` tinyint(4) DEFAULT '0',
  7. `sex` enum('男','女','保密') NOT NULL DEFAULT '保密',
  8. `salary` decimal(10,3) NOT NULL DEFAULT '10000.000',
  9. `hire_date` date NOT NULL,
  10. `company_department_id` int(11) DEFAULT NULL,
  11. PRIMARY KEY (`id`)
  12. ) ENGINE=InnoDB AUTO_INCREMENT=13 DEFAULT CHARSET=utf8;
  13. -- [添加职员数据] --
  14. -- [软件开发部] --
  15. INSERT INTO `company_staff` VALUES ('1', 'Tom', '25', '男', '27000.000', '2019-04-21', '1');
  16. INSERT INTO `company_staff` VALUES ('2', 'Roudo', '27', '男', '38000.000', '2020-02-21', '1');
  17. INSERT INTO `company_staff` VALUES ('3', 'Aaron', '30', '男', '26500.000', '2017-03-11', '1');
  18. INSERT INTO `company_staff` VALUES ('4', 'Lance', '48', '男', '46680.000', '2003-05-20', '1');
  19. -- [国际事务] --
  20. INSERT INTO `company_staff` VALUES ('5', 'Leo', '23', '男', '13600.000', '2017-06-21', '2');
  21. INSERT INTO `company_staff` VALUES ('6', 'Lee', '24', '男', '12400.000', '2013-06-30', '2');
  22. INSERT INTO `company_staff` VALUES ('7', 'lvan', '26', '女', '12500.000', '2014-03-27', '2');
  23. INSERT INTO `company_staff` VALUES ('8', 'Jack', '29', '女', '22300.000', '2003-07-21', '2');
  24. -- [法律部] --
  25. INSERT INTO `company_staff` VALUES ('9', '张飞', '41', '女', '24000.000', '2003-05-21', '3');
  26. INSERT INTO `company_staff` VALUES ('10', '李逵', '42', '女', '34000.000', '2005-04-15', '3');
  27. INSERT INTO `company_staff` VALUES ('11', '罗翔', '45', '男', '54000.000', '2005-03-15', '3');
  28. -- [销售部] --
  29. INSERT INTO `company_staff` VALUES ('12', '孙权', '37', '女', '65000.000', '2000-06-21', '4');
  30. -- [创建部门表] --
  31. CREATE TABLE `company_department` (
  32. id int not null auto_increment PRIMARY KEY,
  33. name VARCHAR(125) not null COMMENT '部门名称'
  34. )ENGINE=INNODB DEFAULT charset utf8;
  35. -- [添加部门数据] --
  36. INSERT INTO `company_department` VALUES ('1', '软件开发部');
  37. INSERT INTO `company_department` VALUES ('2', '国际事务');
  38. INSERT INTO `company_department` VALUES ('3', '法律部');
  39. INSERT INTO `company_department` VALUES ('4', '销售部');

多表查询语法

  1. select 字段1,字段2... from 1,表2... [where 条件]

PS: 如果不加条件直接进行查询的话, 则会出现笛卡尔乘积这种现象

  1. #查询职员和部门所有信息
  2. select * from company_staff, company_department

笛卡尔乘积公式 : A表中数据条数 * B表中数据条数 = 笛卡尔乘积
image.png
笛卡尔乘积示例

  1. #查询职员和部门所有信息
  2. select * from company_staff, company_department
  3. where company_department.id = company_staff.company_department_id;
  4. #注意: 多表查询时,一定要找到两个表中相互关联的字段,并且作为条件使用

image.png
查询结果

  1. #查询职员和部门所有信息
  2. select company_staff.id,company_staff.name,company_staff.age,company_staff.sex,
  3. company_staff.salary,company_staff.hire_date,company_department.name
  4. from company_staff,company_department
  5. where company_department.id = company_staff.company_department_id;
  6. #注意: 多表查询时,一定要找到两个表中相互关联的字段,并且作为条件使用

image.png

  1. #查询职员和部门所有信息
  2. select company_staff.id `编号`,company_staff.name `姓名`,company_staff.age `年龄`,
  3. company_staff.sex `性别`,company_staff.salary `月薪`,company_staff.hire_date `入职日期`,
  4. company_department.name `部门`
  5. from company_staff,company_department
  6. where company_department.id = company_staff.company_department_id;
  7. #注意: 多表查询时,一定要找到两个表中相互关联的字段,并且作为条件使用

image.png

  • 多表联合查询方式
    1. #多表连接查询语法(重点)
    2. SELECT 字段列表
    3. FROM 1 INNER|LEFT|RIGHT JOIN 2
    4. ON 1.字段 = 2.字段;

内连接查询方式 (只显示符合条件的数据)

  1. #查询公司职员和部门所有信息
  2. select * from company_staff
  3. inner join company_department
  4. on company_staff.company_department_id = company_department.id;

image.png
查询公司职员和部门所有信息

  1. #查询公司职员和部门所有信息
  2. select company_staff.id `编号`,company_staff.name `姓名`,company_staff.age `年龄`,
  3. company_staff.sex `性别`,company_staff.salary `月薪`,company_staff.hire_date `入职日期`,
  4. company_department.name `部门`
  5. from company_staff
  6. inner join company_department
  7. on company_staff.company_department_id = company_department.id;

image.png

MySQL多表查询全面解析实例 - 图7Mysql多表查询

左外连接查询 (左边表中的数据优先全部显示)

  1. #查询职员员和部门所有信息
  2. select * from company_staff
  3. left join company_department
  4. on company_staff.company_department_id = company_department.id;

image.png
左连接查询示例
MySQL多表查询全面解析实例 - 图9左连接查询图

右外连接查询 (右边表中的数据优先全部显示)

  1. #查询职员和部门所有信息
  2. select * from company_staff
  3. right join company_department
  4. on company_staff.company_department_id = company_department.id;

image.png
右链接插叙示例

MySQL多表查询全面解析实例 - 图11有链接查询图

全连接查询(显示左右表中全部数据)
全连接查询:是在内连接的基础上增加 左右两边没有显示的数据
注意: mysql并不支持全连接 full JOIN 关键字
注意: 但是mysql 提供了 UNION 关键字.使用 UNION 可以间接实现 full JOIN 功能

  1. #查询职员和部门的所有数据
  2. SELECT * FROM company_staff LEFT JOIN company_department
  3. ON company_staff.company_department_id = company_department.id
  4. UNION
  5. SELECT * FROM company_staff RIGHT JOIN company_department
  6. ON company_staff.company_department_id = company_department.id;

image.png全连接查询示例

MySQL多表查询全面解析实例 - 图13全连接查询图