array(2) { ["docs"]=> array(10) { [0]=> array(10) { ["id"]=> string(3) "428" ["text"]=> string(77) "Visual Studio 2017 单独启动MSDN帮助(Microsoft Help Viewer)的方法" ["intro"]=> string(288) "目录 ECharts 异步加载 ECharts 数据可视化在过去几年中取得了巨大进展。开发人员对可视化产品的期望不再是简单的图表创建工具,而是在交互、性能、数据处理等方面有更高的要求。 chart.setOption({ color: [ " ["username"]=> string(8) "DonetRen" ["tagsname"]=> string(55) "Visual Studio 2017|MSDN帮助|C#程序|.NET|Help Viewer" ["tagsid"]=> string(23) "[401,402,403,"300",404]" ["catesname"]=> string(0) "" ["catesid"]=> string(2) "[]" ["createtime"]=> string(10) "1511400964" ["_id"]=> string(3) "428" } [1]=> array(10) { ["id"]=> string(3) "427" ["text"]=> string(42) "npm -v;报错 cannot find module "wrapp"" ["intro"]=> string(288) "目录 ECharts 异步加载 ECharts 数据可视化在过去几年中取得了巨大进展。开发人员对可视化产品的期望不再是简单的图表创建工具,而是在交互、性能、数据处理等方面有更高的要求。 chart.setOption({ color: [ " ["username"]=> string(4) "zzty" ["tagsname"]=> string(50) "node.js|npm|cannot find module "wrapp“|node" ["tagsid"]=> string(19) "[398,"239",399,400]" ["catesname"]=> string(0) "" ["catesid"]=> string(2) "[]" ["createtime"]=> string(10) "1511400760" ["_id"]=> string(3) "427" } [2]=> array(10) { ["id"]=> string(3) "426" ["text"]=> string(54) "说说css中pt、px、em、rem都扮演了什么角色" ["intro"]=> string(288) "目录 ECharts 异步加载 ECharts 数据可视化在过去几年中取得了巨大进展。开发人员对可视化产品的期望不再是简单的图表创建工具,而是在交互、性能、数据处理等方面有更高的要求。 chart.setOption({ color: [ " ["username"]=> string(12) "zhengqiaoyin" ["tagsname"]=> string(0) "" ["tagsid"]=> string(2) "[]" ["catesname"]=> string(0) "" ["catesid"]=> string(2) "[]" ["createtime"]=> string(10) "1511400640" ["_id"]=> string(3) "426" } [3]=> array(10) { ["id"]=> string(3) "425" ["text"]=> string(83) "深入学习JS执行--创建执行上下文(变量对象,作用域链,this)" ["intro"]=> string(288) "目录 ECharts 异步加载 ECharts 数据可视化在过去几年中取得了巨大进展。开发人员对可视化产品的期望不再是简单的图表创建工具,而是在交互、性能、数据处理等方面有更高的要求。 chart.setOption({ color: [ " ["username"]=> string(7) "Ry-yuan" ["tagsname"]=> string(33) "Javascript|Javascript执行过程" ["tagsid"]=> string(13) "["169","191"]" ["catesname"]=> string(0) "" ["catesid"]=> string(2) "[]" ["createtime"]=> string(10) "1511399901" ["_id"]=> string(3) "425" } [4]=> array(10) { ["id"]=> string(3) "424" ["text"]=> string(30) "C# 排序技术研究与对比" ["intro"]=> string(288) "目录 ECharts 异步加载 ECharts 数据可视化在过去几年中取得了巨大进展。开发人员对可视化产品的期望不再是简单的图表创建工具,而是在交互、性能、数据处理等方面有更高的要求。 chart.setOption({ color: [ " ["username"]=> string(9) "vveiliang" ["tagsname"]=> string(0) "" ["tagsid"]=> string(2) "[]" ["catesname"]=> string(8) ".Net Dev" ["catesid"]=> string(5) "[199]" ["createtime"]=> string(10) "1511399150" ["_id"]=> string(3) "424" } [5]=> array(10) { ["id"]=> string(3) "423" ["text"]=> string(72) "【算法】小白的算法笔记:快速排序算法的编码和优化" ["intro"]=> string(288) "目录 ECharts 异步加载 ECharts 数据可视化在过去几年中取得了巨大进展。开发人员对可视化产品的期望不再是简单的图表创建工具,而是在交互、性能、数据处理等方面有更高的要求。 chart.setOption({ color: [ " ["username"]=> string(9) "penghuwan" ["tagsname"]=> string(6) "算法" ["tagsid"]=> string(7) "["344"]" ["catesname"]=> string(0) "" ["catesid"]=> string(2) "[]" ["createtime"]=> string(10) "1511398109" ["_id"]=> string(3) "423" } [6]=> array(10) { ["id"]=> string(3) "422" ["text"]=> string(64) "JavaScript数据可视化编程学习(二)Flotr2,雷达图" ["intro"]=> string(288) "目录 ECharts 异步加载 ECharts 数据可视化在过去几年中取得了巨大进展。开发人员对可视化产品的期望不再是简单的图表创建工具,而是在交互、性能、数据处理等方面有更高的要求。 chart.setOption({ color: [ " ["username"]=> string(7) "chengxs" ["tagsname"]=> string(28) "数据可视化|前端学习" ["tagsid"]=> string(9) "[396,397]" ["catesname"]=> string(18) "前端基本知识" ["catesid"]=> string(5) "[198]" ["createtime"]=> string(10) "1511397800" ["_id"]=> string(3) "422" } [7]=> array(10) { ["id"]=> string(3) "421" ["text"]=> string(36) "C#表达式目录树(Expression)" ["intro"]=> string(288) "目录 ECharts 异步加载 ECharts 数据可视化在过去几年中取得了巨大进展。开发人员对可视化产品的期望不再是简单的图表创建工具,而是在交互、性能、数据处理等方面有更高的要求。 chart.setOption({ color: [ " ["username"]=> string(4) "wwym" ["tagsname"]=> string(0) "" ["tagsid"]=> string(2) "[]" ["catesname"]=> string(4) ".NET" ["catesid"]=> string(7) "["119"]" ["createtime"]=> string(10) "1511397474" ["_id"]=> string(3) "421" } [8]=> array(10) { ["id"]=> string(3) "420" ["text"]=> string(47) "数据结构 队列_队列实例:事件处理" ["intro"]=> string(288) "目录 ECharts 异步加载 ECharts 数据可视化在过去几年中取得了巨大进展。开发人员对可视化产品的期望不再是简单的图表创建工具,而是在交互、性能、数据处理等方面有更高的要求。 chart.setOption({ color: [ " ["username"]=> string(7) "idreamo" ["tagsname"]=> string(40) "C语言|数据结构|队列|事件处理" ["tagsid"]=> string(23) "["246","247","248",395]" ["catesname"]=> string(12) "数据结构" ["catesid"]=> string(7) "["133"]" ["createtime"]=> string(10) "1511397279" ["_id"]=> string(3) "420" } [9]=> array(10) { ["id"]=> string(3) "419" ["text"]=> string(47) "久等了,博客园官方Android客户端发布" ["intro"]=> string(288) "目录 ECharts 异步加载 ECharts 数据可视化在过去几年中取得了巨大进展。开发人员对可视化产品的期望不再是简单的图表创建工具,而是在交互、性能、数据处理等方面有更高的要求。 chart.setOption({ color: [ " ["username"]=> string(3) "cmt" ["tagsname"]=> string(0) "" ["tagsid"]=> string(2) "[]" ["catesname"]=> string(0) "" ["catesid"]=> string(2) "[]" ["createtime"]=> string(10) "1511396549" ["_id"]=> string(3) "419" } } ["count"]=> int(200) } 222 PostgreSQL-join多表连接查询和子查询 - 爱码网
right-dress

一、多表连接查询

1、连接方式概览
[inner] join
内连接:表A和表B以元组为单位做一个笛卡尔积,记为表C,然后在C中挑选出满足符合on 语句后边的限制条件的内容。
left [outer] join
左外连接:在内连接的基础上,将A中有但C中没有的元组也加上。由于C的列数比A的行数多,所以这新增的元组左边照搬A,右边为null。
right [outer] join
右外连接:在内连接的基础上,将B中有但C中没有的元组也加上。由于C的列数比B的行数多,所以这新增的元组右边照搬B,左边为null。
full [outer] join
全外连接:相当于在内连接的基础上同时做左连接和右连接,表A和表B中的都要,两边不满足条件的都为null。
 
cross join
与上述内外连接可接连接条件不同,这一个本质是 select * from tableName1, tableName2 这种无条件交叉连接的简写,如
select * from tableName1 cross join tableName2
仅是做笛卡尔积,表A的每一行都和表B的每一行相连接,没有条件,不可后接on,结果是两表行的乘积和列的和。
 
2、条件语法概览
table1 { [inner] | { left| right| full} [outer] } join table2 on boolean_expression
用 ON 关键词后接连接条件,结果中会包含两表中条件引用到的列(条件列无论是否同名皆可)
注:select * from table1,table2 where table1.column1=table2.column1 这是一种可替代select *from table1 [inner] join table2 on boolean_expression 的快捷语法
单纯使用内连接的话可以像前者这样写,简便直白
table1 { [inner] | { left| right| full} [outer] } join table2 using ( join column list )
用 USING 关键词后接一个用逗号分隔的字段名列表,这些字段必须是连接表共有的并且其值必须相同,连接结果去重。(条件列同名,手动指定,去重)
因此,USING (a, b, c) 等效于 ON (table1.a = table2.a AND table1.b = table2.b AND table1.c = table2.c) ,结果中abc字段各仅一个。
table1 natural { [inner] | { left| right| full} [outer] } join table2
NATURAL 是 USING 的缩写形式:它自动形成一个由两个表中同名的字段组成的 USING 列表。
USING 和 NATURAL 的原理是一样的,靠两表中同名的字段连接值相同的部分,不够灵活。(条件列同名,自动寻列,去重)
 
3、简单的栗子
有两表A和B
A B
 
无条件连接
select * from A cross join B
 
有条件连接
select * from A full join B on A.name = B.name
[指定条件,全外连接]
select * from A full join B using(name)
[指定条件,全外连接,去重]
select * from A natural join B
[自动寻找同名字段为条件,内连接,去重]
select * from A natural full join B
[自动寻找同名字段为条件,全外连接,去重]
 
4、更多表连接
连接ABCDE多个表可以这样: 也可以这样:
select * from (((
A inner join B on A.a = B.b)
inner join C on C.c = A.a)
inner join D on D.d = C.c)
inner join E on E.e = D.d
select * from
A inner join B on A.a = B.b
inner join C on C.c = A.a
inner join D on D.d = C.c
inner join E on E.e = D.d
 
大多数数据库系统会分析整个from子句,然后尝试确定组合连接表的最有效方式,也就是说数据库不不一定会从最里边的括号开始执行查询。这很可能打乱你的逻辑设计,得到意外的结果。一些数据库系统中的优化器对于join定义的顺序很敏感。如果你发现使用很多join的查询在一个较大的数据库上执行花很长时间,通过改变join顺序很可能能够使它运行的更快。
 

二、子查询(subquery)

在子查询中用到一些关键字,分别是“ANY、EXISTS、IN、SOME”,在这些关键字之前还可以添加“NOT”。
通常的用法如:
EXISTS (subquery)
expression [NOT] IN (subquery)
row_constructor [NOT] IN (subquery)
expression operator ANY (subquery)
expression operator SOME (subquery)
row_constructor operator ANY (subquery)
row_constructor operator SOME (subquery)
 
半连接:对于“subquery”,使用IN、EXISTS等谓词表示存在即可,称之为半连接。
SELECT * FROM D
WHERE EXISTS
( SELECT * FROM E WHERE D.id= E.id
AND E.s > 2500)
ORDER BY x
 
反半连接:对于“subquery”,使用NOT IN谓词表示不存在即可,称之为反半连接。
SELECT * FROM E
WHERE id NOT IN
(SELECT id FROM D WHERE lid=1700)
ORDER BY id
 
 
 

整理自:
——
[原创]多表连接(join)小结 - ybwang1989 - 博客园
——
数据库查询中的表连接(一) - 那海蓝蓝的日志 - 网易博客
数据库查询中的表连接(二) - 那海蓝蓝的日志 - 网易博客
——
JOIN操作PostgreSql » InBi\'s Blog

分类:

技术点:

相关文章: