我们来详细讲解一下“详解MySQL数据库--多表查询--内连接,外连接,子查询,相关子查询”的完整攻略。
多表查询
多表查询是指在数据查询时,涉及到多个数据表之间的关联查询操作。在MySQL数据库中,常用的多表查询方式包括内连接、外连接、子查询和相关子查询。
多表查询的作用是帮助我们在多个数据表之间找出适合的关联数据,从而更方便地查询我们需要的数据。
内连接查询
内连接查询是指根据两个或多个表之间的共同数据,将这些表中相关的数据行进行匹配,从而取出符合条件的数据。它可以让我们在多个表之间进行数据匹配,找到相应的数据行。内连接查询中使用的关键字为“JOIN”。
内连接查询语句的一般格式为:
SELECT 列名 FROM 表A JOIN 表B ON 表A.列 = 表B.列
例如,我们有一个“商品表”和一个“订单表”,它们的结构如下:
商品表(product):
id | name | price |
---|---|---|
1 | iPhone13 | 9299 |
2 | iPad Pro | 6499 |
3 | MacBook Air | 8999 |
订单表(orders):
id | product_id | user_id | quantity |
---|---|---|---|
1 | 1 | 1001 | 2 |
2 | 2 | 1002 | 1 |
3 | 3 | 1001 | 1 |
我们希望查询出所有订单和商品的信息,可以使用内连接查询,具体语句如下:
SELECT orders.id, product.name, orders.quantity
FROM orders
JOIN product ON orders.product_id = product.id
这个查询语句将订单表orders和商品表product按照共同的列product.id和orders.product_id进行了匹配,找到了符合条件的数据行。
外连接查询
外连接查询是指根据两个或多个表之间的数据关系,将符合条件的数据行并起来,并将其他未匹配的数据行空出来,使得查询结果更全面和准确。
外连接查询一般有两种类型:左外连接和右外连接。
左外连接将第一个表的所有数据行和第二个表符合条件的数据行排列在一起,未匹配的部分用NULL值表示。右外连接则相反,将第二个表的所有数据行和第一个表符合条件的数据行排列在一起,未匹配的部分用NULL值表示。
外连接查询语句的一般格式为:
SELECT 列名 FROM 表A LEFT/RIGHT JOIN 表B ON 表A.列 = 表B.列
例如,我们有一个“学生表”和一个“成绩表”,它们的结构如下:
学生表(student):
id | name |
---|---|
1 | 小明 |
2 | 小红 |
3 | 小强 |
成绩表(score):
id | student_id | subject | score |
---|---|---|---|
1 | 1 | 语文 | 86 |
2 | 2 | 数学 | 92 |
3 | 1 | 数学 | 78 |
4 | 3 | 语文 | 88 |
我们希望查询出所有学生的姓名和成绩,包括还没有成绩的学生,可以使用左外连接查询,具体语句如下:
SELECT student.name, score.score
FROM student
LEFT JOIN score ON student.id = score.student_id
这个查询语句将学生表student和成绩表score按照共同的列student.id和score.student_id进行了匹配,同时保留了student表中没有匹配的数据行。
子查询
子查询是指在查询语句中嵌套一个查询语句,用来提取满足子查询条件的数据行。
子查询分为两种类型:标量子查询和列表子查询。
标量子查询是指返回单行单列的子查询,可以用在普通查询语句中作为条件,例如在WHERE、HAVING和SELECT子句中使用。
列表子查询是指返回多行多列的子查询,可以用在IN、NOT IN和EXISTS等关键字后面,作为条件的一部分。
子查询的语法格式为:
SELECT 列名 FROM 表名 WHERE 列名 (SELECT 列名 FROM 表名 WHERE 列名 = 条件)
例如,我们有一个“课程表”和一个“教师表”,它们的结构如下:
课程表(course):
id | name | teacher_id |
---|---|---|
1 | 数据库 | 1 |
2 | Java | 2 |
3 | Python | 3 |
教师表(teacher):
id | name | salary |
---|---|---|
1 | 张三 | 10000 |
2 | 李四 | 12000 |
3 | 王五 | 9000 |
我们希望查询所有教师的姓名和教授的最高薪资,可以使用子查询,具体语句如下:
SELECT name, (
SELECT MAX(salary)
FROM course
JOIN teacher ON course.teacher_id = teacher.id
WHERE teacher.id = t.id
) AS max_salary
FROM teacher t
这个查询语句中使用了列表子查询,在查询教师的同时,查询每个教师所教授的所有课程并与教师表中的数据进行匹配,从而得到每个教师最高的薪资。
相关子查询
相关子查询是指嵌套在外部查询语句中,使用外部查询的数据来限制内部查询的结果。
例如,我们有一个“学生表”和一个“成绩表”,它们的结构如下:
学生表(student):
id | name |
---|---|
1 | 小明 |
2 | 小红 |
3 | 小强 |
成绩表(score):
id | student_id | subject | score |
---|---|---|---|
1 | 1 | 语文 | 86 |
2 | 2 | 数学 | 92 |
3 | 1 | 数学 | 78 |
4 | 3 | 语文 | 88 |
我们希望查询出平均成绩大于80分的学生名字,可以使用相关子查询,具体语句如下:
SELECT name
FROM student
WHERE id IN (
SELECT student_id
FROM score
GROUP BY student_id
HAVING AVG(score) > 80
)
这个查询语句中使用了相关子查询,在查询学生的姓名时,使用外部查询的结果来限制内部查询的结果。
以上就是“详解MySQL数据库--多表查询--内连接,外连接,子查询,相关子查询”的完整攻略,并包含了两条示例说明。希望可以对你有所帮助。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:详解MySQL数据库–多表查询–内连接,外连接,子查询,相关子查询 - Python技术站