目录
Mysql多表连接
绝大多数时用 where 条件
内连接
INNER JOIN(内连接,或等值连接):获取两个表中字段匹配关系的记录。
隐式内连接:select --- from table1,table2 where 条件;
显式内连接: select --- from table1 inner join table2 on 连接条件;
左外连接
LEFT JOIN(左连接):获取左表所有记录,即使右表没有对应匹配的记录。
select dept.deptno,dname,loc,count from dept left join (select deptno,count(ename) as count from emp group by deptno)tmp on tmp.deptno = dept.deptno;
tab01 left join tab02 ... on 条件
右外连接
RIGHT JOIN(右连接): 与 LEFT JOIN 相反,用于获取右表所有记录,即使左表没有对应匹配的记录。
tab01 right join tab02 ... on 条件
Mysql约束
约束用于确保数据库的数据满足特定的商业规则
mysql中约束包括:not null(非空) 、unique(唯一)、primary key(主键)、foreign key(外键)、check(检查)五种不指定为default
1.primary key
用于唯一标识表行的数据,当列定义为主键后,该列就不可以重复
id int primary key --标识id为主键
主键唯一且默认非空
一张表中只能有一个主键,但可以是复合主键
实际开发中。每张表都应设计一个主键
create table tab(
id int,
name
varchar(32),
email varchar(32),
primary key (id,name
) //复合主键:id和name都相同才算重复不能添加
);
2.unique
当一个列被定义unique,该列不可以重复
id int unique id数据唯一
unique字段数据可以为空null,且null可以添加多个,不造成重复
一张表可以有多个unique字段
3.外键
用于定义 主表和从表之间的关系
外键必须定义在从表上,并且主表必须有主键或者unique约束
外键约束的列的数据---必须在主表的主键列存在或者为null(unique约束时)
创建主表
create table my_class(
id int primary key,
name
varchar(32) not null default ''
);
创建从表
create table my_stu(
id int primary key,
name
varchar(32) not null default '',
class_id int,
foreign key(class_id) references my_class(id)
);
主键列和外键列数据要都存在,否则添加失败
表的存储引擎要为Innodb,这样表才支持外键
外键删除行为:
no action:删除/更新父表时检查父表中字段是否有对应外键,如果有,不可删除
restrict:删除/更新父表时检查父表中字段是否有对应外键,如果有,不可删除(与no action一致)
cascade:删除/更新父表时检查父表中字段是否有对应外键,如果有,则也更新/删除外键在子表中的记录
set null:删除/更新父表时检查父表中字段是否有对应外键,如果有,则将外键在子表中的记录设置为null (要求子表该字段允许为null)
set default:父表有变更时,子表将外键所在列设置为一个默认值(InnoBD不支持)
例:alter table 表名 add constraint 外键名称 foreign key 外键列 references 父表(列名) on update cascade on delete cascade;//外键删除和更新行为
4.check约束
sql5.7不支持check,只做语法校验,但不会生效,oracle,sql server 生效
sal double CHECK (sal > 1000 and sal < 2000)
create table customer(
customer_id int,name
varchar(32),address varchar(32),email varchar(32),sex enum('男','女') not null,card_id varchar(32),primary key(customer_id));
create table purchase(order_id int primary key,customer_id int not null,goods_id int not null,nums int not null default 0,foreign key (customer_id) references customer(customer_id),foreign key (goods_id) references goods(goods_id));
自增长
存在某一列,从添加记录时,自动增长
字段名 数据类型 primary key auto_increment
insert into ***(字段1,字段2...) values (null,'值') 为空是时填null 会自动增长
insert into *** (字段2,字段3...)valuees('值1','值2',...);不写自增长的字段
insert into *** values('null','值1','值2',....) ;也会自动增长
create table autocre(
-> id int primary key auto_increment, -> email varchar(32) not null default '', -> `name` varchar(32) not null default '');
insert into autocre values(null,'thank@qq.com','thank');
insert into autocre values(null,'mike@qq.com','mike');
insert into autocre (email,name
) values('jxs@qq.com','jxs');
自增长字段一般和unique或primary key配合使用
自增长修饰的字段为整数型(小数极少使用)
自增长默认从1开始,想要默认其他值开始可以使用 : alter table 表名 auto_increment = 值
字段自增长也可以指定值
insert into autocre values(null,'thank@qq.com','thank'); //第一次插入数据,默认自增长为1
insert into autocre values(200,'mike@qq.com','mike'); //指定了200,该字段为200
insert into autocre (email,name
) values('jxs@qq.com','jxs'); //默认从上一个最大的id开始算,现在id=201
不过一般来说,指定自增长的字段,就按照自增长的规则添加数据,不再指定值。