目录
MySQL表与表之间的三种关系 |
---|
一对多关系:最常见的关系:学生对班级 , 员工对部门 |
多对多关系:学生与课程 , 用户与角色 |
一对一关系:使用较少,因为一对一关系可以合成为一张表 |
一个学生对应一个身份证号码
一个部门可以有多名员工,但一个员工只能归于一个部门 在多的一方建立外外键指向一的一方
下表为多对多关系,由下表可知多对多关系的中间表至少需要2个外键
格式: constraint <外键名> foreign key 字段名[,字段名2,…] references <主表名> 主键列1 [,主键列2,…]
方式一 创建表时添加外键
create table if not exists emp( eid varchar(20) primary key , -- 员工编号
ename varchar(20), -- 员工名字
age int, -- 员工年龄
dept_id varchar(20), -- 员工所属部门
constraint emp_fk foreign key (dept_id)references dept (deptno) –- 外键约束
);
方式二 修改表添加外键
altertable <数据表名> add constraint <外键名> foreign key(<列名>) references <主表名> (<列名>);
-- 创建部门表
create table if not existsdept2( deptno varchar(20) primary key , -- 部门号
name varchar(20) -- 部门名字 ); -- 创建员工表
create table if not exists emp2( eid varchar(20) primary key , -- 员工编号
ename varchar(20), -- 员工名字
age int, -- 员工年龄
dept_id varchar(20) -- 员工所属部门
;
-- 创建外键约束
alter table emp2 add constraint dept_id_fk foreign key(dept_id)references dept2 (deptno);
• 交叉连接查询返回被连接的两个表所有数据行的笛卡尔积
• 笛卡尔积 可以理解为一张表的每一行去和另外一张表的任意一行进行匹配
• 假如 A 表有 m 行数据, B 表有 n 行数据,则返回 m*n 行数据
• 笛卡尔积会产生很多冗余的数据,后期的其他查询可以在该集合的基础上进行条件筛选
select * from 表1,表2,表3….;
-- 查询每个部门的所属员工
select * from dept3,emp3 where dept3.deptno = emp3.dept_id;
select * from dept3 inner join emp3 on dept3.deptno = emp3.dept_id;
子查询就是指的在一个完整的查询语句之中,嵌套若干个不同功能的小查询,从而一起完成复杂查询的一种编写形式,通俗一点就是包含select嵌套的查询。
返回的数据类型
ALL
select …from …where c > all(查询语句)
--等价于:
select ...from ... where c > result1 and c > result2 and c > result3...
ANY/SOME
•ANY:与子查询返回的任何值比较为true 则返回true •ANY可以与=、>、>=、<、<=、<>结合是来使用,分别表示等于、大于、大于等于、小于、小于等于、不等于其中的其中的任何一个数据。 •表示制定列中的值要大于子查询中的任意一个值,即必须要大于子查询集中的最小值。同理可以推出其它的比较运算符的情况。 •SOME和ANY的作用一样,SOME可以理解为ANY的别名
select …from …where c > any(查询语句)
--等价于:
select ...from ... where c > result1 or c > result2 or c > result3...
IN
select …from …where c > in(查询语句)
--等价于:
select ...from ... where c > result1 or c > result2 or c > result3...
EXISTS
select …from …where exists(查询语句)
自关联.:自关联的基本含义就是 自己join自己,用一张表搞定多张表可以达到的效果. 需要注意的是,当表自关联的时候,需要使用 as 起别名,防止关联的时候引发重名的问题。
select. *. from. areas as p. inner join areas as c on c.cid=p.pid