联结查询:事先将两张或多张表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
查看视图状态
查询视图
删除视图