SQL语句实现数据库表联查 (数据库两个表联查)

在进行数据库的数据查询时,往往会遇到需要查询多张表的情况。这时候,需要用到。数据库表联查是指在一个SELECT语句中同时查询多张表的数据,并将它们合并成一个结果集。

的基本语法如下:

“`

SELECT 表1.字段1,表2.字段2 FROM 表1 INNER JOIN 表2 ON 表1.关联字段=表2.关联字段

“`

其中,表1和表2表示需要进行联查的两个表,字段1和字段2表示需要查询的字段,可以是表中的字段或表达式,关联字段表示两个表的关联字段,Inner join表示使用内连接方式进行联接。

下面我们来举一个简单的例子。假设有两张表:学生表和成绩表,分别包含学生的基本信息和成绩信息。现在需要查询学生的姓名和成绩,可以使用以下SQL语句进行联查:

“`

SELECT 学生表.姓名,成绩表.成绩 FROM 学生表 INNER JOIN 成绩表 ON 学生表.学号 = 成绩表.学号

“`

在这个例子中,我们使用了学号作为学生表和成绩表的关联字段。联查的结果将会是学生的姓名和成绩,按照学号进行匹配并返回。

除了Inner join之外,SQL语言还提供了其他的联接方式,包括Left join、Right join和Full join。不同的联接方式可以用于不同的查询需求,下面我们来逐一进行介绍。

1. Inner join

Inner join是最常见的联接方式,它只返回两个表中关联字段相同的记录。在使用Inner join联接时,如果一个表中的记录没有匹配到另一个表中的记录,那么这条记录将不会被返回。

例如,在学生表和成绩表进行Inner join联接时,如果有一名学生没有成绩记录,那么他的姓名将不会被返回。

2. Left join

Left join是指左连接,它返回左表的所有记录和右表中关联字段相等的记录。如果右表中的记录没有匹配到左表中的记录,则会返回NULL值。

例如,在学生表和成绩表进行Left join联接时,如果有一名学生没有成绩记录,那么他的姓名将会被返回,并将成绩设为NULL值。

3. Right join

Right join是指右连接,它返回右表的所有记录和左表中关联字段相等的记录。如果左表中的记录没有匹配到右表中的记录,则会返回NULL值。

例如,在学生表和成绩表进行Right join联接时,如果有一名学生没有学生记录,那么他的成绩将会被返回,并将姓名设为NULL值。

4. Full join

Full join是指全连接,它返回左表和右表的所有记录。如果存在一个表中的记录没有匹配到另一个表中的记录,那么对应的字段将会填充NULL值。

例如,在学生表和成绩表进行Full join联接时,将会返回所有学生和成绩的记录,如果存在一名学生没有成绩记录,则会返回NULL值。

SQL语言的联接功能是数据库查询中非常重要的一部分,通过联接不同的表可以实现更加复杂的数据查询功能。掌握的基本语法和不同联接方式的用法,可以为我们进行高效的数据查询提供更大的帮助。

相关问题拓展阅读:

sql联合查询语句(两张表)

sql联合查询语句(两张表)是:

select A.ID,A.VALUE,A.TYPE,A.NAME,B.KEY,B.ID,B.VALUE,B.NAME 

min(VALUE),max(VALUE) from A left join B on A.ID = B.ID

where B.NAME=”你输入的名字” 

and B.VALUE > (select min(VALUE) from B where NAME=”你输入的名字”)) 

and B.VALUE ‘MIKE_ORDER001’;

语句8:将语句7中的WHERE条件放到ON后面。

SELECT O.ID,O.ORDER_NUMBER,O.CUSTOMER_ID,C.ID,C.NAME

FROM ORDERS O LEFT OUTER JOIN CUSTOMERS C ON C.ID=O.CUSTOMER_ID AND O.ORDER_NUMBER’MIKE_ORDER001′;

从语句7和语句8查询的结果来看,显然是不相同的,语句8显示的结果是难以理解的。因此,推荐在写连接查询的时候,ON后面只跟连接条件,而对中间表限制的条件都写到WHERE子句中。

语句9:全外连接(FULL OUTER JOIN)。

