表的关系
一对一
一对多
多对多
- 创建老师表
- 创建学生表
- 创建学生与老师的关联表——>避免出现大量冗余数据
create table teachers(
id int primary key auto_increment,
name varchar(50)
);
create table students(
id int primary key auto_increment,
name varchar(50)
);
alter table students,teachers character set utf8;
create table tea_stu_rel(
tid int,
sid int,
constraint foreign key(tid) references teachers(id),
constraint foreign key(sid) references students(id)
);
连接查询
笛卡尔集
设A、B是两个非空集合,任给x∈A,y∈B,将它们组成一个有序对(x,y),把这种有序对作为新的元素,这些元素的全体组成一个新的集合,称为集合A与集合B的笛卡儿乘积集合,记作A×B。即A×B={(x,y)|x∈A且y∈B}
例 A={1,2},B={0,1}
A×B={(1,0),(1,1),(2,0),(2,1)},
B×A={(0,1),(0,2),(1,1),(1,2)},
显然,A×B≠B×A。
select * from students,scores; #直接产生笛卡尔集
select * from students,scores where students.id=scores.sid; #通过外键建立联系,输出外键一致的结果
内连接
表后面是跟着的是别名,可用来做简写
select stu.id,stu.name,sc.sid,sc.course,sc.score from students stu inner join scores sc on stu.id=sc.sid;
左连接
左边表的数据全部查出来,而右边表的信息只查询满足条件的数据
select stu.id,stu.name,sc.sid,sc.course,sc.score from students stu left join scores sc on stu.id=sc.sid;
右连接
右边表的数据全部查出来,而左边表只查询满足条件的数据
select stu.id,stu.name,sc.sid,sc.course,sc.score from students stu right join scores sc on stu.id=sc.sid;
多表联查
查询多对多的表关系
表car有2个外键:
select p.name,c.name,c.color,c2.name from car c ,person p ,city c2 where c.pid = p.id and c.cid = c2.id;
select p.name,c.name,c.color,c2.name from car c join person p on c.pid = p.id
join city c2 on c.cid = c2.id;
select e.name,e.salary,d.name,l.grade from employees e,departments d,`level` l
where e.depid=d.id
and e.salary between l.lowSalay and l.highSalay;
子查询
select中还有其它的select
选择和鲁班在同一个经理手下的:
select name,mangerid from employees where mangerid=(select mangerid from employees where name='鲁班');
选择薪资大于售后部所有人的员工信息
select name,salary from employees e
where salary > (select max(salary) from employees e2 where depid=6);
查询(工作、薪资)和妲己相同的员工
select * from employees e where (salary,job) in (select salary,job from employees e where name='妲己');
查询有2个员工及其以上的经理的信息
select * from mangers m where id in
(select group_concat(mangerid) from employees e group by mangerid having count(mangerid)>=2);
查询编号为8的员工的姓名,薪水,部门名称和部门所在地(查询2个表)
select e.name,e.salary,d.name,d.`local` from employees e ,departments d where e.depid = d.id and e.id =8;