表操作
創(chuàng)建表
CREATE TABLE mytable (
# int 類型屑宠,不為空拂到,自增
id INT NOT NULL AUTO_INCREMENT,
# int 類型帅刊,不可為空走芋,默認(rèn)值為 1全闷,不為空
col1 INT NOT NULL DEFAULT 1,
# 變長字符串類型叉寂,最長為 45 個字符,可以為空
col2 VARCHAR(45) NULL,
# 日期類型总珠,可為空
col3 DATE NULL,
# 設(shè)置主鍵為 id
PRIMARY KEY (`id`));
修改表
添加列
ALTER TABLE mytable
ADD col CHAR(20);
刪除列
ALTER TABLE mytable
DROP COLUMN col;
刪除表
DROP TABLE mytable;
表連接
關(guān)系型數(shù)據(jù)庫屏鳍,一個表就是數(shù)據(jù)之間的關(guān)系,而表與表的關(guān)系連接局服,使得復(fù)雜查詢(query)成為可能钓瞭。
SQL的連接三種:內(nèi)連接、外連接和交叉連接淫奔。
下面以極客時間專欄《SQL 必知必會》的 NBA數(shù)據(jù)庫為例山涡。
內(nèi)連接INNER JOIN
交叉連接 CROSS JOIN
笛卡爾積連接,是SQL92 標(biāo)準(zhǔn)的一種連接方法唆迁,類似 SQL99的CROSS JOIN鸭丛,返回連接的表格的笛卡爾積,返回結(jié)果的行數(shù)等于兩個表行數(shù)的乘積唐责。
查詢語句:
SELECT * FROM player, team;
結(jié)果:
SQL99標(biāo)準(zhǔn)的CROSS JOIN
查詢語句:
SELECT * FROM player CROSS JOIN team;
結(jié)果:
如果一次要 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 標(biāo)準(zhǔn)的「自然連接」。
無需指定等值的字段鼠哥。
SELECT player_id, team_id, player_name, height, team_name
FROM player NATURAL JOIN team;
結(jié)果如下:
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;
結(jié)果:
SQL99標(biāo)準(zhǔn)寫法:
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;
結(jié)果:
自連接
也是內(nèi)連接的一種熟菲,但是「自己」連接「自己」。
比如朴恳,查詢 NBA 數(shù)據(jù)表中身高大于「布雷克-格里芬」的記錄抄罕。
查詢語句:
SELECT b.player_name, b.height
FROM player as a , player as b
WHERE a.player_name = '布雷克-格里芬' and a.height < b.height;
結(jié)果:
查詢語句:
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;
結(jié)果:
外連接(OUTTER JOIN)
左連接
左連接是日常應(yīng)用最廣泛的,右連接較為少見于颖。
查詢語句:
SELECT *
FROM player
LEFT JOIN team on player.team_id = team.team_id;
結(jié)果:
右連接
查詢語句:
SELECT *
FROM player
RIGHT JOIN team on player.team_id = team.team_id;
結(jié)果:
全外連接
FULL JOIN
全外連接的結(jié)果 = 左右表匹配的數(shù)據(jù) + 左表沒有匹配到的數(shù)據(jù) + 右表沒有匹配到的數(shù)據(jù)
查詢語句:
SELECT * FROM player FULL JOIN team ON player.team_id = team.team_id
結(jié)果:
(這句報錯了贞绵,待解決)
Ref:
- 《MySQL必知必會》(Ben Forts)
- 極客時間《SQL必知必會》
- /CyC2018/CS-Notes/SQL.md