设为首页 收藏本站
查看: 1052|回复: 0

[经验分享] 补12.关于mysql的多表查询

[复制链接]

尚未签到

发表于 2018-10-9 07:05:44 | 显示全部楼层 |阅读模式
  首先先准备两张表。
  首先是员工信息表,表名为employee。
  create table employee( emp_id int primary key auto_increment not null, emp_name varchar(50), age int, dept_id int );
  然后在员工信息表中插入6条记录:
  insert into employee(emp_name,age,dept_id)values ('A',19,200), ('B',26,201), ('C',30,201), ('D',24,202), ('E',20,200), ('F',38,204);
  #创建了6个员工。
  然后是部门信息表。
  create table department( dept_id int, dept_name varchar(100) );
  #部门信息表中包含了部门ID以及部门名称。
  insert into department values(200,'人事部'),(201,'技术部'),(202,'销售部'),(203,'财政部');
  #在部门表中添加了4个部门。
  employee表:
  +--------+----------+------+---------+
  | emp_id | emp_name | age  | dept_id |
  +--------+----------+------+---------+
  |      1 | A        |   19 |     200 |
  |      2 | B        |   26 |     201 |
  |      3 | C        |   30 |     201 |
  |      4 | D        |   24 |     202 |
  |      5 | E        |   20 |     200 |
  |      6 | F        |   38 |     204 |
  +--------+----------+------+---------+
  department表:
  +---------+-----------+
  | dept_id | dept_name |
  +---------+-----------+
  |     200 | 人事部    |
  |     201 | 技术部    |
  |     202 | 销售部    |
  |     203 | 财政部    |
  +---------+-----------+
  一、笛卡尔积查询:
  select * from employee,department;
  结果:
  +--------+----------+------+---------+---------+-----------+
  | emp_id | emp_name | age  | dept_id | dept_id | dept_name |
  +--------+----------+------+---------+---------+-----------+
  |      1 | A        |   19 |     200 |     200 | 人事部    |
  |      1 | A        |   19 |     200 |     201 | 技术部    |
  |      1 | A        |   19 |     200 |     202 | 销售部    |
  |      1 | A        |   19 |     200 |     203 | 财政部    |
  |      2 | B        |   26 |     201 |     200 | 人事部    |
  |      2 | B        |   26 |     201 |     201 | 技术部    |
  |      2 | B        |   26 |     201 |     202 | 销售部    |
  |      2 | B        |   26 |     201 |     203 | 财政部    |
  |      3 | C        |   30 |     201 |     200 | 人事部    |
  |      3 | C        |   30 |     201 |     201 | 技术部    |
  |      3 | C        |   30 |     201 |     202 | 销售部    |
  |      3 | C        |   30 |     201 |     203 | 财政部    |
  |      4 | D        |   24 |     202 |     200 | 人事部    |
  |      4 | D        |   24 |     202 |     201 | 技术部    |
  |      4 | D        |   24 |     202 |     202 | 销售部    |
  |      4 | D        |   24 |     202 |     203 | 财政部    |
  |      5 | E        |   20 |     200 |     200 | 人事部    |
  |      5 | E        |   20 |     200 |     201 | 技术部    |
  |      5 | E        |   20 |     200 |     202 | 销售部    |
  |      5 | E        |   20 |     200 |     203 | 财政部    |
  |      6 | F        |   38 |     204 |     200 | 人事部    |
  |      6 | F        |   38 |     204 |     201 | 技术部    |
  |      6 | F        |   38 |     204 |     202 | 销售部    |
  |      6 | F        |   38 |     204 |     203 | 财政部    |
  +--------+----------+------+---------+---------+-----------+
  显然这种结果没有任何的意义。
  二、内连接查询。
  查询两张表中都有的关联数据,相当于利用条件从笛卡尔积结果中筛选出了正确的结果。
  下面是一个内连接查询的例子:
  还拿前面的两张表举例,现在需要列出所有员工的姓名,以及职位名称。
  select emp_name,dept_name from employee,department where employee.dept_id = department.dept_id;
  +----------+-----------+
  | emp_name | dept_name |
  +----------+-----------+
  | A        | 人事部    |
  | B        | 技术部    |
  | C        | 技术部    |
  | D        | 销售部    |
  | E        | 人事部    |
  +----------+-----------+
  三、外连接查询。

  •   左外链接:在内连接的基础上增加左边有右边没有的结果。
      select * from employee left join department on employee.dept_id = department.dept_id;
      #就是以左边的表为基准
  +--------+----------+------+---------+---------+-----------+
  | emp_id | emp_name | age  | dept_id | dept_id | dept_name |
  +--------+----------+------+---------+---------+-----------+
  |      1 | A        |   19 |     200 |     200 | 人事部    |
  |      5 | E        |   20 |     200 |     200 | 人事部    |
  |      2 | B        |   26 |     201 |     201 | 技术部    |
  |      3 | C        |   30 |     201 |     201 | 技术部    |
  |      4 | D        |   24 |     202 |     202 | 销售部    |
  |      6 | F        |   38 |     204 |    NULL | NULL      |
  +--------+----------+------+---------+---------+-----------+
  2.右外链接:在内连接的基础上增加右边有左边没有的结果。
  select * from employee right join department on employee.dept_id = department.dept_id;
  +--------+----------+------+---------+---------+-----------+
  | emp_id | emp_name | age  | dept_id | dept_id | dept_name |
  +--------+----------+------+---------+---------+-----------+
  |      1 | A        |   19 |     200 |     200 | 人事部    |
  |      2 | B        |   26 |     201 |     201 | 技术部    |
  |      3 | C        |   30 |     201 |     201 | 技术部    |
  |      4 | D        |   24 |     202 |     202 | 销售部    |
  |      5 | E        |   20 |     200 |     200 | 人事部    |
  |   NULL | NULL     | NULL |    NULL |     203 | 财政部    |
  +--------+----------+------+---------+---------+-----------+
  3.全外链接:
  全外连接是将左外链接和右外链接做一个结合。
  select * from employee RIGHT JOIN department on employee.dept_id = department.dept_id UNION select * from employee LEFT JOIN department on employee.dept_id = department.dept_id;
  使用union关键字将左链接和有链接的结果做个一个拼接。
  union :去除所有重复的结果。
  union all : 没有去重功能。
  4.多表复合条件查询。
  比如说现在想要查询,公司年龄大于25岁的员工都在哪个部门中。
  select distinct department.dept_name from employee,department where employee.dept_id = department.dept_id and age > 25;
  +-----------+
  | dept_name |
  +-----------+
  | 技术部    |
  +-----------+
  以公司所有员工的年龄以从小到大的方式排序。
  select employee.emp_id,employee.emp_name,employee.age,department.dept_name from employee,department where employee.dept_id = department.dept_id order by age asc;
  5.多表子查询。
  子查询,就是将一个查询的sql语句,嵌套在另一个查询的sql语句中。
  内层查询语句的查询结果,可以为外层查询语句提供查询条件。
  子查询中可以包含:IN、NOT IN、ANY、ALL、EXISTS 和 NOT EXISTS等关键字。
  IN关键字:这个关键字大概是包含的意思。
  比如说,查询employee表,但dept_id必须在department表中出现过。
  包含在department表中dept_id字段中,才会显示。
  select * from employee where dept_id in (select dept_id from department);
  +--------+----------+------+---------+
  | emp_id | emp_name | age  | dept_id |
  +--------+----------+------+---------+
  |      1 | A        |   19 |     200 |
  |      2 | B        |   26 |     201 |
  |      3 | C        |   30 |     201 |
  |      4 | D        |   24 |     202 |
  |      5 | E        |   20 |     200 |
  +--------+----------+------+---------+
  使用比较运算符:
  =、!=、>、>=、

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-618231-1-1.html 上篇帖子: 源码安装nginx、mysql的注意事项 下篇帖子: mysql基础(六)mysql事务
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表