多表查询


-- 查看每个老师的授课 两表查询select name,course_name FROM teacher,course -- 表之间使用 , 隔开WHERE course.teacher_id=teacher.id -- 两个表中之间的对应关系 course表中的 teacherid 与teacher表中的id一致。-- 查看年龄大于30岁的老师,以及对应的授课名称select name,course_name FROM teacher,course -- 表之间使用 , 隔开WHERE course.teacher_id=teacher.idAND teacher.age>30
三表查询
-- 查询学生姓名和学生的选课课程名SELECT name,course_name FROM student,course,student_courseWHERE student.id = student_course.student_id -- 对应的联系AND course.id = student_course.course_id
在做多表查询的时候,首要找到多表之间的关联的字段。
临时表作为多表中的一个
下面有两个表
customers
订单表 orders
现在要统计 顾客的订单数
-- orders表中可以使用分组查询的方式统计数据SELECT cust_id, COUNT(*) as 订单数 FROM orders GROUP BY cust_id;


根据这个结果表,如果直接与上面的顾客表进行关联,
关联对象位 cust_id, 使用多表查询
select cust_name,订单数 from customers, tmpwhere cusetomers.cust_id = tmp.cust_id
对应的语句
SELECT customers.cust_id, cust_name, 订单数 from customers,(SELECT cust_id, COUNT(*) as 订单数 FROM orders GROUP BY cust_id) as tmpWHERE customers.cust_id = tmp.cust_id
inner join 内连接
多个表查询的时候
主要语法
inner join 表 on 表之间的关系语句。
-- INNER JOIN 表 ON-- 两个表关系select * from teacherINNER JOIN courseON teacher.id = course.teacher_idSELECT name,course_name FROM teacherINNER JOIN courseON teacher.id = course.teacher_id-- 三个表之间关联SELECT name,course_name FROM student -- 学生表INNER JOIN student_course -- 学生选课表ON student.id = student_course.student_idINNER JOIN course -- 对应的课程表ON course.id = student_course.course_id
多表查询中添加条件过滤
-- 年龄大于20 并且姓名 3个字SELECT name,course_name,age FROM student_course -- 学生表INNER JOIN course -- 学生选课表ON course.id = student_course.course_idINNER JOIN student -- 对应的课程表ON student.id = student_course.student_idwhere age>20 and name like "___" -- 过滤年龄大于20岁 并且 姓名三个字


-- 查询 商品名,产地名SELECT prod_name,vend_name from productsINNER JOIN vendorsON products.vend_id = vendors.vend_id
左连接
left join on
以左表为主,左表的数据都会显示。
SELECT vendors.vend_id,vend_name,prod_name from vendors -- 左表LEFT JOIN productsON products.vend_id = vendors.vend_id
左表中的所有数据为主,第二表中没有数据与第一个表关联,则显示 Null。
下面两张表

-- 使用左连接方式 查询 课程名,老师的名字。 如果课程没有对应的老师,老师名字下面显示为Nullselect course_name as 课程,name as 名字 from courseLEFT JOIN teacheron course.teacher_id = teacher.id
三个表中也可以使用 左连



从上面三个表中进行 查询,学生选课信息
-- 学生姓名,课程名, 如果该学生没有选课内容,课程名显示为 NullSELECT name,course_name FROM studentLEFT JOIN student_courseON student.id = student_course.student_idLEFT JOIN courseON course.id = student_course.course_id
右联结
以右边的表为依据进行连接。
-- 右连接 以右边表为主表。select course_name as 课程,name as 名字 from courseRIGHT JOIN teacheron course.teacher_id = teacher.id
在工作过程中,大部分人一直使用左联的方式进行sql编写。
union


两个表中都有age 字段,
-- union 在连接两个表的时候如果数据有相同,会自动去重SELECT age FROM studentUNIONSELECT age from teacher;

union All 连接两个表的时候,不会将重复数据去重。
SELECT age FROM studentUNION ALLSELECT age from teacher;

作业
所有的表都在数据库中
外网地址:rm-bp188nr95fk4l9545ao.mysql.rds.aliyuncs.com端口号:3306用户名: fanmao60密码: ABCfanmao60数据库: lianxi (lainxi_zh)表的名称为中文
基本语句复习
- 查询年龄大于 38 的教师信息
- 查询身份证号包含 X 的教师信息
- 查询年龄大于 18 和 姓氏 王 的学生信息
- 查询年龄大于 15 或 姓氏 王 的学生信息
- age 在 30 和 50 之间的教师
- teacher 表为例,将查询出来的所有结果集按照年龄 age 从小到大排序
- teacher 表为例,将查询出来的结果集按照 age 从大到小排序之后,再按照 id 字段从小到大排序
- 教师表,对 name 字段默认排序
- 求出全部教师平均年龄
- 统计全部学生数量
- 所有教师年龄总和
- 教师表中取年龄最小值的数据
- 教师表中取年龄最大值的数据
联结练习
- 内联结 查看学生姓名,对应的选课名称
- 左连接 查看学生姓名,对应的选课名称 (学生表为主)
查询 products(商品表),orderitems (订单详情表) 中订单详情, 统计每个商品的销售情况 order_num(订单号),prod_id(商品id),prod_price(商品价格), total_price(总价)
SELECT order_num as 订单号, orderitems.prod_id as 商品id, prod_price as 商品单价, (quantity*prod_price) as 总价FROM orderitemsINNER JOIN productsONorderitems.prod_id = products.prod_id
查询orders(订单表),customers(会员表),orderitems(订单详情表) 统计每个订单的 order_time(订单时间),order_num(订单号),cust_name(会员名称), total_price (此订单总额)
--1 每个订单的 总额select order_num, sum(quantity*item_price) as 订单总额 FROM orderitemsGROUP BY order_num; -- 结果作为临时表数据




select order_date, orders.order_num, cust_name, 订单总额FROM (select order_num, sum(quantity*item_price) as 订单总额 FROM orderitems GROUP BY order_num) as tmpINNER JOIN ordersON orders.order_num = tmp.order_numINNER JOIN customersON orders.cust_id = customers.cust_idORDER BY 订单总额;
