- 多表查询
创建两个表
表dep:
表user1:
- 笛卡尔积的形式
SELECT user1.id, user1.username, user1.addr, dep.depName FROM user1, dep;
结果:一共4*7=28条记录,下表未显示全。
2. 内连接的形式
查询两个表中符合连接条件的记录
SELECT 字段名称,…… FROM 表1
INNER JOIN 表2
ON 连接条件;
SELECT u.id, u.username, u.addr, d.depName
FROM user1 AS u
INNER JOIN dep AS d
ON u.depId = d.id;
结果:
3. 外连接的形式
左外连接:先显示左表中的全部记录,再去右表中查询复合条件的记录,不符合的以NULL代替(左右表是以 在关键字LEFT或RIGHT的左右位置来定义的)
SELECT 字段名称,…… FROM 表1
LEFT [OUTER] JOIN 表2
ON 条件;
右外连接:先显示右表中的全部记录,再去左表中查询复合条件的记录,不符合的以NULL代替
SELECT 字段名称,…… FROM 表1
RIGHT [OUTER] JOIN 表2
ON 条件;
多表连接的优点:减少资源的浪费
例:将表中地址为“北京”的都改为“首都”。
创建两个表:
-- 创建新表user
CREATE TABLE IF NOT EXISTS user2(
id TINYINT UNSIGNED NOT NULL AUTO_INCREMENT KEY,
username VARCHAR(20) NOT NULL UNIQUE,
email VARCHAR(50) NOT NULL DEFAULT '124568526@qq.com',
proId TINYINT UNSIGNED NOT NULL
)ENGINE=INNODB, CHARSET=UTF8;
INSERT user2(username, proId) VALUES('a', 1),
('b', 1),
('c', 2),
('d', 3),
('e', 3),
('f', 2);
CREATE TABLE IF NOT EXISTS provinces(
id TINYINT UNSIGNED AUTO_INCREMENT KEY,
proName VARCHAR(10) NOT NULL UNIQUE
)ENGINE=INNODB, CHARSET=UTF8;
INSERT provinces(proName) VALUES('北京'),
('上海'),
('深圳');
连接两表:
-- 查询user id, username provinces proName
SELECT u.id, u.username, p.proName
FROM user2 AS u
JOIN provinces AS p
ON u.proId = p.id;
若想将表中所有的“北京”改为“首都”,只需要修改provinces表中的proName:
UPDATE provinces SET proName = '首都' WHERE id = 1;
结果:
多表连接:
SELECT 表1.字段名称,……,表2.字段名称,……,表3.字段名称
FROM 表1
JOIN 表2
ON 表1与表2连接的条件
JOIN 表3
ON 表1|表2与表3连接的条件
……