多表查询的基础是单表查询,一些基本的语句都在单表查询中介绍过了
目录
主外键相等链接(两个表)
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被用于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
多个表需要两两相连
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
只要主键彼此连接上了其他的就可以比较随意地使用了。