当前位置:首页 » 编程语言 » sql连接查询同班
扩展阅读
webinf下怎么引入js 2023-08-31 21:54:13
堡垒机怎么打开web 2023-08-31 21:54:11

sql连接查询同班

发布时间: 2022-10-17 04:29:57

‘壹’ sql 自身连接查询问题

select b.姓名,b.班级(这里b.后面跟你要查询的字段) from 学生基本信息表 a,学生基本信息表 b where a.姓名='查询信息' and a.班级号=b.班级号

‘贰’ SQL 连接查询

不懂就看看
SQL-92标准所定义的FROM子句的连接语法格式为:

FROM join_table join_type join_table

[ON (join_condition)]

其中join_table指出参与连接操作的表名,连接可以对同一个表操作,也可以对多表操作,对同一个表操作的连接又称做自连接。

join_type 指出连接类型,可分为三种:内连接、外连接和交叉连接。内连接(INNER JOIN)使用比较运算符进行表间某(些)列数据的比较操作,并列出这些表中与连接条件相匹配的数据行。根据所使用的比较方式不同,内连接又分为等值连接、自然连接和不等连接三种。

外连接分为左外连接(LEFT OUTER JOIN或LEFT JOIN)、右外连接(RIGHT OUTER JOIN或RIGHT JOIN)和全外连接(FULL OUTER JOIN或FULL JOIN)三种。与内连接不同的是,外连接不只列出与连接条件相匹配的行,而是列出左表(左外连接时)、右表(右外连接时)或两个表(全外连接时)中所有符合搜索条件的数据行。

交叉连接(CROSS JOIN)没有WHERE 子句,它返回连接表中所有数据行的笛卡尔积,其结果集合中的数据行数等于第一个表中符合查询条件的数据行数乘以第二个表中符合查询条件的数据行数。

连接操作中的ON (join_condition) 子句指出连接条件,它由被连接表中的列和比较运算符、逻辑运算符等构成。

无论哪种连接都不能对text、ntext和image数据类型列进行直接连接,但可以对这三种列进行间接连接。例如:

SELECT p1.pub_id,p2.pub_id,p1.pr_info

FROM pub_info AS p1 INNER JOIN pub_info AS p2

ON DATALENGTH(p1.pr_info)=DATALENGTH(p2.pr_info)

(一)内连接

内连接查询操作列出与连接条件匹配的数据行,它使用比较运算符比较被连接列的列值。内连接分三种:

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

ORDER BY type

‘叁’ SQL连接查询研究

1、分类
在多表关联查询时,经常要用到连接查询,SQL中连接分为四种:内连接(inner join或join)、左外连接(left outer join)、右外连接(right outer join)、全连接(full outer join);
其中,除了inner join其余三种都是外连接。
首先建2张表用于后面的讲解用。
表A:合同表

表B:合同金额历史修改记录表

其中,B表中的fk_contract_id字段与A表中的id字段有外键关系;
2、inner join内连接
内连接结果返回A、B两个表均匹配的数据集,其中有一个表的数据不满足,则那条数据不返回;
模拟数据如下:
A:

B:

结果:

分析:

3、left outer join左外连接
通常也简称为左连接,sql中可省略outer,写为:left join;
左连接以左表为主表,右表为从表,返回结果集以左表数据为基础,连接右表获取额外信息;
查询语句举例:

结果:

分析:
从结果可以看出,虽然合同3在B表中没有数据与之对应,但是还是作为结果集中的一部分返回了,因此可以这么说,只要主表有N条记录,使用left join查询返回的结果集一定至少有N条记录(不考虑where条件)!

特别注意左连接时查询条件放置的位置:
使用left join查询时,主表的筛选条件要放在where中,而从表的条件要看情况选择放在连接条件on中或是放在where中;下面举例子说明这两种情况:
栗子1:查询出所有历史合同金额有过300的合同记录。
sql:

结果:

结果满足我们的需求,但是如果把筛选条件放在on中:

结果:

显然,查询结果不满足我们的这个需求!
栗子2:查询出所有合同,并且如果其历史合同金额有过300则展示其合同记录信息。
在这个需求下,我们把查询条件放在on中就是正确的,这时是不能放在where中的。
4、right outer join右外连接
通常简称为右连接,outer可省略,写为:right join;
与左连接相反,右连接以右表为主表,即以右表记录为基础,扩展查询左表信息;
一般可与左连接相互转换,例如上栗1用右连接可以写成如下sql:

结果:

5、full outer join全连接
全连接,即只要其中某个表存在匹配,full join关键字就会返回行。在mysql中并不支持full join,但可以用left join和right join查询后再union代替,举个栗子:
A表数据:

B表数据:

结果:

分析:
从结果中可以看出,全连接会返回A、B表中所有记录,其中有关联的会根据on条件进行整合,没有连接上的记录也会返回。

总结:
SQL中的连接查询使用非常频繁,但其中的一些细节还需要平时多注意,比如:
1、左、右连接时的条件放置位置及其区别;
2、一对多关系时,在左、右外连接时,若“一”为主表(或内连接)时,查询结果集主表记录会有重复!若要统计主表记录时则需去重。

以上是笔者在平时工作中用到sql的连接查询时总结出来的知识,分享给大家,希望对读者有帮助!如有错误请给我留言,我会及时更正,谢谢!

‘肆’ 用sql语句进行多表连接查询出现重复数据

1、在电脑上打开要去掉重复数据的数据库,这里新建一张含有重复数据的user表。

‘伍’ SQL常用的几种连接查询

一、内连接(Inner Join)

select*fromainnerjoinbona.name=b.name;

此语句的结果为同时匹配表a和表b的记录集。即内连接取的是两个表的交集。

二、全外连接(full outer join)

