day06-多表查询02[亲测有效]

day06-多表查询02[亲测有效]多表查询02 4.表复制 自我复制数据(蠕虫复制) 有时,为了对某个sql语句进行效率测试,我们需要海量数据时,可以用此法为表创建海量数据 为了对某个sql语句进行效率测试,我们需要海量数据时,

day06-多表查询02

多表查询02

4.表复制

  • 自我复制数据(蠕虫复制)

有时,为了对某个sql语句进行效率测试,我们需要海量数据时,可以用此法为表创建海量数据

-- 为了对某个sql语句进行效率测试,我们需要海量数据时,可以用此法为表创建海量数据

CREATE TABLE my_tab01(
	id INT ,
	`name` VARCHAR(32),
	sal DOUBLE,
	job VARCHAR(32),
	deptno INT
	)
	
DESC my_tab01
SELECT * FROM my_tab01

-- 演示如何自我复制
-- 1.先把emp表的记录复制到my_tab01
INSERT INTO my_tab01
	(id,`name`,sal,job,deptno)
	SELECT empno,ename,sal,job,deptno FROM emp;
	
-- 2.自我复制
INSERT INTO my_tab01
	SELECT * FROM my_tab01;

SELECT COUNT(*) FROM my_tab01;

image-20221006174155021
image-20221006174200172
image-20221006174205629
image-20221006174252650

…..

image-20221006174357492
image-20221006174516944

  • 思考:如何删掉一张表的重复记录
-- 如何删掉一张表的重复记录
-- 1.先创建一张表 my_tab02
CREATE TABLE my_tab02 LIKE emp; -- 这个语句将 emp表的结构(列),复制到my_tab02
DESC my_tab02;
-- 2.让my_tab02 有重复的记录
INSERT INTO my_tab02 
	SELECT * FROM emp;
	
SELECT * FROM my_tab02;

-- 3.考虑去重
/*
	思路:
	(1)先创建一张临时表 my_tmp,该表的结构和 my_tab02 一样
	(2)把 my_tab02 的记录通过 distinct 关键字处理后,把记录复制到 my_tmp
	(3)清除掉 my_tab02 的记录
	(4)把 my_tmp 的记录复制到 my_tab02 中
	(5)drop 掉 my_tmp表
*/
-- 3.1 先创建一张临时表 my_tmp,该表的结构和 my_tab02 一样
CREATE TABLE my_tmp LIKE my_tab02;
-- 3.2 把 my_tab02 的记录通过 distinct 关键字处理后,把记录复制到 my_tmp
INSERT INTO my_tmp 
	SELECT DISTINCT * FROM my_tab02;
-- 3.3 清除掉 my_tab02 的记录
DELETE FROM my_tab02;
-- 3.4 把 my_tmp 的记录复制到 my_tab02 中
INSERT INTO my_tab02
	SELECT * FROM my_tmp;
-- 3.5 drop 掉 my_tmp表
DROP TABLE my_tmp;

SELECT * FROM my_tab02;

image-20221006182000102

5.合并查询

  • 介绍

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

5.1union all

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

image-20221006183411014
image-20221006183321973

5.2union

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

image-20221006183534971
image-20221006183600851

6.外连接

前面我们学习的查询,是利用where子句对两张表或者多张表,形成的笛卡尔集进行筛选,根据关联条件,显示所有匹配的记录,匹配不上的就不显示

比如:列出部门名称和这些部门的员工名称和工作,同时要求显示出那些没有员工的部门

-- 外连接
-- 比如:列出部门名称和这些部门的员工名称和工作,同时要求显示出那些没有员工的部门

-- 使用我们学过的多表查询的SQL,看看效果如何?
SELECT dname,ename,job
	FROM emp,dept
	WHERE emp.deptno = dept.deptno
	ORDER BY dname
-- 原先的办法只能显示有员工的记录,如果有一个部门没有员工,就无法显示该部门

如下:只能显示三个部门

image-20221006194634553

这时候就需要用到外连接

  • 外连接
  1. 左外连接(如果左侧的表完全显示,我们就说是左外链接)

    select ... from 表1 left join 表2 on 条件
    

    表1就是左表 ,表2就是右表

    左侧的表完全显示是指,即使左边的表跟右边的表没有匹配上,也会将左侧的表完全显示

  2. 右外连接(如果右侧的表完全显示,我们就说是右外链接)

    select ... from 表1 right join 表2 on 条件
    

    表1为左表 ,表2为右表

    右侧的表完全显示是指,即使右边的表跟左边的表没有匹配上,也会将右侧的表完全显示

例子

先创建两张表stu,exam

-- 创建 stu
CREATE TABLE stu(
	id INT,
	`name` VARCHAR(32)
);
INSERT INTO stu VALUES(1,"jack"),(2,"tom"),(3,"kity"),(4,"nono");
SELECT * FROM stu;
-- 创建 exam
CREATE TABLE exam(
	id INT,
	grade INT
);
INSERT INTO exam VALUES(1,56),(2,76),(11,8);
SELECT * FROM exam;

image-20221006200302805image-20221006200349190

要求1:使用左连接(显示所有人的成绩,如果没有成绩,也要显示该人的姓名和id号 )

-- 使用左连接
-- (显示所有人的成绩,如果没有成绩,也要显示该人的姓名和id号)
SELECT `name`,stu.id,grade
	FROM stu,exam
	WHERE stu.id = exam.id

-- 改成左外连接
SELECT `name`,stu.id,grade
	FROM stu LEFT JOIN exam
	ON stu.id = exam.id

image-20221006204806757

要求2:右连接(显示所有成绩,如果没有名字匹配就显示空)

-- 右外连接
SELECT `name`,stu.id,grade
	FROM stu RIGHT JOIN exam
	ON stu.id = exam.id

image-20221006205057034

例子2

列出部门名称和这些部门的员工信息(名字和工作),同时列出那些没有员工的部门

  1. 使用左外连接实现
  2. 使用右外连接实现
-- 列出部门名称和这些部门的员工信息(名字和工作),同时列出那些没有员工的部门
-- 1. 使用左外连接实现
SELECT dname,ename,job
	FROM dept LEFT JOIN emp
	ON dept.deptno = emp.deptno

-- 2. 使用右外连接实现
SELECT dname,ename,job
	FROM emp RIGHT JOIN dept
	ON dept.deptno = emp.deptno

image-20221006210249311

在实际的开发中绝大多数情况下使用的是前面学过的连接

原文地址:https://www.cnblogs.com/liyuelian/archive/2022/10/06/16758516.html

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
转载请注明出处: https://daima100.com/4698.html

(0)
上一篇 2023-06-08 17:30
下一篇 2023-06-08

相关推荐

  • 使用Python创建文件夹

    使用Python创建文件夹创建文件夹是在编写Python程序时经常需要用到的操作之一。在Python中,我们可以使用多种方法来创建文件夹。无论我们使用哪种方法,都是基于操作系统提供的API来完成的。

    2024-06-14
    51
  • Connect SQL Server from Linux Client using Windows Authentication and troubleshoot steps

    Connect SQL Server from Linux Client using Windows Authentication and troubleshoot stepshttps://sqlserver.code.blog/2019/12/14/connect-sql-server-from-linux-client-using-windows-authentica

    2022-12-26
    182
  • MySQL数据库(三)简介[通俗易懂]

    MySQL数据库(三)简介[通俗易懂]前提要述:参考书籍《MySQL必知必会》 2.1 MySQL简介 2.1.1 什么是MySQL MySQL是一种关系数据库管理系统。负责数据库中数据的存储,检索,管理和处理。 2.1.2 MySQL的

    2023-01-22
    150
  • oracle性能分析报告_oracle scheduler

    oracle性能分析报告_oracle scheduler热门资讯 1、中国移动国产OLTP数据库中标公告:南大金仓阿里,万里开源中兴 分获大单 【摘要】近日,中国移动公布了 OLTP 自主可控数据库联合创新项目中标公告。公告显示:国产数据库中,南大通用、…

    2023-03-24
    172
  • MySQL第三天[亲测有效]

    MySQL第三天[亲测有效]2022-09-05 MySQL常用的命令语句 表的操作语句 1、查询某个表的内容 select * from xxx(表名); 2、向某个表内添加数据 以“students”表为例: student

    2023-06-03
    136
  • Python time模块:高效处理时间相关任务的利器

    Python time模块:高效处理时间相关任务的利器在Python程序的开发中,时间处理是一个十分重要的问题,Python中的time模块就是专门提供了对时间处理的相关函数和方法的模块。该模块可以帮助我们在处理时间相关任务的时候,提高代码的效率和可读性,提供强大的功能支持。本文将从多个方面对Python time模块进行详细的阐述,包括时间表示、时间计算、时间格式化、线程睡眠等知识点。

    2024-02-17
    93
  • MYSQL用户权限管理[亲测有效]

    MYSQL用户权限管理[亲测有效]1.在MySQL中,用户是怎么定义的 #mysql中,定义一个用户是: 用户名@’主机域’ #用户名写法: 用户名如果是字符: mysql> create user root@’10.0.0.1′;…

    2023-03-20
    169
  • Python Label Scale:用代码自动完成标签缩放

    Python Label Scale:用代码自动完成标签缩放在数据可视化中,经常需要对标签进行缩放处理,确保显示的标签不会重叠或者太小难以阅读。在传统的方法中,往往需要手动去计算每一个标签的大小和位置,然后进行调整。这个过程非常耗费时间和精力,而且结果常常并不如人意。

    2023-12-25
    116

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注