多表查询

image.png
image.png

  1. -- 查看每个老师的授课 两表查询
  2. select name,course_name FROM teacher,course -- 表之间使用 , 隔开
  3. WHERE course.teacher_id=teacher.id -- 两个表中之间的对应关系 course表中的 teacherid teacher表中的id一致。
  4. -- 查看年龄大于30岁的老师,以及对应的授课名称
  5. select name,course_name FROM teacher,course -- 表之间使用 , 隔开
  6. WHERE course.teacher_id=teacher.id
  7. AND teacher.age>30

三表查询

  1. -- 查询学生姓名和学生的选课课程名
  2. SELECT name,course_name FROM student,course,student_course
  3. WHERE student.id = student_course.student_id -- 对应的联系
  4. AND course.id = student_course.course_id

在做多表查询的时候,首要找到多表之间的关联的字段。

临时表作为多表中的一个

下面有两个表
customers
image.png
订单表 orders
image.png
现在要统计 顾客的订单数

  1. -- orders表中可以使用分组查询的方式统计数据
  2. SELECT cust_id, COUNT(*) as 订单数 FROM orders GROUP BY cust_id;

image.pngMySQL-04 - 图6
根据这个结果表,如果直接与上面的顾客表进行关联,
关联对象位 cust_id, 使用多表查询

  1. select cust_name,订单数 from customers, tmp
  2. where cusetomers.cust_id = tmp.cust_id

对应的语句

  1. SELECT customers.cust_id, cust_name, 订单数 from customers,(SELECT cust_id, COUNT(*) as 订单数 FROM orders GROUP BY cust_id) as tmp
  2. WHERE customers.cust_id = tmp.cust_id

inner join 内连接

多个表查询的时候
主要语法
inner join 表 on 表之间的关系语句。

  1. -- INNER JOIN ON
  2. -- 两个表关系
  3. select * from teacher
  4. INNER JOIN course
  5. ON teacher.id = course.teacher_id
  6. SELECT name,course_name FROM teacher
  7. INNER JOIN course
  8. ON teacher.id = course.teacher_id
  9. -- 三个表之间关联
  10. SELECT name,course_name FROM student -- 学生表
  11. INNER JOIN student_course -- 学生选课表
  12. ON student.id = student_course.student_id
  13. INNER JOIN course -- 对应的课程表
  14. ON course.id = student_course.course_id

多表查询中添加条件过滤

  1. -- 年龄大于20 并且姓名 3个字
  2. SELECT name,course_name,age FROM student_course -- 学生表
  3. INNER JOIN course -- 学生选课表
  4. ON course.id = student_course.course_id
  5. INNER JOIN student -- 对应的课程表
  6. ON student.id = student_course.student_id
  7. where age>20 and name like "___" -- 过滤年龄大于20 并且 姓名三个字

image.pngimage.png

  1. -- 查询 商品名,产地名
  2. SELECT prod_name,vend_name from products
  3. INNER JOIN vendors
  4. ON products.vend_id = vendors.vend_id

左连接

left join on
以左表为主,左表的数据都会显示。

  1. SELECT vendors.vend_id,vend_name,prod_name from vendors -- 左表
  2. LEFT JOIN products
  3. ON products.vend_id = vendors.vend_id

左表中的所有数据为主,第二表中没有数据与第一个表关联,则显示 Null。
image.png


下面两张表
image.pngimage.png

  1. -- 使用左连接方式 查询 课程名,老师的名字。 如果课程没有对应的老师,老师名字下面显示为Null
  2. select course_name as 课程,name as 名字 from course
  3. LEFT JOIN teacher
  4. on course.teacher_id = teacher.id

三个表中也可以使用 左连

image.pngimage.pngimage.png

从上面三个表中进行 查询,学生选课信息

  1. -- 学生姓名,课程名, 如果该学生没有选课内容,课程名显示为 Null
  2. SELECT name,course_name FROM student
  3. LEFT JOIN student_course
  4. ON student.id = student_course.student_id
  5. LEFT JOIN course
  6. ON course.id = student_course.course_id

右联结

以右边的表为依据进行连接。

  1. -- 右连接 以右边表为主表。
  2. select course_name as 课程,name as 名字 from course
  3. RIGHT JOIN teacher
  4. on course.teacher_id = teacher.id

在工作过程中,大部分人一直使用左联的方式进行sql编写。

union

image.pngimage.png
两个表中都有age 字段,

  1. -- union 在连接两个表的时候如果数据有相同,会自动去重
  2. SELECT age FROM student
  3. UNION
  4. SELECT age from teacher;

image.png

union All 连接两个表的时候,不会将重复数据去重。

  1. SELECT age FROM student
  2. UNION ALL
  3. SELECT age from teacher;

image.png

作业

所有的表都在数据库中

  1. 外网地址:rm-bp188nr95fk4l9545ao.mysql.rds.aliyuncs.com
  2. 端口号:3306
  3. 用户名: fanmao60
  4. 密码: ABCfanmao60
  5. 数据库: lianxi lainxi_zh)表的名称为中文

基本语句复习

  1. 查询年龄大于 38 的教师信息
  2. 查询身份证号包含 X 的教师信息
  3. 查询年龄大于 18 和 姓氏 王 的学生信息
  4. 查询年龄大于 15 或 姓氏 王 的学生信息
  5. age 在 30 和 50 之间的教师
  6. teacher 表为例,将查询出来的所有结果集按照年龄 age 从小到大排序
  7. teacher 表为例,将查询出来的结果集按照 age 从大到小排序之后,再按照 id 字段从小到大排序
  8. 教师表,对 name 字段默认排序
  9. 求出全部教师平均年龄
  10. 统计全部学生数量
  11. 所有教师年龄总和
  12. 教师表中取年龄最小值的数据
  13. 教师表中取年龄最大值的数据

联结练习

  1. 内联结 查看学生姓名,对应的选课名称
  2. 左连接 查看学生姓名,对应的选课名称 (学生表为主)
  3. 查询 products(商品表),orderitems (订单详情表) 中订单详情, 统计每个商品的销售情况 order_num(订单号),prod_id(商品id),prod_price(商品价格), total_price(总价)

    1. SELECT order_num as 订单号, orderitems.prod_id as 商品id, prod_price as 商品单价, (quantity*prod_price) as 总价
    2. FROM orderitems
    3. INNER JOIN products
    4. ON
    5. orderitems.prod_id = products.prod_id
  4. 查询orders(订单表),customers(会员表),orderitems(订单详情表) 统计每个订单的 order_time(订单时间),order_num(订单号),cust_name(会员名称), total_price (此订单总额)

  1. --1 每个订单的 总额
  2. select order_num, sum(quantity*item_price) as 订单总额 FROM orderitems
  3. GROUP BY order_num; -- 结果作为临时表数据

image.png

image.pngimage.png
image.png

  1. select order_date, orders.order_num, cust_name, 订单总额
  2. FROM (select order_num, sum(quantity*item_price) as 订单总额 FROM orderitems GROUP BY order_num) as tmp
  3. INNER JOIN orders
  4. ON orders.order_num = tmp.order_num
  5. INNER JOIN customers
  6. ON orders.cust_id = customers.cust_id
  7. ORDER BY 订单总额;