表操作
创建表
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