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

SQL语句连接查询相关知识   SQL语句连接查询相关知识


 


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

SQL语句连接查询相关知识   SQL语句连接查询相关知识


 


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只影响右表,显示左表的所有数据。

SQL语句连接查询相关知识

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 条件的数据。

SQL语句连接查询相关知识

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)

 SQL语句连接查询相关知识

连接查询使用原则:

1) 大表在前,小表在

2) 不使用表别名,通过字段前缀区分不同表中的字段

3) 查询条件中的限制条件要写在表连接条件前

4) 查询条件字段应尽量建索引

 

显性连接: INNER JOIN……ON、LEFT JOIN… ON、RIGHT JOIN… ON等子句产生的连接称为显性连接。

隐性连接:WHERE子句中使用的连接语句,在数据库语言中,被称为隐性连接。

隐性连接与显性连接的区别:没有本质区别,结果也一样,但是隐性连接随着数据库语言的规范和发展,已经逐渐被淘汰,比较新的数据库语言基本上已经抛弃了隐性连接,全部采用显性连接了。