当前位置:首页 » 操作系统 » 数据库查询多表

数据库查询多表

发布时间: 2023-06-13 04:04:07

sql多表查询详解


本教程为大家介绍SQL中的多表查询,下面我们来看看具体实例吧。
新建两张表:
表1:student 截图如下:
表2:course 截图如下:
(此时这竖轿派样建表只是为了演示连接SQL语句,当然实际开发中我们不会这样建表,实际开发中这两个表会有自己不同的主键。)
一、外连接
外连接可分为:左连接、右连接、完全外连接。
1、左连接 left join 或 left outer join
SQL语句:select * from student left join course on student.ID=course.ID
执行结果:
左外连接包含left join左表所有行,如果左表中某行在右表没有匹配,则结果中对应行右表的部分全部为空(NULL).
注:此时我们不能说结果的行数等于左表数据的行数。当然此处查询结果的行数等于左表数据的行数,因为左右两表此时为一对一关系。
2、右连接 right join 或 right outer join
SQL语句:select * from student right join course on student.ID=course.ID
执行结果:
右外连接包含right join右表所有行,如果左表中某行在右表没有匹配,则结果中对应左表的部分全部为空(NULL)。
注:同样此时我们不能说结果的行数等于右表的行数。当然此处查询结果的行数等于左表数据的行数,因为左右两表此时为一对一关系。
3、完全外连接 full join 或 full outer join
SQL语句:select * from student full join course on student.ID=course.ID
执行结果:
完全外连接包含full join左右两表中所有的行,如余贺果右表中某行在左表中帆衡没有匹配,则结果中对应行右表的部分全部为空(NULL),如果左表中某行在右表中没有匹配,则结果中对应行左表的部分全部为空(NULL)。
二、内连接 join 或 inner join
SQL语句:select * from student inner join course on student.ID=course.ID
执行结果:
inner join 是比较运算符,只返回符合条件的行。
此时相当于:select * from student,course where student.ID=course.ID
三、交叉连接 cross join
1.概念:没有 WHERE 子句的交叉联接将产生连接所涉及的表的笛卡尔积。第一个表的行数乘以第二个表的行数等于笛卡尔积结果集的大小。
SQL语句:select * from student cross join course
执行结果:
如果我们在此时给这条SQL加上WHERE子句的时候比如SQL:select * from student cross join course where student.ID=course.ID
此时将返回符合条件的结果集,结果和inner join所示执行结果一样。
四、两表关系为一对多,多对一或多对多时的连接语句
当然上面两表为一对一关系,那么如果表A和表B为一对多、多对一或多对多的时候,我们又该如何写连接SQL语句呢?
其实两表一对多的SQL语句和一对一的SQL语句的写法都差不多,只是查询的结果不一样,当然两表也要略有改动。
比如表1的列可以改为:
Sno Name Cno
表2的列可以改为:
Cno CName
这样两表就可以写一对多和多对一的SQL语句了,写法和上面的一对一SQL语句一样。
下面介绍一下当两表为多对多的时候我们该如何建表以及些SQL语句。
新建三表:
表A: student 截图如下:
表B: course 截图如下:
表C: student_course 截图如下:
一个学生可以选择多门课程,一门课程可以被多个学生选择,因此学生表student和课程表course之间是多对多的关系。
当两表为多对多关系的时候,我们需要建立一个中间表student_course,中间表至少要有两表的主键,当然还可以有别的内容。
SQL语句:select s.Name,C.Cname from student_course as sc left join student as s on s.Sno=sc.Sno left join course as c on c.Cno=sc.Cno
执行结果:
此条SQL执行的结果是学生选课的情况。

㈡ SQL server数据库里查询时新建查询怎么进行多表查询

查询结果直接创建一个新表存放

select * into [新表名] FROM [原表名]WHERE 车辆='小汽车'

若新建表要放在另一个数据库B中

USE B

GO

SELECT * INTO [新御拆表名] FROM [数据库名]..[表名]

