多表查询:
CREATE TABLE IF NOT EXISTS emp(
idINT UNSIGNED AUTO_INCREMENT KEY,
nameVARCHAR(20) NOT NULL,
ageTINYINT NOT NULL DEFAULT 18,
emailVARCHAR(20) NOT NULL DEFAULT '[email protected]',
depIdTINYINT UNSIGNED NOT NULL
)ENGINE=INNODBCHARSET=UTF8;
create table dep(
id tinyint unsignedauto_increment key,
depName varchar(50) not nullunique,
depDesc varchar(100) not nulldefault ''
)ENGINE=INNODB CHARSET=UTF8;
INSERT INTO dep(depName,depDesc)VALUES('PHP教学部','研发PHP'),
('JAVA教学部','研发JAVA'),
('MySql教学部','研发mysql'),
('GO教学部','研发GO');
INSERT INTOemp(name,age,depId) VALUES('king',22,1),
('queue',21,2),
('jack',25,1),
('mooc',30,3),
('lili',32,3),
('jonh',11,2);
1、 笛卡尔积的形式:
SELECT emp.id,emp.name,emp.age,dep.depNamefrom emp,dep;
2、 内连接的形式:查询两个表中符合连接条件的记录
SELECT 字段名称,… FROM tb_name1
INNER JOIN tb_name2
ON 连接条件;
Eg:SELECT e.name,age,d.depName FROMemp AS e INNER JOIN dep AS d ON e.depId=d.id;
3、 外链接的形式
a) 左外链接:先显示左表中的全部记录,再去右表中查询符合条件的记录,不符合的以NULL代替
SELECT 字段名称,… FROM tb_name1
LEFT OUTER JOIN tb_name2
ON 连接条件;
Eg:SELECT e.name,age,d.depName FROMemp AS e LEFT JOIN dep AS d ON e.depId=d.id;
b) 右外链接:先显示右表中的全部记录,再去左表中查询符合条件的记录,不符合的以NULL代替
SELECT 字段名称,… FROM tb_name1
RIGHTOUTER JOIN tb_name2
ON 连接条件;
Eg:SELECT e.name,age,d.depName FROMemp AS e RIGHT JOIN dep AS d ON e.depId=d.id;
Eg:三表联查:
SELECTs.id, s.productName, s.price, c.cateName, u.username, u.email
FROMshops AS s
JOIN userAS u
ONs.adminId=u.id
JOIN cateAS c
ONs.cateId=c.id;
外键约束(只有INNODB引擎的表支持外键):
子表的外键必须关联父表的主键
创建外键:
1、 建表是指定外键:[CONSTRAINT 外键名称] FOREIGN KEY(字段名称) REFERENCES 主表(字段名称)
Eg:
CREATE TABLE news_cate(
idTINYINT unsigned AUTO_INCREMENT key COMMENT'编号',
cateNameVARCHAR(50) NOT NULL unique COMMENT '分类名称',
cateDescVARCHAR(50) NOT NULL default 'xxx' COMMENT '分类描述'
)ENGINE=INNODB CHARSET=UTF8;
INSERT news_cate(cateName)values('国内新闻'),
('国际新闻'),
('娱乐新闻'),
('体育新闻');
CREATE TABLE news(
id INT unsigned auto_increment key comment '编号',
title varchar(20) not null unique comment '新闻标题',
content varchar(50) not null comment '新闻内容',
cateId tinyint unsigned not null comment '新闻所属分类编号',
CONSTRAINT cateId_fk_newsCate FOREIGN KEY(cateId) REFERENCES news_cate(id)
)ENGINE=INNODB CHARSET=UTF8;
INSERT news(title,content,cateId)values('a1', 'aaa1', 1),
('a2', 'aaa2', 1),
('a3', 'aaa3', 1),
('a4', 'aaa4', 4),
('a5', 'aaa5', 2),
('a6','aaa6', 3);
注意:
1、 子表的外键字段和主表的主键字段要相似,若是数值型要求一致,并且有无符号也要一致;若是字符型,要求类型一致,长度可以不同
2、 如果外键字段没有创建索引,会自动创建
2、 动态创建外键
a) 动态删除外键
ALTERTABLE tb1_name DROP FOREIGN KEY fk_name;
ALTER TABLE news
DROP FOREIGN KEY cateId_fk_newsCate;
b) 动态添加外键
ALTER TABLE tb1_name
ADD [CONSTRAINT外键名称] FOREIGN KEY(外键字段) REFERENCES 主表(主键字段);
ALTER TABLE news
ADD FOREIGN KEY(cateId) REFERENCES news_cate(id);
注意:动态添加外键之前表中的记录一定是合法的记录,不能有脏值,否则添加不成功
3、 外键的约束参照操作:
a) CASCADE----从父表删除或更新,子表也跟着删除或更新
b) SET NULL ----从父表删除或更新,并设置子表的外键列为NULL。
c) NO ACTION | RESTRIC ---拒绝对父表做更新或删除操作
ALTERTABLE news
ADD CONSTRAINT cateId_fk_newsCate FOREIGNKEY(cateId) REFERENCES news_cate(id)
ON DELETE CASCADE ON UPDATE CASCADE;