多个表格查询,
笛卡尔乘积现象;表1有m行,表2 有n行。 结果有m * n行
发生原因在于没有有效的连接条件
如何避免:添加有效的连接条件
方法:分类方法
按照年代分类:sql192标准和sql199标准
功能
内链接:等值连接, 非等值连接,自连接
外连接 :左外,右外,全外
交叉连接
一般语法
SELECT 查询的列表
FROM 表1 别名1,表2 别名2
WHERE 表1.关键词= 表2.关键词;
【and 筛选条件】
【group by 分组字段】
【having 分组后的筛选】
【order by 排序ASC,DESC】
实操:首先你需要选择在两个表格中都存在的一个匹配项目, 就像是excel中的vlookup一样匹配当中的相似内容,这样才能设立连接条件
假设我有一个班级学生个人信息表(stu_info),里面有学号(stu_id),然后我有一张只有学号的期末成绩表(score_count),我需要将这两个表连接起来,显示对应名字(name)和期末成绩(score),操作如下。
SELECT name 姓名,score 期末成绩
FROM stu_info,score_count
WHERE stu_info.'stu_id'=score_count.'stu_id'
# WHERE 姓名.'stu_id'=期末成绩.'stu_id'
可以加筛选选项,或者排序判断等,任何表格的功能都是可以在这个等值查询上面实现的。
多个表的等值连接
跟两个表一样,将需要匹配的内容放在where 语句里面,并列的用and添加,可以添加多个。
非等值连接
非等值连接在于判断where语句的情况,假设有一个按照年龄区分的表格,10-20岁为小,20-35为中,35-60为老,然后我们需要匹配公司的全体员工属于哪一个范围以内的时候,可以采用在非等值连接,大致的程序思路如下。
SELECT age
FROM employees,age_count
WHERE employees BETWEEN age.low_age AND age.high_age;
自连接
自连接顾名思义就是与自己的表进行判断匹配,平时我们可能看到过excel表中间有些内容是把某个属性匹配,比如一个学校有教职员工和学生的总表,学生也有代码教职员工也有自己的编码,学生还会有一个导师编码,这里就可以匹配学生所述的导师姓名
SELECT s.all_id,s.name_id,t.all_id,t.name
FROM all_list s,all_list t
WHERE s.学生导师id = t.老师编号id
【and 筛选】
【group by 分组】
【having 分组后筛选】
【order by asc升序,desc降序】
总结1.多表连接的结果为多表的交集部分
2.n表连接,至少需要n-1个连接条件