联合 查询
为什么要联合查询 有时为了查询一个完整的数据 需要从多个表中同时获取数据数据库是怎么联合查询的 在使用联合查询时数据库获取参与查询的表的笛卡尔积并把结果汇聚到一个临时表中1. 笛卡尔积笛卡尔积 简单来说就是将要参与查询的每个表的数据进行排列组合是两多个表之间的运算举个例子 :2 个表进行笛卡尔积的结果 笛卡尔积得到结果是完全排列组合的结果会出现无效的数据和有效数据通常使用一些条件来筛选数据2. 内连接构造数据createtablecourse(course_idintprimarykeyauto_increment,namevarchar(20));createtablestu(stu_idintprimarykeyauto_increment,namevarchar(20),snovarchar(10),class_idint);createtableclass(class_idintprimarykeyauto_increment,namevarchar(20));createtablescore(stu_idint,course_idint,scoreint);insertintocourse(name)values(Java),(C),(MysQL),(操作系统),(计算机网络),(数据结构);insertintoclass(name)values(Java001班),(C001班),(前端001班);insertintostuvalues(null,唐三藏,100001,1),(null,孙悟空,100002,1),(null,猪悟能,100003,1),(null,沙悟净,100004,1),(null,宋江,200001,2),(null,武松,200002,2),(null,李逹,200003,2),(null,不想毕业,200004,2);insertintoscore(score,stu_id,course_id)values-- 唐三藏的成绩(70.5,1,1),(98.5,1,3),(33,1,5),(98,1,6),-- 孙悟空的成绩(60,2,1),(59.5,2,5),-- 猪悟能的成绩(33,3,1),(68,3,3),(99,3,5),-- 沙悟净的成绩(67,4,1),(23,4,3),(56,4,5),(72,4,6),-- 宋江的成绩(81,5,1),(37,5,5),-- 武松的成绩(56,6,2),(43,6,4),(79,6,6),-- 李逵的成绩(80,7,2),(92,7,6);得到笛卡尔积的 SQL 语句 select * from 表名, 表名, ... ;在from后同时写所有参与查询的表并⽤逗号隔开内连接的 2 种 SQL 语法 :select 字段 from 表名1表名2, ... where 连接条件 and 其他条件select 字段 from 表名1 (inner) join 表名2 join ... on 连接条件 where 其他条件示例 1 查询班级信息和学生信息查询孙悟空的班级信息和学生信息在联合查询时注意筛选条件在where后的连接条件中表的字段不能只写字段表名.字段来指定字段才可以直接写字段数据库会报错 ❌如果想精简下查询条目可以配合指定列查询但是在指定列的时候也要表名.字段第二种语法 示例 2 查询每个同学的总成绩示例 3 查询个人信息和成绩、课程信息这次是 3 个表联合查询 这次需要用where关联 3 个表stu.stu_id score.stu_idcourse.course_id score.course_id3. 外连接构造数据createtablestu(stu_idint,namevarchar(20));createtablescore(stu_idint,scoreint);insertintostuvalues(1,唐三藏),(2,孙悟空),(3,猪八戒);insertintoscorevalues(1,100),(2,89),(3,70);外连接分为左外连接和右外连接当表的数据是一一对应的左外连接和右外连接、内连接是没有区别的例如 :左外连接 SQL语句 select 字段 from 表名1 left join 表名2 on 连接条件 where 其他条件右外连接 SQL语句 select 字段 from 表名1 right join 表名2 on 连接条件 where 其他条件修改score表的stu_id 3为stu_id 4 2 个表数据就不一一对应这时的内连接只有 2 表相匹配的数据 当数据不一一对应时 ,左外连接和右外连接、内连接就会有区别左外连接 返回左表中的所有记录和右表中相匹配的记录如果右表中没有匹配的记录则会返回nullstu是左表,记录是全部显示的score表是右表只有stu_id相匹配的显示了正常分数没有匹配的就是null右外连接 返回右表中的所有记录和左表中相匹配的记录如果左表中没有匹配的记录则会返回nullstu是左表 ,只有stu_id相匹配的显示了名字没有匹配的就是nullscore表是右表记录是全部显示的4. 自连接自连接 自己和自己算笛卡尔积本质是把行关系转换为列关系SQL 中指定条件都是指定的列关系如果需要比较行之间的关系自连接就会排上用场查询 MySQL 成绩比 Java 成绩高的信息查询mysql和java的cours_id自己和自己的笛卡尔积在查询自连接的笛卡尔积时不能from 自己, 自己;,需要as 别名结果