WHERE 车辆='小汽车'

GO

㈢ WPS表格如何实现数据库多表格查询

WPS表格实现数据库多表格查询,根据补充说明中可以看出,只要会用VLOOKUP函数,那么只需要用两次VLOOKUP函数即可,如下面的例子,在B3单元格中输入公式并向下填充,如下:

=VLOOKUP(VLOOKUP(A3,$D:$E,2,0),$G:$H,2,0)

公式及效果图

㈣ 数据库的多表大数据查询应如何优化

1.应尽量避免在 where 子句中对字段进行 null 值判断,否则将导致引擎放弃使用索引而进行全表扫描,如:x0dx0aselect id from t where num is nullx0dx0a可以在num上设置默认值0,确保表中num列没有null值,然后这样查询:x0dx0aselect id from t where num=0x0dx0a2.应尽量避免在 where 子句中使用!=或<>操作符,否则将引擎放弃使用索引而进行全表扫描。优化器将无法通过索引来确定将要命中的行数,因此需要搜索该表的所有行。x0dx0a3.应尽量避免在 where 子句中使用 or 来连接条件,否则将导致引擎放弃使用索引而进行全表扫描,如:x0dx0aselect id from t where num=10 or num=20x0dx0a可以这样查询:x0dx0aselect id from t where num=10x0dx0aunion allx0dx0aselect id from t where num=20x0dx0a4.in 和 not in 也要慎用,因为IN会使系统无法使用索引,而只能直接搜索表中的数据。如:x0dx0aselect id from t where num in(1,2,3)x0dx0a对于连续的数值,能用 between 就不要用 in 了:x0dx0aselect id from t where num between 1 and 3x0dx0a5.尽量避免在索引过的字符数据中,使用非打头字母搜索。这也使得引擎无法利用索引。 x0dx0a见如下例子: x0dx0aSELECT * FROM T1 WHERE NAME LIKE ‘%L%’ x0dx0aSELECT * FROM T1 WHERE SUBSTING(NAME,2,1)=’L’ x0dx0aSELECT * FROM T1 WHERE NAME LIKE ‘L%’ x0dx0a即使NAME字段建有索引,前两个查询依然无法利用索引完成加快操作,引擎不得不对全表所有数据逐条操作来完成任务。而第三个查询能够使用索引来加快操作。x0dx0a6.必要时强制查询优化器使用某个索引,如在 where 子句中使用参数,也会导致全表扫描。因为SQL只有在运行时才会解析局部变量,但优化程序不能将访问计划的选择推迟到运行时;它必须在编译时进行选择。然而,如果在编译时建立访问计划,变量的值还是未知的,因而无法作为索引选择的输入项。如下面语句将进行全表扫描:x0dx0aselect id from t where num=@numx0dx0a可以改为强制查询使用索引:x0dx0aselect id from t with(index(索引名)) where num=@numx0dx0a7.应尽量避免在 where 子句中对字段进行表达式操作,这将导致引擎放弃使用索引而进行全表扫描。如:x0dx0aSELECT * FROM T1 WHERE F1/2=100 x0dx0a应改为: x0dx0aSELECT * FROM T1 WHERE F1=100*2x0dx0aSELECT * FROM RECORD WHERE SUBSTRING(CARD_NO,1,4)=’5378’ x0dx0a应改为: x0dx0aSELECT * FROM RECORD WHERE CARD_NO LIKE ‘5378%’x0dx0aSELECT member_number, first_name, last_name FROM members x0dx0aWHERE DATEDIFF(yy,datofbirth,GETDATE()) > 21 x0dx0a应改为: x0dx0aSELECT member_number, first_name, last_name FROM members x0dx0aWHERE dateofbirth < DATEADD(yy,-21,GETDATE()) x0dx0a即:任何对列的操作都将导致表扫描,它包括数据库函数、计算表达式等等,查询时要尽可能将操作移至等号右边。x0dx0a8.应尽量避免在where子句中对字段进行函数操作,这将导致引擎放弃使用索引而进行全表扫描。如:x0dx0aselect id from t where substring(name,1,3)='abc'--name以abc开头的idx0dx0aselect id from t where datediff(day,createdate,񟭅-11-30')=0--‘2005-11-30’生成的idx0dx0a应改为:x0dx0aselect id from t where name like 'abc%'x0dx0aselect id from t where createdate>=񟭅-11-30' and createdate<񟭅-12-1'x0dx0a9.不要在 where 子句中的“=”左边进行函数、算术运算或其他表达式运算,否则系统将可能无法正确使用索引。x0dx0a10.在使用索引字段作为条件时,如果该索引是复合索引,那么必须使用到该索引中的第一个字段作为条件时才能保证系统使用该索引,否则该索引将不会被使用,并且应尽可能的让字段顺序与索引顺序相一致。x0dx0a11.很多时候用 exists是一个好的选择:x0dx0aelect num from a where num in(select num from b)x0dx0a用下面的语句替换:x0dx0aselect num from a where exists(select 1 from b where num=a.num)x0dx0aSELECT SUM(T1.C1)FROM T1 WHERE( x0dx0a(SELECT COUNT(*)FROM T2 WHERE T2.C2=T1.C2>0) x0dx0aSELECT SUM(T1.C1) FROM T1WHERE EXISTS( x0dx0aSELECT * FROM T2 WHERE T2.C2=T1.C2) x0dx0a两者产生相同的结果,但是后者的效率显然要高于前者。因为后者不会产生大量锁定的表扫描或是索引扫描。

㈤ 关系数据库如何查询多表有联系数据

关联查询是日常工作中常用的查询方式,关联查询sql编写的思路一般如下:1、先确定所连接的表,2、再确定所要查询的字段,3、确定连接条件以及连接方式(表连接分类: 内连接、外连接、交叉连接、自连接)
1、内连接:[inner] join on
分类:等值连接、非等值连接
(1)等值连接: 指使用等号"=“比较两个表的连接列的值,相当于两表执行笛卡尔后,取两表连结列值相等的记录(自然连接是一种特殊的等值连接)(2)非等值连接:指使用”>“或”<"比较两个表的连接列的值,相当于两表执行笛卡尔后,取一个表大于或小于另一个表的连结列值的记录
2、外连接
分类:左外连接、右外连接、全外连接
(1)左外连接:left outer join
连接效果:查询结果包含左、右两个表需要查询的全部行,左侧的表中的全部数据都会被显示出来,但是右侧表的数据,只有和左侧匹配上的数据才会被查询出来!否则显示为null(2)右外连接:right outer join
连接效果:查询结果包含左、右两个表需要查询的全部行,右侧的表中的全部数据都会被显示出来,但是左侧表的数据,只有和右侧匹配上的数据才会被查询出来!否则显示为null(3)全外连接:full/all outer join,查询结果包含左、右两个表需要查询的全部行,对应字段没有值显示null
3、交叉连接
左表中的每一行与右表中的所有行组合,也叫表与表之间做笛卡尔积查询
4、自连接
当前表与自身的连接查询,关键点在于虚拟化出一张表,即给自身的表定义一个别名

热点内容
地铁加密线是什么意思 发布:2025-04-04 12:32:00 浏览:120
linux下载解压 发布:2025-04-04 12:23:45 浏览:790
怎么在服务器里设材质包 发布:2025-04-04 12:10:08 浏览:630
php学习路线 发布:2025-04-04 12:05:13 浏览:754
压缩文件视频 发布:2025-04-04 12:00:48 浏览:319
17php 发布:2025-04-04 11:54:33 浏览:213
仿链家源码 发布:2025-04-04 11:48:46 浏览:423
篮球训练视频文字脚本 发布:2025-04-04 11:47:18 浏览:839
两麦分离算法 发布:2025-04-04 11:23:45 浏览:431
换一个浏览器ftp打不开 发布:2025-04-04 11:23:44 浏览:184