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

中间表查询实例sql

发布时间: 2023-06-09 10:05:42

‘壹’ 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 < (select min(VALUE) from B where NAME="你输入的名字"));

‘贰’ 如何sql三张表关联查询

三张表关联查询
使用场景:A\B\C 三张表,现在要查询并展示A表和C表中的某些字段,但是A、C两表没有相同字段,无法关联,此时有B表恰好有两个字段,一个字段和A表一个字段相同,一个字段和C表一个字段相同,我们称B表为“中间表”,因此通过B表把A、C表关联起来
SELECT A1,A2,C1,C2 --展示A表中的A1\A2字段和C表中的C1\C2
FROM B --中间表
INNER JOIN A ON A.A1 = B.B1 --A表中的与B表中相同的字段
INNER JOIN C ON C.C1 = B.B1 --C表中的与B表中相同的字段
where xxxxx ---条件你自己按照需求来加,没有条件就不写where了

‘叁’ SQL实战新手入门:N路INNER JOIN

N路INNER JOIN

当两个表之间不存在直接的关系时该怎么联接这两个表呢?在这种情况下 联接操作需要涉及更多的表!在上一小节INNER JOIN的练习中已经演示了一个实际的例子

例如 有时我们需要列出所有的图书以及各图书相应的作者 请注意 在数据库中一本图书并不知道它的作者信息在哪里(即在BOOKS表的数据行中并没有关于该图书作者的信息) 而作者信息的记录同样也不知道该作者编写的图书的信息在什么地方 但是 在数据库中有一个BOOKS_AUTHORS表 它包含了这样的知识 哪一本图书是哪一个作者编写的 以及哪一个作者编写了哪些图书 BOOKS_AUTHORS表中的每一行都包含了一个BOOKS表的外键和一个AUTHORS表的外键 如果一本图书是由多个作者编写的 那么该BOOKS_AUTHORS表中就具有多行记录 每一行包含了相同的图书ID和不同的作者ID 反之亦然(对于任何一个编写了多本图书的作者)

由于BOOKS表中的数据行没有对于AUTHORS表的外键 AUTHORS表的数据行也没有对于BOOKS表的外键 因此没有办法直接将这两个表联接起来 但是可以将这两个表联接到BOOKS_AUTHORS表

SELECT

books bk_title AS Book

authors au_last_name AS Author

FROM books INNERJOIN books_authors

ON books bk_id = books_authors bk_id

INNER JOIN authors

ON authors au_id = books_authors au_id;

联接的结果如表 所示 正如我们所期望的 如果一本书的作者超过一位 那么有多少个作者 在列表中就会列出多少条记录

表 列出图书及其相应的作者

在结果集中可能会出现重复的图书名称 也可能会出现重复的作者名字 但是图书名称与作者名字的每一个组合在结果集中仅仅只会出现一次

接下来分析一下该查询返回的数据集背后的逻辑 下面是该查询的第一部分 SELECT字段列表

SELECT

books bk_title AS Book

authors au_last_name AS Author

该字段列表并没有什么神奇 它告诉查询引擎我们感兴趣的字段 并为字段列表中的列定义一个比默认名称更加可爱的列名(别名) 注意 虽然查询了多个表 但并非一定要从每一个表中都获取数据 在本例中 只需要一些来自BOOKS表的字段和一些来自AUTHORS表的字段 而并不需要获取BOOKS_AUTHORS表中的字段

FROM books INNER JOIN books_authors

ON books bk_id = books_authors bk_id

上面的子句定义了第一个INNER JOIN 指定了要联接哪两个表 以及如何联接这两个表 在本例中 联接条件是BOOKS表中的BK_ID列的值必须与BOOKS_AUTHORS表中BK_ID列的值相等(两个表中的列名不一定要相同 但是相同的列名使用起来会比较方便)

INNER JOIN authors ON authors au_id = books_authors au_id

上面的子句定义了第二个INNER JOIN 请注意它与第一个INNER JOIN子句的不同 在第一个INNER JOIN子句中指定了两个表 books INNER JOIN books_authors 但在第二个INNERJOIN中仅仅指定了一个表 INNER JOIN authors 这里并不需要指定其他的表 它已经被绑定到之前指定的两个表中的一个 并且行匹配规则将指定它与哪一个表进行联接(在本例中 行匹配规则是 AUTHORS表中AU_ID列的值与BOOKS_AUTHORS表中AU_ID列的值相等)

运行该查询后 如果BOOKS表中包含在BOOKS_AUTHORS表中没有记录的图书 则结果集中不会包含这样的图书 如果AUTHORS表中的任何作者在BOOKS_AUTHORS表中并不存在 则结果集中也不会包含这样的作者

试一试使用四路联接

如何查询位于书柜的顶层书架中名称以SQL开头的图书以及图书的作者呢?当然 这需要联接LOCATION表 BOOKS表和AUTHORS表 由于在图书与图书的作者之间是一个多对多关系 因此必须包含BOOKS_AUTHORS表作为中间表 以解决多对多关系的复杂性问题 下面将使用Microsoft SQL Server来演示联接的功能 在本书所讨论的其他任何一种RDBMS中 下面的脚本无须修改都能正常运行 下面让我们来实践一下吧

( ) 打开Microsoft SQL Server Management Studio 使用Windows身份验证连接到数据库

( ) 单击左上角的New Query按钮 输入下面的SQL查询

SELECT

au_last_name AS author

bk_title AS title

FROM books bk INNER JOIN books_authors ba

ON bk bk_id = ba bk_id

INNER JOIN authors au

ON ba au_id = au au_id

INNER JOIN location loc

ON bk bk_id = loc fk_bk_loc

WHERE loc loc_shelf =

AND bk bk_title LIKE SQL%

( ) 单击工具栏上的Execute按钮 观察返回的结果

author title

Kriegel SQL Bible

Trukhnov SQL Bible

Kriegel SQL Functions: Programmers Reference

Jones SQL Functions: Programmers Reference

Stephens SQL Functions: Programmers Reference

Plew SQL Functions: Programmers Reference

Garrett SQL Functions: Programmers Reference

( row(s) affected)

示例说明

在之前的例子中 联接的价值在于尽量减少选取的记录 直到数据集完全符合指定的筛选标准 在本例中 数据库引擎将从按照JOIN语句联接的所有表对中匹配记录(即BOOKS/BOOKS_AUTHORS BOOKS_AUTHORS/AUTHORS和BOOKS/LOCATION表对) 最后再应用筛选条件 减小数据集 仅仅返回满足条件LOC_SHELF = 和BK_TITLE以SQL开头的记录(请回忆一下带有LIKE谓词的匹配模式)

返回目录 SQL实战新手入门

编辑推荐

Oracle索引技术

高性能MySQL

lishixin/Article/program/SQL/201311/16472

‘肆’ sql语句中间表建立(要有详细的sql语句哦)

--- 如果id有字母可以换成varchar类型
create table 学生表 (学生id int ,姓名 varchar(200))
create table 课程表 (课程id int ,课程名称 varchar(500))
create table 中间表 (学生id int ,课程id int ,成绩 int )