MySQL基础---连接查询(等值连接与非等值连接)

多个表格查询,

笛卡尔乘积现象;表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个连接条件

你可能感兴趣的:(SQL学习,sql)