技术标签: 数据库DataBase join 数据库 sql
1、笛卡尔积
(1)当多张表进行连接查询,没有任何条件限制的时候,最终查询结果条数,是多张表条数的乘积
如A表15条(行)数据,B表20条(行)数据,结果查询两张表时,会产生 15 * 20 = 300条(行)数据
select empname,deptname from emp, dept;
(2)避免笛卡尔积现象
select
empname,deptname
from
emp, dept
where
emp.deptno = dept.deptno;
// 或者
select
e.empname,d.deptname
from
emp e, dept d
where
e.deptno = d.deptno; //SQL92语法
最终得出结果会减少,但是查询次数依然是两张表行数的乘积
因此:通过笛卡尔积现象得出,表的连接次数越多效率越低,尽量避免表的连接次数
2、SQL JOIN 子句用于把来自两个或多个表的行结合起来,基于这些表之间的共同字段(跨表查询)
SQL92:1992年的SQL语法
SQL99:1999年的SQL语法
从一张表中单独查询,称为单表查询
下图展示了 LEFT JOIN、RIGHT JOIN、INNER JOIN、OUTER JOIN 相关的 7 种用法
3、SQL JOIN 类型
(1)INNER JOIN:内连接
【1】等值连接,返回两个表中连接字段相等的行(条件是等量关系)
【2】非等值连接,条件不是一个等量关系
【3】自连接,同一张表看成多张表
注:
INNER 可以省略
两张表没有主次关系;平等
(2)OUTER JOIN :外连接
LEFT (OUTER) JOIN:左(外)连接,即使右表中没有匹配,也从左表返回所有的行(将join关键字左边的表看成主表,主要是为了将左表的数据全部查询出来,捎带着关联查询右边的表)
RIGHT (OUTER) JOIN:右(外)连接,即使左表中没有匹配,也从右表返回所有的行(将join关键字右边的表看成主表,主要是为了将右表的数据全部查询出来,捎带着关联查询左边的表)
FULL (OUTER) JOIN :全(外)连接
外连接,只要其中一个表中存在匹配,则返回;即返回两个表中的行:left join + right join
注:
OUTER 可以省略
在外连接当中,两张表连接,产生了主次关系
(3)交叉连接
CROSS JOIN: 结果是笛卡尔积,就是第一个表的行数乘以第二个表的行数
4、SQL INNER JOIN
INNER JOIN 关键字在表中存在至少一个匹配时返回行
SELECT column_name(s)
FROM table1
INNER JOIN table2
ON table1.column_name=table2.column_name;
或者
SELECT column_name(s)
FROM table1
JOIN table2
ON table1.column_name=table2.column_name;
INNER JOIN 与 JOIN 是相同的
(1)等值连接
SQL92语法:
select
e.ename,d.dname
from
emp e, dept d
where
e.deptno = d.deptno;
//sql92的缺点:结构不清晰,表的连接条件,和后期进一步筛选的条件,都放到了where后面。
SQL99语法:
select
e.ename,d.dname
from
emp e
join
dept d
on
e.deptno = d.deptno;
//inner可以省略(带着inner可读性更好!!!一眼就能看出来是内连接)
select
e.ename,d.dname
from
emp e
inner join
dept d
on
e.deptno = d.deptno; // 条件是等量关系,所以被称为等值连接。
//sql99优点:表连接的条件是独立的,连接之后,如果还需要进一步筛选,再往后继续添加where
inner可以省略,带着inner可读性更好
sql92的缺点:结构不清晰,表的连接条件,和后期进一步筛选的条件,都放到了where后面
sql99优点:表连接的条件是独立的,连接之后,如果还需要进一步筛选,再往后继续添加where
(2)非等值连接
select
e.ename, e.sal, s.grade
from
emp e
join
salgrade s
on
e.sal between s.losal and s.hisal; // 条件不是一个等量关系,称为非等值连接。
select
e.ename, e.sal, s.grade
from
emp e
inner join
salgrade s
on
e.sal between s.losal and s.hisal;
(3)自连接
一张表看成两张表
select
a.ename as '员工名', b.ename as '领导名'
from
emp a
join
emp b
on
a.mgr = b.empno; //员工的领导编号 = 领导的员工编号
INNER JOIN 与 JOIN 是相同的
5、SQL LEFT JOIN
LEFT JOIN 关键字从左表(table1)返回所有的行,即使右表(table2)中没有匹配。如果右表中没有匹配,则结果为 NULL
将join关键字左边的表看成主表,主要是为了将左表的数据全部查询出来,捎带着关联查询右边的表
SELECT column_name(s)
FROM table1
LEFT JOIN table2
ON table1.column_name=table2.column_name;
或
SELECT column_name(s)
FROM table1
LEFT OUTER JOIN table2
ON table1.column_name=table2.column_name;
在某些数据库中,LEFT JOIN 称为 LEFT OUTER JOIN
如下:
select
e.ename,d.dname
from
dept d
left (outer) join
emp e
on
e.deptno = d.deptno;
在某些数据库中,LEFT JOIN 称为 LEFT OUTER JOIN
关键字 on
数据库在通过连接两张或多张表来返回记录时,都会生成一张中间的临时表,然后再将这张临时表返回给用户
在使用 left jion 时,on 和 where 条件的区别如下:
(1) on 条件是在生成临时表时使用的条件,它不管 on 中的条件是否为真,都会返回左边表中的记录。
(2)where 条件是在临时表生成好后,再对临时表进行过滤的条件。这时已经没有 left join 的含义(必须返回左边表的记录)了,条件不为真的就全部过滤掉。
假设有两张表:
两条 SQL:
select * from tab1 left join tab2 on (tab1.size = tab2.size) where tab2.name='AAA'
select * from tab1 left join tab2 on (tab1.size = tab2.size and tab2.name='AAA')
以上结果的关键原因就是 left join、right join、full join 的特殊性,不管 on 上的条件是否为真都会返回 left 或 right 表中的记录,full 则具有 left 和 right 的特性的并集。 而 inner jion 没这个特殊性,则条件放在 on 中和 where 中,返回的结果集是相同的。
【6】SQL RIGHT JOIN
RIGHT JOIN 关键字从右表(table2)返回所有的行,即使左表(table1)中没有匹配。如果左表中没有匹配,则结果为 NULL
将join关键字右边的表看成主表,主要是为了将右表的数据全部查询出来,捎带着关联查询左边的表
SELECT column_name(s)
FROM table1
RIGHT JOIN table2
ON table1.column_name=table2.column_name;
或
SELECT column_name(s)
FROM table1
RIGHT OUTER JOIN table2
ON table1.column_name=table2.column_name;
在某些数据库中,RIGHT JOIN 称为 RIGHT OUTER JOIN
如下:
select
e.ename,d.dname
from
emp e
right (outer) join
dept d
on
e.deptno = d.deptno;
在某些数据库中,RIGHT JOIN 称为 RIGHT OUTER JOIN
【7】SQL FULL OUTER JOIN
FULL OUTER JOIN 关键字只要左表(table1)和右表(table2)其中一个表中存在匹配,则返回行
FULL OUTER JOIN 关键字结合了 LEFT JOIN 和 RIGHT JOIN 的结果(MySQL中不支持 FULL OUTER JOIN)
SELECT column_name(s)
FROM table1
FULL OUTER JOIN table2
ON table1.column_name=table2.column_name;
总结如下:
A inner join B 取交集。
A left join B 取 A 全部,B 没有对应的值为 null。
A right join B 取 B 全部 A 没有对应的值为 null。
A full outer join B 取并集,彼此没有对应的值为 null
如: "user" 表中的 "deptId" 列指向 "dept" 表中的字段 "id";上面这两个表是通过 "deptId" 列联系起来的
select u.id,d.id,d.name,d.number
from user u left join dept d
on u.deptId = d.id;
或
select u.id,u.name,d.id,d.name,d.number
from user u inner join dept d
on u.deptId = d.id;
查询结果相同
文章浏览阅读1.6k次。支持使用多块GPU进行训练import osimport torchimport torch.nn as nnfrom torch import optimfrom torch.utils.data import DataLoaderfrom torchvision import transforms, datasets, modelsfrom torchsummary import summaryclass VGGNet(nn.Module): def __init__(sel_vgg16bn_cifar10.pth
文章浏览阅读182次。一、【常规SQL语句优化】 truncate 写出存储过程动态删除表的SQL并加注释…create or replace procedure trun_table(table_deleted in varchar2) as–创建一个存储过程,传入一个表示表名称的参数,实现清空指定的表cur_name integer;–定义内部变量,存储打开的游标begincur_name := dbms..._oracle11g explain
文章浏览阅读609次。NSData: 对缓冲区的封装 缓冲区由nadata释放属性列表属性列表的写入:每个集合类中都有一个放法-writeToFile:atomically: 该方法可以将集合中的内容 写入到.plis文件中 atomically参数是决定写入新内容时 是否先将新内容保存到临时文件 等完全写入了新内容 再交换 这样可以更加安全的写入(缺点 无法返回错误信息)_oclist
文章浏览阅读8.3k次,点赞2次,收藏6次。Golang爬虫基础:通过代理IP发送请求_golang net/http req.host = 指定ip访问请求
文章浏览阅读933次。原文:https://blog.csdn.net/autom_lishun/article/details/88786566iOS APP设置启动图片LaunchImages原文:https://blog.csdn.net/st646889325/article/details/78732091关于设置launchImage:工程配置信息中设置显示launchImage:1、删除L..._ipad launchimage
文章浏览阅读1.4w次,点赞23次,收藏40次。问题出在.. 用cmd直接install tensorflow运行项目的时候出现报错 Could not load dynamic library 'cudart64_110.dll'; dlerror: cudart64_110.dll not found 解决办法 在这个网站上直接下载即可,????指路 如果报错缺的不是110,或者是101? 直接搜索就可以找到想要找的 最后一步 ..._could not load dynamic library 'cudart64_110.dll'; dlerror: cudart64_110.dll
文章浏览阅读790次。在实际的应用中,我们常常需要实现在移动app和浏览器中点击返回、后退、上一页等按钮实现自己的关闭页面、调整到指定页面或执行一些其它操作的需求,那在代码中怎样监听当点击微信、支付宝、百度糯米、百度钱包等app的返回按钮或者浏览器的上一页或后退按钮的事件呢。我相信很多朋友像我一样,在百度、搜狗里面搜索很久都没找到方法。下面就来告诉大家怎样监听的方法:首先我们要了解浏览器的history。大家知道在页面中我们可以使用javascript window history,后退到前面页面,但是由于..._"window.addeventlistener(\"popstate\", function(){ if($this.isoperateback) { th"
文章浏览阅读2.4k次。1.物理地址用于内存芯片级的单元寻址,与处理器和CPU连接的地址总线相对应。在实地址模式(因为实模式没有分段或分页机制,Cpu不进行自动地址转换)下,程序员操作的就是物理地址,所谓的物理地址就是物理内存上的32位地址,即物理地址可以直接定位到物理内存上的位置,无论任何操作,最终都必须要得到物理地址才能在物理内存上进行操作.2.虚拟地址操作系统都提供了虚拟内存(virtual mem_什么是物理地址和虚拟地址
文章浏览阅读690次。# 局端设备VS终端设备 终端设备(Terminal) 即最终到达用户端的设备,是计算机网络中处于网络最外围的设备,主要用于用户信息的输入以及处理结果的输出等。 在IBM环境中: 终端是端点用户用于和主机通信的设备。这种设备可以是监视器、键盘设备或打印设备。 它们用同轴电缆和一个群控器(cluster controller)相连,这个群控器可以直接连接到一台主机,也可以通过一个通信控制器连接到这台主机。 多达32个终端可以连接到一个单一的群控器上,具体数字要视这个群控器的型号而_什么是局端什么是终端
文章浏览阅读2.2k次。兼容 输入框直接输入和直接赋值。(双向绑定)RACSignal *phoneInputSignal= [[RACObserve(self.phoneInputView, text) merge: [self.phoneInputView rac_textSignal]] map:^id _Nullable(id _Nullable value) { return @([va..._ios rac监听uitextview改变
文章浏览阅读1.5k次。问题描述:如题目所示,他就一直卡在那里,出不来。对问题的思考:我所用的程序是我以前做的一个程序,这次又做了一套硬件,结果他卡在那里出不来,我观察了一下NRF24L01模块,发现它上面的晶振很旧。结论与解决办法:太熟悉这个行业了,一看这芯片就是翻新货,首先恭喜自己买到了翻新货,能够正常初始化,但就会遇到这种问题,这也不能怪卖家,供应商经常会在一堆好货里面混这么几块坏的,心眼太坏了。解决办法当然很简单,直接换一块好的就好了。..._卡在while(nrf24l01_irq!=0);
文章浏览阅读1.1k次,点赞2次,收藏3次。摄像头基础介绍 一、摄像头结构和工作原理. 拍摄景物通过镜头,将生成的光学图像投射到传感器上,然后光学图像被转换成电信号,电信号再经过模数转换变为数字信号,数字信号经过DSP加工处理,再被送到电脑中进行处理,最终转换成手机屏幕上能够看到的图像。数字信号处理芯片DSP(DIGITAL SIGNAL PROCESSING)功能:主要是通过一系列复杂的数学算法运算,对数..._高通aop camera