翼度科技»论坛 编程开发 mysql 查看内容

MySQL学习3--联表查询

4

主题

4

帖子

12

积分

新手上路

Rank: 1

积分
12
1、常规联表查询

创建两张数据库表如下:
  1. mysql> select * from dept;
  2. +----+-----------+
  3. | id | deptName  |
  4. +----+-----------+
  5. |  3 | 教学部    |
  6. +----+-----------+
  7. 1 row in set (0.00 sec)
  8. mysql> select * from employee;
  9. +----+---------+--------+---------------------+
  10. | id | empName | deptId | regTime             |
  11. +----+---------+--------+---------------------+
  12. |  1 | 老邢    |      3 | 2023-06-29 16:28:09 |
  13. |  4 | 老万    |      3 | 2023-06-29 16:28:47 |
  14. |  5 | 小磊    |      3 | 2023-06-29 16:28:48 |
  15. +----+---------+--------+---------------------+
复制代码
联表查询  老邢属于哪个部门?
  1. mysql> select employee.id, employee.empName, dept.deptName  #查什么
  2.     ->from  employee,dept #从哪查   多张表使用逗号隔开
  3.     ->where  employee.deptId = dept.id and employee.empName = "老邢";#约束的条件一定要带
复制代码
  1. +----+---------+-----------+
  2. | id | empName | deptName  |
  3. +----+---------+-----------+
  4. |  1 | 老邢    | 教学部    |
  5. +----+---------+-----------+
复制代码
联表查询的时候对字段可以起别名
  1. mysql> select e.id, e.empName, d.deptName
  2.     -> from employee e, dept d
  3.     -> where e.deptId = d.id;
  4. +----+---------+-----------+
  5. | id | empName | deptName  |
  6. +----+---------+-----------+
  7. |  1 | 老邢    | 教学部    |
  8. |  4 | 老万    | 教学部    |
  9. |  5 | 小磊    | 教学部    |
  10. +----+---------+-----------+
  11. mysql> select e.id as "编号", e.empName as "名字", d.deptName as "部门"
  12.     -> from employee e, dept d
  13.     -> where e.deptId = d.id;
  14. +--------+--------+-----------+
  15. | 编号   | 名字   | 部门      |
  16. +--------+--------+-----------+
  17. |      1 | 老邢   | 教学部    |
  18. |      4 | 老万   | 教学部    |
  19. |      5 | 小磊   | 教学部    |
  20. +--------+--------+-----------+
复制代码
2、内连接和外连接

join 用于根据两个或多个表中的列之间的关系,从这些表中查询数据。
2.1、内连接  inner join

语法格式:
  1. select 字段
  2. from 表1
  3. inner join 表2
  4. on 约束关系
复制代码
例1:#查教学部有多少人
  1. mysql> select d.deptName, e.empName
  2.     -> from dept d
  3.     -> inner join employee e
  4.     -> on d.id = e.deptId;
  5. +-----------+---------+
  6. | deptName  | empName |
  7. +-----------+---------+
  8. | 教学部    | 老邢    |
  9. | 教学部    | 老万    |
  10. | 教学部    | 小磊    |
  11. +-----------+---------+
复制代码
例2:查看老邢属于哪个部门
  1. mysql> select e.empName, d.deptName
  2.     -> from employee e
  3.     -> inner join dept d
  4.     -> on e.deptId = d.id
  5.     -> where e.empName = "老邢";
  6. +---------+-----------+
  7. | empName | deptName  |
  8. +---------+-----------+
  9. | 老邢    | 教学部    |
  10. +---------+-----------+
复制代码
2.2、外连接

a、左外连接

left join关键字会从左表 (table_name1) 那里返回所有的行,即使在右表 (table_name2) 中没有匹配的行。也要展示。
语法格式:
  1. select 字段 from 左表1 left outer join 右表2 on 约束条件
