SQL连表查询问题
发布网友
发布时间:2022-11-10 06:05
我来回答
共5个回答
热心网友
时间:2023-11-24 01:39
连表查询有许多种,INNER JOIN ,OUTER JOIN , LEFT JOIN ,RIGHT JOIN,CROSS JOIN,FULL OUTER JOIN等等。
INNER JOIN也就是内连接,是默认连接,默认写法就是JOIN
而其余的外连接
LEFT JOIN,
tbA left join tbB on 条件
如果B中没有相应的行,则返回A的所有行。如果有,则返回该行。
RIGHT JOIN和LEFT JOIN类似,换下位置你就理解了的
而FULL OUTER JOIN 则是完整的返回表A和表B的所有行。
CROSS JOIN交叉连接,则是 返回2个表的笛卡儿集
不知道对你有帮助没有
这是几钟JOIN的例子,我才帮别人写的。
declare @employees table(Employee_ID int , Name nvarchar(20))
insert into @employees select 01, 'Hansen Ola' union all
select 02, 'Svendson Tove' union all
select 03, 'Svendson Stephen' union all
select 04, 'Pettersen Kari'
declare @Orders table(Prod_ID int, Proct nvarchar(10),Employee_ID int)
insert into @Orders select 234,'Printer',01 union all
select 657,'Table',03 union all
select 865,'Chair',03
select count(distinct a.Employee_ID)+count(distinct b.Employee_ID) from @employees as a,@Orders as b
--full outer join
select a.Employee_ID,Name,Proct from @Employees as a full outer join @Orders as b on a.Employee_ID=b.Employee_ID
/*结果
Employee_ID Name Proct
----------- -------------------- ----------
1 Hansen Ola Printer
2 Svendson Tove NULL
3 Svendson Stephen Table
3 Svendson Stephen Chair
4 Pettersen Kari NULL
*/
--inner join
select a.Employee_ID,Name,Proct from @Employees as a inner join @Orders as b on a.Employee_ID=b.Employee_ID
/*结果
Employee_ID Name Proct
----------- -------------------- ----------
1 Hansen Ola Printer
3 Svendson Stephen Table
3 Svendson Stephen Chair
*/
--left join
select a.Employee_ID,Name,Proct from @Employees as a left join @Orders as b on a.Employee_ID=b.Employee_ID
/*
Employee_ID Name Proct
----------- -------------------- ----------
1 Hansen Ola Printer
2 Svendson Tove NULL
3 Svendson Stephen Table
3 Svendson Stephen Chair
4 Pettersen Kari NULL
*/
--right join
select a.Employee_ID,Name,Proct from @Employees as a right join @Orders as b on a.Employee_ID=b.Employee_ID
/*
Employee_ID Name Proct
----------- -------------------- ----------
1 Hansen Ola Printer
3 Svendson Stephen Table
3 Svendson Stephen Chair
*/
热心网友
时间:2023-11-24 01:39
这是内连接
select 表名(A).列名 from 表名(A) inner join 表名(B) on
表名(A).列名=表名(B).列名 where 条件
左和右外连接就是原句加上 left和right,去掉inner
热心网友
时间:2023-11-24 01:40
就是查找两个表的内容.
热心网友
时间:2023-11-24 01:40
http://hi.baidu.com/songyl525/blog/item/28c0e0f086cc33aba50f52c2.html
热心网友
时间:2023-11-24 01:41
一)内连接
内连接查询操作列出与连接条件匹配的数据行,它使用较运算符比较被连接列的列值。内连接分三种:
1、等值连接:在连接条件中使用等于号(=)运算符比较被连接列的列值,其查询结果中列出被连接表中的所有列,包括其中的重复列。
2、不等连接: 在连接条件使用除等于运算符以外的其它比较运算符比较被连接的列的列值。这些运算符包括>、>=、<=、<、!>、!<和<>。
3、自然连接:在连接条件中使用等于(=)运算符比较被连接列的列值,但它使用选择列表指出查询结果集合中所包括的列,并删除连接表中的重复列。
例,下面使用等值连接列出authors和publishers表中位于同一城市的作者和出版社:
SELECT *
FROM authors AS a INNER JOIN publishers AS p
ON a.city=p.city
又如使用自然连接,在选择列表中删除authors 和publishers 表中重复列(city和state):
SELECT a.*,p.pub_id,p.pub_name,p.country
FROM authors AS a INNER JOIN publishers AS p
ON a.city=p.city
(二)外连接
内连接时,返回查询结果集合中的仅是符合查询条件( WHERE 搜索条件或 HAVING 条件)和连接条件的行。而采用外连接时,它返回到查询结果集合中的不仅包含符合连接条件的行,而且还包括左表(左外连接时)、右表(右外连接时)或两个边接表(全外连接)中的所有数据行。
如下面使用左外连接将论坛内容和作者信息连接起来:
SELECT a.*,b.* FROM luntan LEFT JOIN usertable as b
ON a.username=b.username
下面使用全外连接将city表中的所有作者以及user表中的所有作者,以及他们所在的城市:
sELECT a.*,b.*
FROM city as a FULL OUTER JOIN user as b
ON a.username=b.username
(三)交叉连接
交叉连接不带WHERE 子句,它返回被连接的两个表所有数据行的笛卡尔积,返回到结果集合中的数据行数等于第一个表中符合查询条件的数据行数乘以第二个表中符合查询条件的数据行数。
例,titles表中有6类图书,而publishers表中有8家出版社,则下列交叉连接检索到的记录数将等
于6*8=48行。
SELECT type,pub_name
FROM titles CROSS JOIN publishers
热心网友
时间:2023-11-24 01:39
连表查询有许多种,INNER JOIN ,OUTER JOIN , LEFT JOIN ,RIGHT JOIN,CROSS JOIN,FULL OUTER JOIN等等。
INNER JOIN也就是内连接,是默认连接,默认写法就是JOIN
而其余的外连接
LEFT JOIN,
tbA left join tbB on 条件
如果B中没有相应的行,则返回A的所有行。如果有,则返回该行。
RIGHT JOIN和LEFT JOIN类似,换下位置你就理解了的
而FULL OUTER JOIN 则是完整的返回表A和表B的所有行。
CROSS JOIN交叉连接,则是 返回2个表的笛卡儿集
不知道对你有帮助没有
这是几钟JOIN的例子,我才帮别人写的。
declare @employees table(Employee_ID int , Name nvarchar(20))
insert into @employees select 01, 'Hansen Ola' union all
select 02, 'Svendson Tove' union all
select 03, 'Svendson Stephen' union all
select 04, 'Pettersen Kari'
declare @Orders table(Prod_ID int, Proct nvarchar(10),Employee_ID int)
insert into @Orders select 234,'Printer',01 union all
select 657,'Table',03 union all
select 865,'Chair',03
select count(distinct a.Employee_ID)+count(distinct b.Employee_ID) from @employees as a,@Orders as b
--full outer join
select a.Employee_ID,Name,Proct from @Employees as a full outer join @Orders as b on a.Employee_ID=b.Employee_ID
/*结果
Employee_ID Name Proct
----------- -------------------- ----------
1 Hansen Ola Printer
2 Svendson Tove NULL
3 Svendson Stephen Table
3 Svendson Stephen Chair
4 Pettersen Kari NULL
*/
--inner join
select a.Employee_ID,Name,Proct from @Employees as a inner join @Orders as b on a.Employee_ID=b.Employee_ID
/*结果
Employee_ID Name Proct
----------- -------------------- ----------
1 Hansen Ola Printer
3 Svendson Stephen Table
3 Svendson Stephen Chair
*/
--left join
select a.Employee_ID,Name,Proct from @Employees as a left join @Orders as b on a.Employee_ID=b.Employee_ID
/*
Employee_ID Name Proct
----------- -------------------- ----------
1 Hansen Ola Printer
2 Svendson Tove NULL
3 Svendson Stephen Table
3 Svendson Stephen Chair
4 Pettersen Kari NULL
*/
--right join
select a.Employee_ID,Name,Proct from @Employees as a right join @Orders as b on a.Employee_ID=b.Employee_ID
/*
Employee_ID Name Proct
----------- -------------------- ----------
1 Hansen Ola Printer
3 Svendson Stephen Table
3 Svendson Stephen Chair
*/
热心网友
时间:2023-11-24 01:39
这是内连接
select 表名(A).列名 from 表名(A) inner join 表名(B) on
表名(A).列名=表名(B).列名 where 条件
左和右外连接就是原句加上 left和right,去掉inner
热心网友
时间:2023-11-24 01:40
就是查找两个表的内容.
热心网友
时间:2023-11-24 01:40
http://hi.baidu.com/songyl525/blog/item/28c0e0f086cc33aba50f52c2.html
热心网友
时间:2023-11-24 01:41
一)内连接
内连接查询操作列出与连接条件匹配的数据行,它使用较运算符比较被连接列的列值。内连接分三种:
1、等值连接:在连接条件中使用等于号(=)运算符比较被连接列的列值,其查询结果中列出被连接表中的所有列,包括其中的重复列。
2、不等连接: 在连接条件使用除等于运算符以外的其它比较运算符比较被连接的列的列值。这些运算符包括>、>=、<=、<、!>、!<和<>。
3、自然连接:在连接条件中使用等于(=)运算符比较被连接列的列值,但它使用选择列表指出查询结果集合中所包括的列,并删除连接表中的重复列。
例,下面使用等值连接列出authors和publishers表中位于同一城市的作者和出版社:
SELECT *
FROM authors AS a INNER JOIN publishers AS p
ON a.city=p.city
又如使用自然连接,在选择列表中删除authors 和publishers 表中重复列(city和state):
SELECT a.*,p.pub_id,p.pub_name,p.country
FROM authors AS a INNER JOIN publishers AS p
ON a.city=p.city
(二)外连接
内连接时,返回查询结果集合中的仅是符合查询条件( WHERE 搜索条件或 HAVING 条件)和连接条件的行。而采用外连接时,它返回到查询结果集合中的不仅包含符合连接条件的行,而且还包括左表(左外连接时)、右表(右外连接时)或两个边接表(全外连接)中的所有数据行。
如下面使用左外连接将论坛内容和作者信息连接起来:
SELECT a.*,b.* FROM luntan LEFT JOIN usertable as b
ON a.username=b.username
下面使用全外连接将city表中的所有作者以及user表中的所有作者,以及他们所在的城市:
sELECT a.*,b.*
FROM city as a FULL OUTER JOIN user as b
ON a.username=b.username
(三)交叉连接
交叉连接不带WHERE 子句,它返回被连接的两个表所有数据行的笛卡尔积,返回到结果集合中的数据行数等于第一个表中符合查询条件的数据行数乘以第二个表中符合查询条件的数据行数。
例,titles表中有6类图书,而publishers表中有8家出版社,则下列交叉连接检索到的记录数将等
于6*8=48行。
SELECT type,pub_name
FROM titles CROSS JOIN publishers