day06-多表查询02

打印 上一主题 下一主题

主题 978|帖子 978|积分 2934

多表查询02

4.表复制


  • 自我复制数据(蠕虫复制)
有时,为了对某个sql语句进行效率测试,我们需要海量数据时,可以用此法为表创建海量数据
  1. -- 为了对某个sql语句进行效率测试,我们需要海量数据时,可以用此法为表创建海量数据
  2. CREATE TABLE my_tab01(
  3.         id INT ,
  4.         `name` VARCHAR(32),
  5.         sal DOUBLE,
  6.         job VARCHAR(32),
  7.         deptno INT
  8.         )
  9.        
  10. DESC my_tab01
  11. SELECT * FROM my_tab01
  12. -- 演示如何自我复制
  13. -- 1.先把emp表的记录复制到my_tab01
  14. INSERT INTO my_tab01
  15.         (id,`name`,sal,job,deptno)
  16.         SELECT empno,ename,sal,job,deptno FROM emp;
  17.        
  18. -- 2.自我复制
  19. INSERT INTO my_tab01
  20.         SELECT * FROM my_tab01;
  21. SELECT COUNT(*) FROM my_tab01;
复制代码
.....


  • 思考:如何删掉一张表的重复记录
  1. -- 如何删掉一张表的重复记录
  2. -- 1.先创建一张表 my_tab02
  3. CREATE TABLE my_tab02 LIKE emp; -- 这个语句将 emp表的结构(列),复制到my_tab02
  4. DESC my_tab02;
  5. -- 2.让my_tab02 有重复的记录
  6. INSERT INTO my_tab02
  7.         SELECT * FROM emp;
  8.        
  9. SELECT * FROM my_tab02;
  10. -- 3.考虑去重
  11. /*
  12.         思路:
  13.         (1)先创建一张临时表 my_tmp,该表的结构和 my_tab02 一样
  14.         (2)把 my_tab02 的记录通过 distinct 关键字处理后,把记录复制到 my_tmp
  15.         (3)清除掉 my_tab02 的记录
  16.         (4)把 my_tmp 的记录复制到 my_tab02 中
  17.         (5)drop 掉 my_tmp表
  18. */
  19. -- 3.1 先创建一张临时表 my_tmp,该表的结构和 my_tab02 一样
  20. CREATE TABLE my_tmp LIKE my_tab02;
  21. -- 3.2 把 my_tab02 的记录通过 distinct 关键字处理后,把记录复制到 my_tmp
  22. INSERT INTO my_tmp
  23.         SELECT DISTINCT * FROM my_tab02;
  24. -- 3.3 清除掉 my_tab02 的记录
  25. DELETE FROM my_tab02;
  26. -- 3.4 把 my_tmp 的记录复制到 my_tab02 中
  27. INSERT INTO my_tab02
  28.         SELECT * FROM my_tmp;
  29. -- 3.5 drop 掉 my_tmp表
  30. DROP TABLE my_tmp;
  31. SELECT * FROM my_tab02;
复制代码
5.合并查询


  • 介绍
有时候在实际应用中,为了合并多条select语句的结果,可以使用集合操作符号union、union all、
5.1union all

该操作符用于取得两个结果集的集。当使用该操作符时,不会取消重复行
5.2union

该操作符与union all相似。但是会自动去掉结果集中的重复行
6.外连接

前面我们学习的查询,是利用where子句对两张表或者多张表,形成的笛卡尔集进行筛选,根据关联条件,显示所有匹配的记录,匹配不上的就不显示
比如:列出部门名称和这些部门的员工名称和工作,同时要求显示出那些没有员工的部门
  1. -- 外连接
  2. -- 比如:列出部门名称和这些部门的员工名称和工作,同时要求显示出那些没有员工的部门
  3. -- 使用我们学过的多表查询的SQL,看看效果如何?
  4. SELECT dname,ename,job
  5.         FROM emp,dept
  6.         WHERE emp.deptno = dept.deptno
  7.         ORDER BY dname
  8. -- 原先的办法只能显示有员工的记录,如果有一个部门没有员工,就无法显示该部门
复制代码
如下:只能显示三个部门
这时候就需要用到外连接

  • 外连接

  • 左外连接(如果左侧的表完全显示,我们就说是左外链接)
    1. select ... from 表1 left join 表2 on 条件
    复制代码
    表1就是左表 ,表2就是右表
    左侧的表完全显示是指,即使左边的表跟右边的表没有匹配上,也会将左侧的表完全显示
  • 右外连接(如果右侧的表完全显示,我们就说是右外链接)
    1. select ... from 表1 right join 表2 on 条件
    复制代码
    表1为左表 ,表2为右表
    右侧的表完全显示是指,即使右边的表跟左边的表没有匹配上,也会将右侧的表完全显示
例子
先创建两张表stu,exam
  1. -- 创建 stu
  2. CREATE TABLE stu(
  3.         id INT,
  4.         `name` VARCHAR(32)
  5. );
  6. INSERT INTO stu VALUES(1,'jack'),(2,'tom'),(3,'kity'),(4,'nono');
  7. SELECT * FROM stu;
  8. -- 创建 exam
  9. CREATE TABLE exam(
  10.         id INT,
  11.         grade INT
  12. );
  13. INSERT INTO exam VALUES(1,56),(2,76),(11,8);
  14. SELECT * FROM exam;
复制代码

要求1:使用左连接(显示所有人的成绩,如果没有成绩,也要显示该人的姓名和id号  )
  1. -- 使用左连接
  2. -- (显示所有人的成绩,如果没有成绩,也要显示该人的姓名和id号)
  3. SELECT `name`,stu.id,grade
  4.         FROM stu,exam
  5.         WHERE stu.id = exam.id
  6. -- 改成左外连接
  7. SELECT `name`,stu.id,grade
  8.         FROM stu LEFT JOIN exam
  9.         ON stu.id = exam.id
复制代码
要求2:右连接(显示所有成绩,如果没有名字匹配就显示空)
  1. -- 右外连接
  2. SELECT `name`,stu.id,grade
  3.         FROM stu RIGHT JOIN exam
  4.         ON stu.id = exam.id
复制代码
例子2
列出部门名称和这些部门的员工信息(名字和工作),同时列出那些没有员工的部门

  • 使用左外连接实现
  • 使用右外连接实现
  1. -- 列出部门名称和这些部门的员工信息(名字和工作),同时列出那些没有员工的部门
  2. -- 1. 使用左外连接实现
  3. SELECT dname,ename,job
  4.         FROM dept LEFT JOIN emp
  5.         ON dept.deptno = emp.deptno
  6. -- 2. 使用右外连接实现
  7. SELECT dname,ename,job
  8.         FROM emp RIGHT JOIN dept
  9.         ON dept.deptno = emp.deptno
复制代码
在实际的开发中绝大多数情况下使用的是前面学过的连接

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

风雨同行

金牌会员
这个人很懒什么都没写!
快速回复 返回顶部 返回列表