zoukankan      html  css  js  c++  java
  • 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不会排除重复数据

  • 相关阅读:
    codeforces #313(div 2)
    云计算设计模式(二十四)——仆人键模式
    封装一个ViewPager真正的实现图片无限循环滚动带导航点
    HDU4622:Reincarnation(后缀数组,求区间内不同子串的个数)
    数据库分页
    [Swift]LeetCode728. 自除数 | Self Dividing Numbers
    [Swift]LeetCode726. 原子的数量 | Number of Atoms
    [Swift]LeetCode725. 分隔链表 | Split Linked List in Parts
    [Swift]LeetCode724. 寻找数组的中心索引 | Find Pivot Index
    [Swift]LeetCode722. 删除注释 | Remove Comments
  • 原文地址:https://www.cnblogs.com/ss561/p/4638578.html
Copyright © 2011-2022 走看看