SQL强化

SQL语言强化
多表设计
数据表与数据表之间的关系有三种,一对一,一对多,多对多
多对多案例;项目与程序员
一个项目可以由多个程序员参与,一个程序员可以参与多个项目开发。
在多对多关系中,表示两方之间关系设计数据表时,必须引入第三张数据表将项目与程序员对应,同时引用另两张实体表的主键作为外键,在多对多关系中常会出现一种关系属性模式两张表共同确定的,如一个学生的某门课程的成绩,是存储在关系表中的

一对多案例;老师与课程
一个老师可以教授多门课程,一个课程只能被一个老师教授
在一对多关系中,不需要建立第三张数据表,可以在多的一方添加一的一方的主键作为外键

一对一案例;班级与班长
一个班级只能有一个班长,一个班长只能管理一个班级
一对一的关系比较少见,在两表的任何一方添加另一方主键作为外键


多表查询
笛卡尔积
当两个数据表进行关联查询时,用第一张数据表的每条记录去匹配第二张数据表的每条记录
select* from A,B;
笛卡尔积单独使用的时候是没有意义的,在实际开发中需要获得有意义的结果即需要进行连接查询
select * from A,b where A.A_ID=B.A_ID;
第一张表10条数据
第二张表20条数据
返回结果是200条数据
此处使用的是内连接,将两张表具有相同意义的字段连接起来进行相等匹配,
写法两种
select * from a inner join b on a.id=b.id
select * from a,b where a.id=b.id
第一张表10条数据
第二张表20条数据
返回结果小于200条数据
外连接
外连接分为三种,左外连接,右外连接,全外连接
左外连接;用第一张表的每条记录去匹配第二张表的对应记录,无论是否找到匹配信息,都会显示出第一张表出现的记录的信息,无法找到的信息以null显示。
select *from a left outer join b on a.id=b.id
第一张表10条数据
第二张表20条数据
返回结果为10条数据
右外连接,用第二张表的每条记录去匹配第一张表的对应记录,无论是否找到第二张表出现的记录都会显示
select * from a right outer join b on a.id=b.id
第一张表10条数据
第二张表20条数据
返回结果20条数据
全外连接,左外连接和右外连接的结果和排除掉重复数据
select * from a full outer join b on a.id=b.id;
注意在mysql中不支持全外连接,需要使用union关键字实现全连接效果
select *from a left outer join b on a.id=b.id
union
select * from a right outer join b on a.id=b.id;

关联子查询
将一个查询结果作为第二个查询的条件
查询一个学生表中年龄最大的学员的信息
select * from student where age=(select max(age) from student);
等价于
select max(age) from student;返回最大年龄25
select * from student where age=25
关键字
in/exists当前查询的记录在子查询结果中存在
查询所有成绩小于60的学生
select * from student where id in(select student_id from studentcourse where score<60);
exists实现上面in语句效果
select * fron student where exists(select student_id from studentcourse where score<60 and student_id=studentcourse.student_id);
在实际开发中exists效率要比in高,因为内部使用了关联查询,而in是先将一张表中的查询结果做为另一次查询的条件

any,some,all的用法
some和any的作用相同,
如>any(1,2,3)大于任意一个即可
all作用是全部
>all(1,2,3)大于全部,即大于max最大值
自我比较
select student_id from studentcourse where score >=all(select score from studentcourse);将一张表中的某列数据进行提取作为房地产vklo比较依据,通过该表中每条记录与该列数据的对应比较的得到查询结果,这样的查询方式称为自我比较。
查询编号2课程比编号1课程成绩高的所有学号
select score from studentcourse where course_id=2 and score>any(select score from studentcourse where course_id=1);

union
并集关键字将查询结果进行合并
合并时列名必须一致
合并会排除重复数据
union all不会排除重复数据

原文地址:https://www.cnblogs.com/ss561/p/4638578.html