数据库笔记-SQL表连接

表操作

创建表

CREATE TABLE mytable (
  # int 类型,不为空,自增
  id INT NOT NULL AUTO_INCREMENT,
  # int 类型,不可为空,默认值为 1,不为空
  col1 INT NOT NULL DEFAULT 1,
  # 变长字符串类型,最长为 45 个字符,可以为空
  col2 VARCHAR(45) NULL,
  # 日期类型,可为空
  col3 DATE NULL,
  # 设置主键为 id
  PRIMARY KEY (`id`));

修改表

添加列

ALTER TABLE mytable
ADD col CHAR(20);

删除列

ALTER TABLE mytable
DROP COLUMN col;

删除表

DROP TABLE mytable;

表连接

关系型数据库,一个表就是数据之间的关系,而表与表的关系连接,使得复杂查询(query)成为可能。

SQL的连接三种:内连接、外连接和交叉连接

下面以极客时间专栏《SQL 必知必会》的 NBA数据库为例。

内连接INNER JOIN

交叉连接 CROSS JOIN

笛卡尔积连接,是SQL92 标准的一种连接方法,类似 SQL99的CROSS JOIN,返回连接的表格的笛卡尔积,返回结果的行数等于两个表行数的乘积。

查询语句:

SELECT * FROM player, team;

结果:


SQL99标准的CROSS JOIN

查询语句:

SELECT * FROM player CROSS JOIN team;

结果:


如果一次要 CROSS JOIN连接多个表,写法如下:

SELECT * 
FROM t1 CROSS JOIN t2 
CROSS JOIN t3;

等值连接(自然连接)

查询语句:

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

使用别名的写法:

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;

等同于SQL99 标准的「自然连接」。
无需指定等值的字段。

SELECT player_id, team_id, player_name, height, team_name 
FROM player NATURAL JOIN team;

结果如下:

ON连接写法:

SELECT player_id, player.team_id, player_name, height, team_name 
FROM player JOIN team ON player.team_id = team.team_id;

非等值连接

查询语句:

SELECT 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;

结果:


SQL99标准写法:

SELECT p.player_name, p.height, h.height_level
FROM player as p JOIN height_grades as h
ON height BETWEEN h.height_lowest AND h.height_highest;

结果:

自连接

也是内连接的一种,但是「自己」连接「自己」。
比如,查询 NBA 数据表中身高大于「布雷克-格里芬」的记录。
查询语句:

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

结果:

查询语句:

SELECT b.player_name, b.height 
FROM player as a JOIN player as b ON a.player_name = '布雷克-格里芬' and a.height < b.height;

USING 连接

查询语句:

SELECT player_id, team_id, player_name, height, team_name 
FROM player JOIN team USING(team_id);

ON 连接

查询语句:

SELECT player_id, player.team_id, player_name, height, team_name 
FROM player JOIN team ON player.team_id = team.team_id;

结果:


外连接(OUTTER JOIN)

左连接

左连接是日常应用最广泛的,右连接较为少见。
查询语句:

SELECT * 
FROM player 
LEFT JOIN team on player.team_id = team.team_id;

结果:


右连接

查询语句:

SELECT * 
FROM player 
RIGHT JOIN  team on player.team_id = team.team_id;

结果:


全外连接

FULL JOIN

全外连接的结果 = 左右表匹配的数据 + 左表没有匹配到的数据 + 右表没有匹配到的数据

查询语句:

SELECT * FROM player FULL JOIN team ON player.team_id = team.team_id

结果:

(这句报错了,待解决)

Ref:

  • 《MySQL必知必会》(Ben Forts)
  • 极客时间《SQL必知必会》
  • /CyC2018/CS-Notes/SQL.md

你可能感兴趣的:(数据库笔记-SQL表连接)