SQL有两个主要的标准,分别是SQL92和SQL99。92和99代表了标准提出的时间,SQL92就是92年提出的标准规范。除了SQL92和SQL99以外,还有其他的标准。
最重要的SQL标准就是SQL92和SQL99。一般来说SQL92的形式更简单,但是写的SQL语句会比较常,可读性较差。而SQL99相比于SQL92来说,语法更加复杂,但可读性高。
相比于SQL99,SQL92规则更简单,更适合入门。
陈旸老师创建的NBA球员和球队两张表,SQL文件可以从GitHub上下载。
player表为球员表,一共有37个球员
team表为球队表,一共有3支球队
a.笛卡尔积
b.等值连接
c.非等值连接
d.外连接(左连接、右连接)
e.自连接
笛卡尔积
实例:
-- 假定player表的数据是集合X,进行SQL查询
SELECT * FROM play;
-- 假定team表的数据为集合Y,进行SQL查询
SELECT * FROM team;
两张表的笛卡尔积的结果
SELECT * FROM play, team;
查询结果(111条记录)
笛卡尔积也称为交叉连接,英文是CROSS JOIN,它的作用就是可以把任意表进行连接,即使这两张表不相关。
等值连接
两张表的等值连接就是用两张表中都存在的列进行连接。
实例:
SELECT player_id, player.team_id, player_name, height, team_name FROM player, team WHERE player.team_id = team.team_id;
查询结果
进行等值连接的时候,可以使用表的别名,这样会让SQL语句更简洁。
SELECT player_id, a.team_id, player_name, height, team_name FROM player AS a, team AS b
WHERE a.team_id = b.team_id;
注:如果使用了表的别名,在查询字段中就只能使用别名进行代替,不能使用原有的表名。
进行多表查询的时候,如果连接多个表的条件是等号时,就是等值连接,其他的运算符连接就是非等值查询。
创建一个身高级别表height_grades
player表中有身高height字段,如果想要每个球员的身高的级别,可以采用非等值连接查询。
SELECT p.player_name, p.height, h.height_level
FROM play AS p, height_grades AS h
WHERE p.height BETWEEN h.height_lowest AND h.height_highest;
除了查询满足条件的记录以外,外连接还可以查询某一方不满足条件的记录。两张表的外连接,会有一张是主表,另一张是从表。
在SQL92中采用(+)代表从表所在的位置,而且在SQL92中,只有左外连接和右外连接,没有全外连接。
-- 左连接,就是左边的表是主表,而右侧的表是从表,(+)表示哪个是从表
SELECT * FROM player, team
WHERE player.team_id = team.team_id(+);
相当于SQL99中的
SELECT * FROM player LEFT JOIN team on player.team_id = team.team_id;
右外连接
SELECT * FROM player, team
WHERE player.team_id(+) = team.team_id;
相当于SQL99中的
SELECT * FROM player RIGHT JOIN team
on player.team_id = team.team_id;
注:LEFT JOIN和RIGHT JOIN只存在于SQL99及以后的标准中,在SQL92中不存在,只能用(+)表示。
自连接可以对多个表进行操作,也可以对用一个表进行操作。也就是查询条件使用了当前的字段。
实例:
SELECT b.player_name, b.height FROM player as a, player as b
WHERE a.player_name = '布雷克-格里芬' and a.height < b.height;
查询结果(6条记录)
如果不用自连接的话,需要采用两次SQL查询。
首先需要查询布雷克·格里芬的身高
SELECT height FROM player
WHERE player_name = '布雷克-格里芬';
查询结果:2.08
然后再查询比2.08高的球员都有谁,以及他们的对应身高
SELECT player_name, height FROM player
WHERE height > 2.08;
查询结果和自连接的结果一致