SQL语言多表查询

发布于:2022-11-09 ⋅ 阅读:(13) ⋅ 点赞:(0) ⋅ 评论:(0)

    多表查询的基础是单表查询,一些基本的语句都在单表查询中介绍过了

目录

主外键相等链接(两个表)

join链接(两个表)

子查询(两个表)

自链接(两个表)

别名

为什么加>或

多表查询(多于两个表)


主外键相等链接(两个表)

 需要明确的是,原本的结构不能变,所以

提到多表查询,是什么将多个表连接在一起的呢?

数据库中的表可通过键将彼此联系起来。主键(Primary Key)是一个列,在这个列中的每一行的值都是唯一的。在表中,每个主键的值都是唯一的。这样做的目的是在不重复每个表中的所有数据的情况下,把表间的数据交叉捆绑在一起。

                                                                                                                --摘自w3school

通过不同表中的相同键来连接,其中一个表的主键=另外一个表中的列,两者表示的是同一组数据,只不过是不同的表现形式

例子一

SELECT customerName
FROM customers ,payments
WHERE customers.customerNumber = payments.customerNumber

若不同表中的列名相等,那么需要在前面加上表名称

例子二

 SELECT customers.customerNumber
FROM customers ,payments
WHERE customers.customerNumber = payments.customerNumber
AND customers.limit>500

限定链接的行

join链接(两个表)

所有的列名都需要明确

join被用于where语句中用于提供链接条件

SQL JOIN (w3school.com.cn)

子查询(两个表)

子查询或嵌套查询时放置在另一个查询中的内部查询,子查询是从另一个表中(可能与主表相同,也可能不同)提取主表的限制条件。

使用条件:查询结果处理需要两个或两个以上的步骤,外部查询结果作用于子查询结果

如何写子查询呢?

子查询同外部查询的结构一样,都是由select from 的大框架组成的

外部查询:用于查询结果展示

子查询(内部查询):用于限制条件,返回符合子查询条件的查询结果

注意:子查询得出的结果一定要与外部查询的条件相对应

子查询返回一条结果,直接用等号链接查询结果就行了

SELECT `customerName` FROM `customers` 
WHERE `salesRepEmployeeNumber`=(
    SELECT `employeeNumber`
    FROM `employees` 
    WHERE employees.firstName='Pamela'
    AND employees.lastName='Castillo')

首先从employees 表单中查找   

'employees.firstName'='Pamela' 并且 employees.lastName='Castillo'的员工(employee),子查询返回该员工的员工编号,返回值为salesRepEmployeeNumber的左值,之后在customers之中查找指定编号的customerName

子查询返回多个结果(一个列表),使用IN语句

SELECT `customerNumber`,`customerName`,`salesRepEmployeeNumber`
FROM `customers` 
WHERE `salesRepEmployeeNumber` IN(
	SELECT `employeeNumber` 
   FROM `employees` 
	WHERE `officeCode`=6)

寻找officeCode=6的员工编号,并且打印该员工的顾客信息

小tips:可以现在子查询(内部查询)的表中把子查询先写出来,之后再粘贴到相应位置处会比较方便。

力扣题目  586. 订单最多的客户

自链接(两个表)

什么叫自查询?同一个表中元素的查询。

自查询将同一个表变成两个相同的大表,但是要对两个表起别名

别名

在from语句中直接添加在一个表名后面,用空格与原表隔开,

SELECT C.customerNumber, O.orderDate
FROM customers C, orders O
WHERE c.customerNumber=o.customerNumber
AND o.orderDate>'2005-05-01'

给表格customer起一个别名叫C,orders起一个别名叫O (SQL语句不区分大小写),并且可以讲起的别名应用到其他的SQL语句中

customerNumber是customer表的主键,是orders表中的外键,使用此方法来链接两个表格

讲完了别名,回过头再继续讲自链接

例子一:

查询employees表中firstName相同的员工名称(不包括同一个员工)

SELECT F.firstName,f.lastName,S.firstName,s.lastName
FROM employees F,employees S
WHERE F.firstName=S.firstName
AND f.employeeNumber>s.employeeNumber

 对于同一个表employees起了两个别名F 和 S (不区分大小写),通过相同的firstName链接。使用不同的employeeNumber区别同一个人。

为什么使用>区分相同的人?使用<>或 != 不可以吗?

AND f.employeeNumber>s.employeeNumber

链接不是等号而是>或者<用于排除相同的

他怎么能够排除与自己相同的呢?必须要加入其他的条件

为什么加>或<?

而不是<>

每次比较,都是将F表中的firstName挨个与S表中的firstName相比较,为了区分相同的行,用AND语句增加了一个条件使把自己排除在外

主键自查询

力扣例题

182. 查找重复的电子邮箱

select distinct(p1.Email) 
from Person p1  ,Person  p2 
where p1.Email = p2.Email #链接
AND p1.Id<p2.Id

多表查询(多于两个表)

多个表需要两两相连

SELECT o.ordernumber, productname
FROM `orders` O, orderdetails OD, Products P
WHERE o.ordernumber = OD.orderNumber
AND OD.productCode = P.productCode
AND o.`orderNumber` = 10177

只要主键彼此连接上了其他的就可以比较随意地使用了。