SELECT O.ID,O.ORDER_NUMBER,O.CUSTOMER_ID,C.ID,C.NAME

FROM ORDERS O FULL OUTER JOIN CUSTOMERS C ON C.ID=O.CUSTOMER_ID;

注意:MySQL是不支持全外的连接的,这里给出的写法适合Oracle和DB2。但是可以通过左外和右外求合集来获取全外连接的查询结果。下图是上面SQL在Oracle下执行的结果:

语句10:左外和右外的合集,实际上查询结果和语句9是相同的。

SELECT O.ID,O.ORDER_NUMBER,O.CUSTOMER_ID,C.ID,C.NAME

FROM ORDERS O LEFT OUTER JOIN CUSTOMERS C ON C.ID=O.CUSTOMER_ID

UNION

SELECT O.ID,O.ORDER_NUMBER,O.CUSTOMER_ID,C.ID,C.NAME

FROM ORDERS O RIGHT OUTER JOIN CUSTOMERS C ON C.ID=O.CUSTOMER_ID;

语句9和语句10的查询结果是相同的,如下:

四、联合连接(UNION JOIN):这是一种很少见的连接方式。Oracle、MySQL均不支持,其作用是:找出全外连接和内连接之间差异的所有行。这在数据分析中排错中比较常用。也可以利用数据库的操作来实现此功能。

语句11:联合查询(UNION JOIN)例句,还没有找到能执行的SQL环境。

SELECT O.ID,O.ORDER_NUMBER,O.CUSTOMER_ID,C.ID,C.NAME

FROM ORDERS O UNION JOIN CUSTOMERS C ON C.ID=O.CUSTOMER_ID

语句12:语句11在DB2下的等价实现。还不知道DB2是否支持语句11呢!

SELECT O.ID,O.ORDER_NUMBER,O.CUSTOMER_ID,C.ID,C.NAME

FROM ORDERS O FULL OUTER JOIN CUSTOMERS C ON C.ID=O.CUSTOMER_ID

EXCEPT

SELECT O.ID,O.ORDER_NUMBER,O.CUSTOMER_ID,C.ID,C.NAME

FROM ORDERS O INNER JOIN CUSTOMERS C ON C.ID=O.CUSTOMER_ID;

语句13:语句11在Oracle下的等价实现。

SELECT O.ID,O.ORDER_NUMBER,O.CUSTOMER_ID,C.ID,C.NAME

FROM ORDERS O FULL OUTER JOIN CUSTOMERS C ON C.ID=O.CUSTOMER_ID

MINUS

SELECT O.ID,O.ORDER_NUMBER,O.CUSTOMER_ID,C.ID,C.NAME

FROM ORDERS O INNER JOIN CUSTOMERS C ON C.ID=O.CUSTOMER_ID;

查询结果如下:

五、自然连接(NATURAL INNER JOIN):说真的,这种连接查询没有存在的价值,既然是SQL2标准中定义的,就给出个例子看看吧。自然连接无需指定连接列,SQL会检查两个表中是否相同名称的列,且假设他们在连接条件中使用,并且在连接条件中仅包含一个连接列。不允许使用ON语句,不允许指定显示列,显示列只能用*表示(ORACLE环境下测试的)。对于每种连接类型(除了交叉连接外),均可指定NATURAL。下面给出几个例子。

语句14:

SELECT *

FROM ORDERS O NATURAL INNER JOIN CUSTOMERS C;

语句15:

SELECT *

FROM ORDERS O NATURAL LEFT OUTER JOIN CUSTOMERS C;

语句16:

SELECT *

FROM ORDERS O NATURAL RIGHT OUTER JOIN CUSTOMERS C;

语句17:

SELECT *

FROM ORDERS O NATURAL FULL OUTER JOIN CUSTOMERS C;

六、SQL查询的基本原理:两种情况介绍。

之一、 单表查询:根据WHERE条件过滤表中的记录,形成中间表(这个中间表对用户是不可见的);然后根据SELECT的选择列选择相应的列进行返回最终结果。

第二、 两表连接查询:对两表求积(笛卡尔积)并用ON条件和连接连接类型进行过滤形成中间表;然后根据WHERE条件过滤中间表的记录,并根据SELECT指定的列返回查询结果。

