SQL语句连接查询相关知识
join可以分主次表、外联接有三种类型:完全外联,左联,右联.为便于说明,分别准备了两张表,left_table, right_table,表的定义为:
create table left_table(id integer NOT NULL, name text NOT NULL, gender character varying(10),
CONSTRAINT left_table_pkey PRIMARY KEY (id))
create table right_table(id integer, school character varying(10), age integer)
表中的数据分别为:
left_table right_table
CREATE TABLE public.left_table
(
id integer NOT NULL,
name text COLLATE pg_catalog."default" NOT NULL,
gender character varying(10) COLLATE pg_catalog."default",
CONSTRAINT left_table_pkey PRIMARY KEY (id)
)
WITH (
OIDS = FALSE
)
create table left_table(id integer NOT NULL, name text NOT NULL, gender character varying(10),
CONSTRAINT left_table_pkey PRIMARY KEY (id))
create table right_table(id integer, school character varying(10), age integer)
表中的数据分别为:
left_table right_table
CREATE TABLE public.left_table
(
id integer NOT NULL,
name text COLLATE pg_catalog."default" NOT NULL,
gender character varying(10) COLLATE pg_catalog."default",
CONSTRAINT left_table_pkey PRIMARY KEY (id)
)
WITH (
OIDS = FALSE
)
1 左连接 (left join)
可以理解为“有左显示”,比如ona.field=b.field,则显示a表中存在的全部数据及a\\b中都有的数据。对于A中有、B没有的数据以null显示只要左边表中有记录,数据就能检索出来,而右边有的记录必要在左边表中有的记录才能被检索出来,影响到的是右边的表。
使用方法:select * from left_table Left Join right_table on left_table.id = right_table.ID
结果集:包含左表中所有的记录甚至是右边表中没有和它匹配的记录,右表中满足where 条件的数据。where只影响右表,显示左表的所有数据。
2右连接(right join)
右连接是只要右边表中有记录,数据就能检索出来
可以理解为“有右显示”,比如ona.field=b.field,则显示B表中存在的全部数据及a\\b中都有的数据,B中有、A没有的数据以null显示。
使用方法: select * from left_table Right Join right_table on left_table.ID = right_table.ID
检索结果:包含右边表中所有的记录,甚至是左边表中没有和它匹配的记录。where影响到的是左边的表,是tbl2的所有数据和tbl1中满足where 条件的数据。
3内连接(inner join)
使用方法:select * FROM left_table INNER JOIN right_table ON left_table.ID = right_table.ID
可理解为“有效连接”,只显示同时存在于两个表中的数据。需要注意的是,当连接同一个表的时候,注意要定义别名,否则产生错误!比如:
select a.* from left_table a inner join on left_table b on a.id = b.id。
此时如果不加别名,就没有办法做区分。
4全连接 (full join)
左右表中所有记录都会选出来。
理解为“全连接”,两张表中所有数据都显示,实际就是inner join +(left-inner)+(right-inner)
连接查询使用原则:
1) 大表在前,小表在后
2) 不使用表别名,通过字段前缀区分不同表中的字段
3) 查询条件中的限制条件要写在表连接条件前
4) 查询条件字段应尽量建索引
显性连接: INNER JOIN……ON、LEFT JOIN… ON、RIGHT JOIN… ON等子句产生的连接称为显性连接。
隐性连接:WHERE子句中使用的连接语句,在数据库语言中,被称为隐性连接。
隐性连接与显性连接的区别:没有本质区别,结果也一样,但是隐性连接随着数据库语言的规范和发展,已经逐渐被淘汰,比较新的数据库语言基本上已经抛弃了隐性连接,全部采用显性连接了。