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;




.....


- 思考:如何删掉一张表的重复记录
-- 如何删掉一张表的重复记录
-- 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;

5.合并查询
- 介绍
有时候在实际应用中,为了合并多条select语句的结果,可以使用集合操作符号union、union all、
5.1union all
该操作符用于取得两个结果集的并集。当使用该操作符时,不会取消重复行


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


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

这时候就需要用到外连接
- 外连接
左外连接(如果左侧的表完全显示,我们就说是左外链接)
select ... from 表1 left join 表2 on 条件
表1就是左表 ,表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;


要求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

要求2:右连接(显示所有成绩,如果没有名字匹配就显示空)
-- 右外连接
SELECT `name`,stu.id,grade
FROM stu RIGHT JOIN exam
ON stu.id = exam.id

例子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

在实际的开发中绝大多数情况下使用的是前面学过的连接
day06-多表查询02的更多相关文章
- oracle_多表查询02
多表查询 select * from BONUS; select * from DEPT; select * from EMP; select * from SALGRADE; BONUS表 ENAM ...
- mysql,SQL标准,多表查询中内连接,外连接,自然连接等详解之查询结果集的笛卡尔积的演化
先附上数据. CREATE TABLE `course` ( `cno` ) NOT NULL, `cname` ) CHARACTER SET utf8 NOT NULL, `ctime` ) NO ...
- 【T-SQL基础】01.单表查询-几道sql查询题
概述: 本系列[T-SQL基础]主要是针对T-SQL基础的总结. [T-SQL基础]01.单表查询-几道sql查询题 [T-SQL基础]02.联接查询 [T-SQL基础]03.子查询 [T-SQL基础 ...
- oracle 表查询(二)
1.使用逻辑操作符号问题:查询工资高于500或者是岗位为manager的雇员,同时还要满足他们的姓名首字母为大写的J?select * from emp where (sal > 500 or ...
- SQL基本查询_单表查询(实验二)
SQL基本查询_单表查询(实验二) 查询目标表结构及数据 emp empno ename job hiedate sal comn deptno 1007 马明 内勤 1992-6-12 4000 2 ...
- SQL基本查询_多表查询(实验三)
SQL基本查询_多表查询(实验三) 题目要求(一) 针对emp.dept两表完成如下查询,并验证查询结果的正确性 使用显式内连接查询所有员工的信息,显示其编号.姓名.薪水.入职日期及部门名称: 使用隐 ...
- (六)Oracle 的 oracle表查询关键字
参考:http://www.hechaku.com/Oracle/oracle_tables2.html 1.使用逻辑操作符号问题:查询工资高于500或者是岗位为manager的雇员,同时还要满足他们 ...
- day056-58 django多表增加和查询基于对象和基于双下划线的多表查询聚合 分组查询 自定义标签过滤器 外部调用django环境 事务和锁
一.多表的创建 from django.db import models # Create your models here. class Author(models.Model): id = mod ...
- python 全栈开发,Day74(基于双下划线的跨表查询,聚合查询,分组查询,F查询,Q查询)
昨日内容回顾 # 一对多的添加方式1(推荐) # book=Book.objects.create(title="水浒传",price=100,pub_date="164 ...
- python 全栈开发,Day73(django多表添加,基于对象的跨表查询)
昨日内容回顾 多表方案: 如何确定表关系呢? 表关系是在2张表之间建立的,没有超过2个表的情况. 那么相互之间有2条关系线,先来判断一对多的关系. 如果其中一张表的记录能够对应另外一张表的多条记录,那 ...
随机推荐
- 由反射引出的Java动态代理与静态代理
写在开头 在<深入剖析Java中的反射,由浅入深,层层剥离!>这篇文章中我们讲反射时,曾提到过Java的动态代理中使用了反射技术,那么好,今天我们要就着反射的索引,来学习一下Java中的代 ...
- .NET 云原生架构师训练营(模块二 基础巩固 MVC终结点)--学习笔记
2.3.4 Web API -- MVC终结点 MVC与MVVM 模型绑定 自定义模型绑定器 模型验证 返回数据处理 MVC与MVVM MVC ASP.NET Core MVC 概述:https:// ...
- typora beta版本 typora免费版 typora 0.11.18 下载
壹 ❀ 引 typora从1.0.0正式版开始就不再免费了,可能有一些开了自动检测更新的同学,在某次打开typora就看到了购买以及试用天数的弹窗,但typora正式之前的beta版依旧免费,这里就分 ...
- S905L3A(M401A)拆解, 运行EmuELEC和Armbian
关于S905L3A / S905L3AB S905Lx系列没有公开资料, 猜测是Amlogic用于2B的芯片型号, 最早的 S905LB 是 S905X 的马甲, 而这个 S905L3A/S905L3 ...
- TCP与UDP异同
TCP与UDP异同 TCP/IP模型的运输层有两个不同的协议:UDP用户数据报协议与TCP传输控制协议. 相同点 TCP与UDP都是运行在运输层的协议. TCP与UDP的通信都需要开放端口. 不同点 ...
- 用ELK分析每天4亿多条腾讯云MySQL审计日志(3)--下载日志
当初分析日志,麻烦的是腾讯云的SQL审计日志下载,有下列限制: 1,单次最多1000万条下载 2,单个实例最多生成5条日志文件,多的要先删除以前文件才能生成 腾讯云日志文件生成界面: 一 ...
- Springboot AOP介绍及实战
介绍 AOP是Aspect Oriented Program的首字母缩写:这种在运行时,动态地将代码切入到类的指定方法.指定位置上的编程思想就是面向切面的编程. 主要用于非核心业务处理,比如权限,日志 ...
- oracle authid current_user详解
在编写PLSQL程序时,对于授权的考虑很重要.ORACLE PLSQL中提供两种授权选择: --AUTHID DEFINER (定义者权限):指编译存储对象的所有者.也是默认权限模式. --AUTHI ...
- String--cannot convert from 'const char *' to 'LPTSTR'错误
这种错误,很多情况下是类型不匹配 LPTSTR表示为指向常量TCHAR字符串的长指针 TCHAR可以是wchar_t或char,基于项目是多字节还是宽字节版本. 看下面的代码,代码来源:Example ...
- 文心一言 VS 讯飞星火 VS chatgpt (202)-- 算法导论15.3 1题
一.对于矩阵链乘法问题,下面两种确定最优代价的方法哪种更高效?第一种方法是穷举所有可能的括号化方案,对每种方案计算乘法运算次数,第二种方法是运行RECURSIVE-MATRIX-CHAIN.证明你的结 ...