MySQL的多表查询和子查询4(笔记)

联结查询:事先将两张或多张表jion,根据join的结果进行查询

交叉联结:如果交叉A表和B表,那查询的结果是数据是A*B行,这种查询大多没用,

自然联结(内联结):A表的每一条记录都在B表中有一条匹配的记录

        等值联结:把两张表的对应字段做等值关联

        条件比较:做条件判断,如:比较的.不过这种用的比较少

外联结:A表的每一条记录不需要在在B表中有一条匹配的记录 

       左外联结:只保留出现在左外联结运算(左边)之前的关系中的元组;

                     语法:left_tb_name LEFT JOIN right_tb_name ON 联结条件

       右外联结:只保留出现在右外联结运算(右边)之后的关系中的元组;

                     语法

       全外联结:MySQL不支持全外联结

自联结:自己联结自己

字段别名和表别名:AS

子查询:在查询中嵌套的查询,可以嵌套WHERE后面,用在WHERE后面的话,如果是用于比较表达式时,他的返回值只能有一个.如果要取多个返回值时,使用EXISTS表示是否存在,如果要判断是否在指定列表中,使用IN.

如果是用在FROM中的子查询:SELECT slias.col,...FROM (SELECT clause) AS alias WHERE clause

注:mysql对子查询的优化不是特别好,所以建议少用子查询.

现有如下数据库

image

学生表

image

班级表

image

课程表

image

成绩表

image

班级表和课程表的对应表

image

1.交叉连接:

下面的查询结果是200行,是因为students有25行,classes有8行,这样连接相乘关系

image

2.等值连接,这等值关系为23个而不是25个的原因是,students中有两个ClassID为NULL,这样他和classes中的ClassID就找不到对应关系,所以就忽略了两个

image

3.如果联结的两张表中有相同的字段,为了以示区分,可以使用db_name.tb_name的方式:如:

image

4.字段别名

image

5.左外联结,左边有的右边没有,右边就NULL,以左为准,保留坐标中的每一个元组

image

6.右外联结,右边有的左边没有,左边就NULL,以右为准,保留右表中的每一个元组

image

练习:

1.显示前5位同学的姓名,课程及成绩

SELECT Name,Course,Score FROM students,courses,coc,scores WHERE students.StuID = coc.ClassID AND coc.CourseID = courses.CourseID AND students.StuID <= 5 AND students.StuID = scores.StuID AND coc.CourseID = scores.CourseID;????????

image

2.显示成绩高于80的同学姓名及课程

image

3.求前8位同学每位同学自己两门课程的平均成绩,并按降序排列

image

4.显示每门课程课程名称及学习的同学的个数

image

5.显示其年龄大于平均年龄的同学的名字

image

6.显示学习课程为第4门课的同学的名字

image

7.显示成员数最少为3个的班级的同学中年龄大于同伴同学平均年龄的同学

8.统计各班级中年龄大于全校同学平均年龄的同学

子联结

image

联合查询:

把两张或两种以上的表的查询结果合并成一个结果进行输出

image

MySQL视图:视图就是一个虚表,例如在:students中做视图,视图会被当作表来对待,MySQL对视图的支持也很有限,给用户授权视图的方法和给用户表授权的方法是一样的

创建一个视图,只包含StuID,Name,Age,Gender

image

查看视图状态

image

查询视图

image

删除视图

image

你可能感兴趣的:(记录)