第三、 多表连接查询:先对之一个和第二个表按照两表连接做查询,然后用查询结果和第三个表做连接查询,以此类推,直到所有的表都连接上为止,最终形成一个中间的结果表,然后根据WHERE条件过滤中间表的记录,并根据SELECT指定的列返回查询结果。

理解SQL查询的过程是进行SQL优化的理论依据。

七、ON后面的条件(ON条件)和WHERE条件的区别:

ON条件:是过滤两个链接表笛卡尔积形成中间表的约束条件。

WHERE条件:在有ON条件的SELECT语句中是过滤中间表的约束条件。在没有ON的单表查询中,是限制物理表或者中间查询结果返回记录的约束。在两表或多表连接中是限制连接形成最终中间表的返回结果的约束。

从这里可以看出,将WHERE条件移入ON后面是不恰当的。推荐的做法是:

ON只进行连接操作,WHERE只过滤中间表的记录。

八、总结

连接查询是SQL查询的核心,连接查询的连接类型选择依据实际需求。如果选择不当,非但不能提高查询效率,反而会带来一些逻辑错误或者性能低下。下面总结一下两表连接查询选择方式的依据:

1、 查两表关联列相等的数据用内连接。

2、 Col_L是Col_R的子集时用右外连接。

3、 Col_R是Col_L的子集时用左外连接。

4、 Col_R和Col_L彼此有交集但彼此互不为子集时候用全外。

5、 求差操作的时候用联合查询。

多个表查询的时候,这些不同的连接类型可以写到一块。例如:

SELECT T1.C1,T2.CX,T3.CY

FROM TAB1 T1

INNER JOIN TAB2 T2 ON (T1.C1=T2.C2)

INNER JOIN TAB3 T3 ON (T1.C1=T2.C3)

LEFT OUTER JOIN TAB4 ON(T2.C2=T3.C3);

WHERE T1.X >T3.Y;

select a.idd,a.name2,b.image2,a.name,a.image

from a表 inner join b表

on a.tag2 = b.tag

交叉就可以了。

SELECT * FROM A,B

SQL怎么连接查询2个表?

使用where语句进行查询,如:

select Emp.E_Id,Company.C_OraName from Emp,Company where Companey.C_Id=Emp.C_Id

但是往往会碰到比较复杂的语句,这时候使用where就不太合适了,其实SQL可以用较为直接的形式进行连接操作,可以凳滚在From子句中以直接的形式指出:

select top 10 E_Id,E_Name,C_Name 

from 

Emp join Companey on Companey.C_Id=Emp.C_Id 

where 

E_Id not in (select top 20 E_Id from Emp order by  E_Id  asc) 

order by E_Id asc

//查询表Emp中第21到第30条数据以升序排列,其中C_Name来自于另一个表

扩展资料:

SQL查询语句

1、获取当前数据库中的所有用户表select Name from sysobjects where xtype=’u’ and status>=0

2、获取某一个表的所宴粗裤有字段select name from syscolumns where id=object_id(‘表名’)select name from syscolumns where id in (select id from sysobjects where type = ‘u’ and name = ‘表名’)

3、查看与某一个表相关的视图、存晌简储过程、函数select a.* from sysobjects a, syscomments b where a.id = b.id and b.text like ‘%表名%’

4、查看当前数据库中所有存储过程select name as 存储过程名称 from sysobjects where xtype=’P’

5、查询用户创建的所有数据库select * from master..sysdatabases D where sid not in(select sid from master..syslogins where name=’sa’)

或者select dbid, name AS DB_NAME from master..sysdatabases where sid 0x01

6、查询某一个表的字段和数据类型select column_name,data_type from information_schema.columnswhere table_name = ‘表名’

数据库两个表联查的介绍就聊到这里吧,感谢你花时间阅读本站内容,更多关于数据库两个表联查,SQL语句实现数据库表联查,sql联合查询语句(两张表),SQL怎么连接查询2个表?的信息别忘了在本站进行查找喔。


数据运维技术 » SQL语句实现数据库表联查 (数据库两个表联查)