外键:用于约束主表与从表之间的关联关系
# 主表 父表
create table dep(
depid int unsigned primary key auto_increment,
depname varchar(20)
);
# 从表 子表
create table emp(
empid int primary key auto_increment,
empname varchar(20) not null,
empaddress varchar(50),
did int not null
);
# 外键索引(外键约束) foreign key
# 外键 用于约束主表与从表之间的关联关系
alter table emp add constraint FK_did foreign key(did) references dep(depid);
# 删除外键 mysql在帮我们创建外键索引的同时 还帮我们创建了一个普通索引 所以 我们也要把普通索引删除掉
alter table emp drop foreign key FK_did;
# 普通索引的名字与外键索引的名字相同
# 删除普通索引
alter table emp drop index FK_did;
create table grade (
gid int primary key auto_increment,
gname varchar(20) not null
);
create table student (
stuid int primary key auto_increment,
stuname varchar(20) not null,
stuaddress varchar(50) ,
stuage int ,
gradeid int not null,
constraint FK_gradeid foreign key(gradeid) references grade(gid)
);
# 实际开发中不是用物理外键
# 如果需要两个表产生关联关系 我们可以使用"逻辑外键"
# 因为在分布式开发场景中 我们通常需要分库分表 而外键是无法分库分表的
# #添加 insert
# 方式1
insert into dep(depid,depname) values(4,'人事部');
# 方式2
insert into dep(depname) values('技术部');
insert into emp(empname,did) values('小沈阳',2);
# 方式3 可以不指定列名 直接添加 values小括号中的值必须与原表中列的顺序保持一致
# 注意:insert into dep values('营销部',7); 会报错 因为顺序不一致
insert into dep values(6,'市场部');
# 方式4 一次添加多条数据
insert into dep(depname) values('后勤部'),('安保部'),('宣传部');
# # 修改 update
update dep set depname = '人力资源部' where depid = 4;
update emp set empaddress = '铁岭' where empname = '赵四';
update emp set empaddress = '象牙山',empname = '尼古拉斯·赵四' where empid = 1;
update emp set empage = empage + 20 where empage = 22 and empname = '大拿';
update emp set empname = '赵四';
# #删除 DELETE
delete from dep where depid = 1;
delete from emp where empname = '赵四' && empage = 22;
delete from emp where empname = '广坤' or empaddress = '铁岭';
delete from emp;
# 删除的三种方式:
#1# drop table 表名----删除数据、删除表结构
drop table city;
#2# truncate table 表名
truncate table city;# 删除整个表数据 不影响表结构 索引 约束 会清空主键的编号
#3# delete from 表名
delete from city; # 删除数据 不影响表结构 索引 约束 删除以后不会清空主键的编号
# drop > truncate > delete
# 查询所有 * 代表所有列
select * from emp;
# 指定查询其中某些列
select empname from emp;
select empname,empage from emp;
# as 关键字 * 实现 给列 或者 表 取别名
# as 关键字可以省略不写
# 给列取别名
select empname as '员工姓名',empage as '员工年龄' from emp;
# 给表取别名
select e.empname,e.empage from emp as e;
select distinct empsex from emp;
# 查询后加上 where条件
select * from emp;
# 查询年龄为20的人 信息
select * from emp where empage = 20;
# 查询年龄为25 并且性别为男的人信息
select * from emp where empsex = '男' and empage = 25;
# 查询年龄为26 或者 地址为象牙山的人信息
select * from emp where empage = 26 or empaddress = '象牙山';
# 查询地址不为null的人的信息
# is null 查询为null
# is not null 查询不为null的
select * from emp where empaddress is null;
# 以下两条语句功能相同
select * from emp where empage between 25 and 27;
select * from emp where empage>= 25 and empage<=27;
#1# % 表示匹配 '0个'或者'n个' 任意字符
# 查询名字中带 '四' 的人信息
select * from emp where empname like '%四%';
# 查找名字以 '四' 结尾的人的信息
select * from emp where empname like '%四';
# 查找名字以 '四'开头的人的信息
select * from emp where empname like '四%';
#2# _ 一个下划线表示一个任意字符
# 查找名字以 '四' 开头 名字一共两个字符的人的信息
select * from emp where empname like '四_';
# 查找名字以 '四' 开头 名字一共三个字符的人的信息
select * from emp where empname like '四__';
# 在WHERE子句中使用IN进行范围查询
# SELECT 字段列1,字段2 ,…
# FROM 表名
# WHERE 字段x
# IN ( 值1,值2,值3…)
#1.查询的字段x的值,至少与括号中的一个值相同
#2.多个值之间用英文逗号隔开
#普通处理方式
SELECT * FROM subject
where ClassHour = 100 OR ClassHour =110 OR ClassHour = 120;
#使用IN进行查询方式,更为简洁,效率更高
SELECT * FROM subject
where ClassHour IN ( 100,110,120 );
1.NULL代表 ‘无值’
2.区别于零值0和空符串""
3.只能出现在定义允许为NULL的字段
4.须使用 is null 或者 is not null 比较操作符去比较
select [all | distinct]
{ * | table.* | [table.field1 [as alias1] [,table.field2[as alias2]][,…]] }
from table_name [as table_ alias ]
[left|out|inner join table_name2 ] #联合查询
[where …] #指定结果需满足的条件
[group by …] #指定结果按照哪几个字段来分组
[having …] #过滤分组的记录必须满足的次要条件
[order by …] #指定查询记录按一个或者多个条件排序
[limit {[offset,] row_count|row_count offset offset} ];
#指定查询的记录从哪条至哪条
select * from emp;
#1# 两表等值连接查询: 取交集
select * from emp,dep where emp.did = dep.depid;
select e.empname as '姓名',e.empage '年龄',e.empsex '性别',d.depname '部门'
from emp as e,dep as d
where e.did = d.depid;
#2# 内连接查询 inner join 取交集
select * from emp inner join dep on emp.did=dep.depid;
select e.empname as '姓名',e.empage '年龄',e.empsex '性别',d.depname '部门'
from emp inner join dep on emp.did=dep.depid;
# 左连接 左外连接:left join
# 以左边的表为主表:取交集。如果不匹配左边表的数据 以null填充
SELECT * FROM emp
LEFT JOIN dep ON emp.did = dep.depid;
# 右连接 右外连接:right join
# 以右边的表为主表:取交集。如果不匹配匹配的项 以null填充
SELECT * FROM emp RIGHT JOIN dep ON emp.did = dep.depid;
# 三表连接
select emp.empname,emp.empage,emp.empsex,city.cityname,dep.depname
FROM emp,city,dep
WHERE emp.did = dep.depid
AND emp.cid = city.cityid;
# inner join
select emp.empname,emp.empage,emp.empsex,city.cityname,dep.depname
from city
inner join emp on city.cityid = emp.cid
inner join dep on emp.did = dep.depid;
# 自连接 (自己与自己连接) 将一个表 作为两张表来使用
# 查询出每个课程所对应的专业
select * from course;
select c1.profession,c2.cname
from course as c1 ,course as c2
where c1.cid = c2.profession;
select c1.profession,c2.cname
from course as c1
inner join course as c2 on c1.cid = c2.profession;
#右连接
select c1.profession,c2.cname
from course as c1
right join course as c2 on c1.cid = c2.profession;