select*fromafullouterjoinbona.name=b.name;

此语句的结果为表a与表b的并集,即任意一个表的内容都将被查询出来,如果另一个表无对应的项,则显示为null

select*fromafullouterjoinbona.name=b.namewherea.nameisnullorb.nameisnull;

此语句的结果为表a与表b的并集除去两表的交集。即除去了两表都有的部分,剩余的是两表各自不同的部分

三、左外连接(left outer join)

select*fromaleftouterjoinbona.name=b.name;

此语句的结果为表a的所有项加表b与a相匹配的项,b中没有与a匹配的项时显示为null

select*fromaleftouterjoinbona.name=b.namewhereb.nameisnull;

此语句的结果为表a的所有项除去两表的交集

四、右外连接(right outer join)

select*fromarightouterjoinbona.name=b.name;

此语句的结果为表a与表b匹配的项加表b的所有项,a中没有与b匹配的项时显示为null

select*fromarightouterjoinbona.name=b.namewherea.nameisnull;

此语句的结果为表b的所有除去两表的交集

‘陆’ SQL表连接查询

连接查询包括合并、内连接、外连接和交叉连接,如果涉及多表查询,了解这些连接的特点很重要。
只有真正了解它们之间的区别,才能正确使用。
1、Union
UNION 操作符用于合并两个或多个 SELECT 语句的结果集。
UNION 运算符通过组合其他两个结果表(例如 TABLE1 和 TABLE2)并消去表中任何重复行而派生出一个结果表。
当 ALL 随 UNION 一起使用时(即 UNION ALL),不消除重复行。两种情况下,派生表的每一行不是来自 TABLE1 就是来自 TABLE2。
注意:使用UNION时,两张表查询的结果有相同数量的列、列类型相似。
2、INNER JOIN(内连接)
INNER JOIN(内连接),也成为自然连接
作用:根据两个或多个表中的列之间的关系,从这些表中查询数据。
注意: 内连接是从结果中删除其他被连接表中没有匹配行的所有行,所以内连接可能会丢失信息。
重点:内连接,只查匹配行。
3、外连接
与内连接相比,即使没有匹配行,也会返回一个表的全集。
外连接分为三种:左外连接,右外连接,全外连接。对应SQL:LEFT/RIGHT/FULL OUTER JOIN。通常我们省略outer 这个关键字。写成:LEFT/RIGHT/FULL JOIN。
重点:至少有一方保留全集,没有匹配行用NULL代替。
1)LEFT OUTER JOIN,简称LEFT JOIN,左外连接(左连接)
结果集保留左表的所有行,但只包含第二个表与第一表匹配的行。第二个表相应的空行被放入NULL值。
4、CROSS JOIN(交叉连接)
交叉连接。交叉连接返回左表中的所有行,左表中的每一行与右表中的所有行组合。交叉连接也称作笛卡尔积。
简单查询两张表组合,这是求笛卡儿积,效率最低。

‘柒’ SQL 基本语句 表的连接查询

问题一:x.degree>y.degree
x 表和 y 表中有相同的字段 degree, x 中的 degree 值大于 y 中的
问题二:x.cno='3-105'and x.degree>y.degree and y.sno='109' and y.cno='3-105'
x 表中的 cno 字段值为'3-105'
x 表中的 degree 值大于 y 中的 degree 值
y 表中的 sno 字段值为'109'
y 表中的 cno 字段值为'3-105'
以上4个条件取交集
问题三:类似语句
1.
SELECT a.guest_id, a.guest_nme, a.service_type, a.working_addr,
b.phone_num,c.account_id
FROM pcc_tb_guest_mbl a, pcc_tb_guest_num b, pcc_tb_account c
WHERE a.guest_id = b.guest_id
AND b.account_id = c.account_id
AND a.subscr_nme LIKE '王%%'
AND a.service_type = 'voic02'
AND b.phone_num LIKE '8976%'
ORDER BY b.phone_num DESC

2.
SELECT b.phone_num 电话号码,
DECODE (b.num_status, 'A', '可使用', 'V', '保留号','已使用') 状态
FROM (SELECT phone_num, num_status
FROM pcc_tb_nm_number
WHERE MOD (SUBSTR (phone_num, 7), 11) = '0'
AND phone_num LIKE '85%'
AND num_status IN ('A','V') b
WHERE MOD (SUBSTR (b.phone_num, 5, 2), 11) = '0'

第一个你肯定能看懂,第二个写了几个函数DECODE,MOD,SUBSTR
DECODE(字段名,值1,翻译值1,值2,翻译值2,...值n,翻译值n,缺省值)
MOD(m,n) 取 m 除以 n 的余数
SUBSTR(字段名,m,n) 字段中从 m 位置开始,取 n 的长度,若 n 省略默认
取到最后
第二句即查询电话号码如 85%xxyy (尾号是双重号),状态是'可使用'和'保留号'的号码

希望对你有所帮助

‘捌’ sql 全连接查询

在两表连接是不能用groub
by的。(内连接查询)
select
学号,姓名,选修课课程from
学生信息表
inner
join
课程表
on
学生信息表.选修课课程
=
课程表.选修课课程;

‘玖’ sql 怎么多表连接查询(相同结构) 100分 急求

select c.* from
(select * from 表1 union all
select * from 表2) as c
order by id desc limit ……

limit后边你取多少就自己写吧

‘拾’ sql 连接查询

1.select worker.姓名,salary.工资 from worker,salary
where salary.日期 between'04/01/01' and '04-02-01' and worker.职工号=salary.职工号
2.select worker.职工号, worker.姓名,avg(salary.工资) as 平均工资 from worker,salary
group by worker.职工号, worker.姓名
我在自己的电脑上试过了,不知道你满意不!呵呵