SQL语法基础篇 —— 常用的SQL标准

常用的SQL标准


SQL有两个主要的标准,分别是SQL92和SQL99。92和99代表了标准提出的时间,SQL92就是92年提出的标准规范。除了SQL92和SQL99以外,还有其他的标准。

最重要的SQL标准就是SQL92和SQL99。一般来说SQL92的形式更简单,但是写的SQL语句会比较常,可读性较差。而SQL99相比于SQL92来说,语法更加复杂,但可读性高。

在SQL92中式如何使用连接的

相比于SQL99,SQL92规则更简单,更适合入门。

陈旸老师创建的NBA球员和球队两张表,SQL文件可以从GitHub上下载。

player表为球员表,一共有37个球员
SQL语法基础篇 —— 常用的SQL标准_第1张图片
team表为球队表,一共有3支球队
SQL语法基础篇 —— 常用的SQL标准_第2张图片

SQL92中的5中连接方式

a.笛卡尔积
b.等值连接
c.非等值连接
d.外连接(左连接、右连接)
e.自连接

笛卡尔积

实例:

-- 假定player表的数据是集合X,进行SQL查询
SELECT * FROM play;
-- 假定team表的数据为集合Y,进行SQL查询
SELECT * FROM team;

两张表的笛卡尔积的结果

SELECT * FROM play, team;

查询结果(111条记录)
SQL语法基础篇 —— 常用的SQL标准_第3张图片
笛卡尔积也称为交叉连接,英文是CROSS JOIN,它的作用就是可以把任意表进行连接,即使这两张表不相关。

等值连接

两张表的等值连接就是用两张表中都存在的列进行连接。

实例:

  • 针对player表和team表都存在team_id这一列
SELECT player_id, player.team_id, player_name, height, team_name FROM player, team WHERE player.team_id = team.team_id;

查询结果
SQL语法基础篇 —— 常用的SQL标准_第4张图片
进行等值连接的时候,可以使用表的别名,这样会让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
SQL语法基础篇 —— 常用的SQL标准_第5张图片
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;

查询结果
SQL语法基础篇 —— 常用的SQL标准_第6张图片

外连接

除了查询满足条件的记录以外,外连接还可以查询某一方不满足条件的记录。两张表的外连接,会有一张是主表,另一张是从表。

在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语法基础篇 —— 常用的SQL标准_第7张图片
如果不用自连接的话,需要采用两次SQL查询。

首先需要查询布雷克·格里芬的身高

SELECT height FROM player
WHERE player_name = '布雷克-格里芬';

查询结果:2.08

然后再查询比2.08高的球员都有谁,以及他们的对应身高

SELECT player_name, height FROM player
WHERE height > 2.08;

查询结果和自连接的结果一致

小结

SQL语法基础篇 —— 常用的SQL标准_第8张图片

你可能感兴趣的:(sql,数据库)