SQL92
很强大的功能就是在各个数据表之间连接查询
JOIN在SQL中的作用
五种连接
1.笛卡尔积
笛卡尔积是个数学运算。假设我有两个集合X和Y ,那么X和Y的笛卡尔积就是X和Y的所有可能组合,也就是第一个对象来自于X,第二个对象来自于Y的所有可能
我们假定player表的数据是集合X,先进行SQL查询

SELECT * FROM player

再假定team表的数据为集合Y,同样进行SQL验证

SELECT * FROM  team

接下来是笛卡尔积的调用方式

SELECT * FROM player,team

执行结果

sql server 拼接两个表 sql两张表连接_等值连接

2.等值连接
两张表的等值连接就是用两张表都存在的列进行连接。我们也可以对多张表进行等值连接
而经过我们分析,两张表的等值就是队的ID,因为都存在,我们代码中必须+表名加以区分
所以代码

SELECT player_id,player.team_id,player_name,height,team_name
FROM player,team 
WHERE player.team_id = team.team_id

sql server 拼接两个表 sql两张表连接_自连接_02

3.非等值连接
我们在进行多表查询的时候,如果连接多个表的条件是等号时,就是等值连接,其他的运算符都是非等值连接
PS:我们知道player表中有身高height字段,如果想要知道每个球员的身高的级别,可以采用非等值连接查询

SELECT p.player_id,p.player_name,p.height,h.height_level
FROM player AS p,height_grades AS h
WHERE p.height BETWEEN h.height_lowest AND h.height_highest

运行结果

sql server 拼接两个表 sql两张表连接_等值连接_03

4.外连接(左连接,右连接)
左外连接就是指左边的表是主表,需要显示左边表的全部行,而右侧的表是从表,(+)表示哪个是从表
相当于SQL99的left join

SELECT *  
FROM player team 
WHERE player.team_id = team.team_id(+)
SELECT *  
FROM player  LEFT JOIN team  #显示主表的所有行
ON player.team_id = team.team_id

sql server 拼接两个表 sql两张表连接_自连接_04

右外连接,当然指的是右边的表为主表,显示右表的所有行,左侧的表为从表

SELECT *
FROM player RIGHT JOIN team
ON player.team_id =team.team_id # 显示右表的所有行

sql server 拼接两个表 sql两张表连接_SQL_05

4.自连接
自连接可以对多个表进行操作,也可以对同一个表进行操作。也就是说查询条件使用了当前表的字段
我们想要查看比,布雷克 ·格里芬身高,高的球员都有谁?以及他们的对应身高

SELECT b.player_name ,b.height
FROM player AS a ,player AS b
WHERE a.player_name ='布雷克-格里芬' and a.height < b.height

这段自连接有点怪,搜出那个名字后,直接可以拿他的身高比就可以了
执行结果

sql server 拼接两个表 sql两张表连接_sql server 拼接两个表_06

试着做一道题?
表格中一共有三支球队,那么现在3支球队需要进行比赛,请用SQL语句写出所有可能的比赛组合
分析:根据我的理解,我觉得是笛卡尔积,但是不可能。自己和自己不能比赛
那么是不是能笛卡尔积+左连接
事实证明我上面的分析都是错的!!!!

分主客队

SELECT CONCAT(kedui.team_name,'VS',zhudui.team_name) AS '客队vs主队'
FROM team AS zhudui LEFT JOIN team AS kedui
ON zhudui.team_id<>kedui.team_id

sql server 拼接两个表 sql两张表连接_等值连接_07

不分主客队

SELECT a.team_name ,b.team_name
FROM team AS a,team AS b
WHERE a.team_id<b.team_id

sql server 拼接两个表 sql两张表连接_等值连接_08