联结查询:事先将两张或多张表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对子查询的优化不是特别好,所以建议少用子查询.
现有如下数据库
学生表
班级表
课程表
成绩表
班级表和课程表的对应表
1.交叉连接:
下面的查询结果是200行,是因为students有25行,classes有8行,这样连接相乘关系
2.等值连接,这等值关系为23个而不是25个的原因是,students中有两个ClassID为NULL,这样他和classes中的ClassID就找不到对应关系,所以就忽略了两个
3.如果联结的两张表中有相同的字段,为了以示区分,可以使用db_name.tb_name的方式:如:
4.字段别名
5.左外联结,左边有的右边没有,右边就NULL,以左为准,保留坐标中的每一个元组
6.右外联结,右边有的左边没有,左边就NULL,以右为准,保留右表中的每一个元组
练习:
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;????????
2.显示成绩高于80的同学姓名及课程
3.求前8位同学每位同学自己两门课程的平均成绩,并按降序排列
4.显示每门课程课程名称及学习的同学的个数
5.显示其年龄大于平均年龄的同学的名字
6.显示学习课程为第4门课的同学的名字
7.显示成员数最少为3个的班级的同学中年龄大于同伴同学平均年龄的同学
8.统计各班级中年龄大于全校同学平均年龄的同学
子联结
联合查询:
把两张或两种以上的表的查询结果合并成一个结果进行输出
MySQL视图:视图就是一个虚表,例如在:students中做视图,视图会被当作表来对待,MySQL对视图的支持也很有限,给用户授权视图的方法和给用户表授权的方法是一样的
创建一个视图,只包含StuID,Name,Age,Gender
查看视图状态
查询视图
删除视图