复制代码
左边表全部显示,右边表去匹左边表,如果没有匹配上就显示null  例:
  1. mysql> select d.deptName, e.empName
  2.     -> from dept d
  3.     -> left outer join employee e
  4.     -> on d.id = e.deptId;
  5. +-----------+---------+
  6. | deptName  | empName |
  7. +-----------+---------+
  8. | 教学部    | 老邢    |
  9. | 教学部    | 老万    |
  10. | 教学部    | 小磊    |
  11. | 技术部    | NULL    |
  12. +-----------+---------+
复制代码
b、右外连接

语法格式:
  1. select 字段  from 左表1  right outer join 右表2 on  约束条件
复制代码
以右边表为主右边表要全部显示,左边如果没有匹配到就显示为null  例:
  1. mysql> select *
  2.     -> from employee e
  3.     -> right outer join dept d
  4.     -> on e.deptId = d.id;
  5. +------+---------+--------+---------------------+----+-----------+
  6. | id   | empName | deptId | regTime             | id | deptName  |
  7. +------+---------+--------+---------------------+----+-----------+
  8. |    1 | 老邢    |      1 | 2022-04-25 10:08:04 |  1 | 教学部    |
  9. |    2 | 雪珂    |      2 | 2022-04-25 10:08:17 |  2 | 行政部    |
  10. |    3 | 凯旗    |      3 | 2022-04-25 10:08:30 |  3 | 技术部    |
  11. |    4 | 小磊    |      1 | 2022-04-25 10:08:43 |  1 | 教学部    |
  12. |    5 | 帅栋    |      1 | 2022-04-25 10:08:56 |  1 | 教学部    |
  13. | NULL | NULL    |   NULL | NULL                |  4 | 后勤部    |
  14. +------+---------+--------+---------------------+----+-----------+
复制代码
2.3、一对一、一对多查询

例:现有学生表和老师表
一个老师对应着多个学生(一对多)     一个学生对应着咱们的一个老师(一对一)
a、一对一查询(使用内连接)

查询邱博的老师?   一对一
  1. select ts.s_name, tt.t_name
  2. from t_student ts
  3. inner joint_teacher tt
  4. on ts.teacher_id = tt.t_id
  5. where ts.s_name = "邱博"
复制代码
b、一对多查询(使用内连接)

查询老邢所带的学生
  1. select tt.t_name, ts.s_name
  2. from t_teacher tt
  3. inner join t_student ts
  4. on tt.t_id = ts.teacher_id
  5. where tt.t_name = "老邢"
复制代码
c、一对多查询(不使用内连接)
  1. select tt.t_name, ts.s_name
  2. from t_student ts, t_teacher tt
  3. where ts.teacher_id = tt.t_id and tt.t_name = '老邢'
复制代码
2.4、多对多查询

例:
学生和课程的关系
        学生选课,
        一个学生对应着多个课程
        一个课程要被多个学生选择
        一个课程对应着多个学生
创建学生表、课程表、学生_课程关联表,三表联查 两个inner join
  1. #看所有学生选择了哪些的课程
  2. select ts.s_name, tc.c_name
  3. from t_stu ts
  4. inner join stu_course sc
  5. on ts.s_id = sc.stu_id
  6. inner join t_course tc
  7. on sc.course_id = tc.c_id
  8. #查看狗蛋选择了哪些课程
  9. select ts.s_name, tc.c_name
  10. from t_stu ts
  11. inner join stu_course sc
  12. on ts.s_id = sc.stu_id
  13. inner join t_course tc
  14. on sc.course_id = tc.c_id
  15. where ts.s_name = "狗蛋"
  16. #Java被哪些学生选择了
  17. 先写课程表
  18. select *
  19. from t_course tc
  20. inner join stu_course sc
  21. on tc.c_id = sc.course_id
  22. inner join t_stu ts
  23. on sc.stu_id = ts.s_id
  24. where tc.c_name = "Java"
复制代码
 

来源:https://www.cnblogs.com/y15136702274/p/17517857.html
免责声明:由于采集信息均来自互联网,如果侵犯了您的权益,请联系我们【E-Mail:cb@itdo.tech】 我们会及时删除侵权内容,谢谢合作!

举报 回复 使用道具