Mysql Sql使用二:数据操作(多表)

数据库的设计

一对多

在多方需要添加一个字段,并且和一放主键的类型必须是相同的。把该字段作为外键指向一方的主键。
eg:生活中一个部门下有多个员工,一个员工属于一个部门。

多对多

拆开两个一对多的关系,中间创建一个中间表,至少有两个字段。作为外键指向两个多对多关系表的主键。
eg:学生可以选择多门课程,课程又可以被多名学生选择。

一对一

  • 建表原则
    • 主键对应
    • 唯一外键对应
      eg:公司,地址,一个公司对应的是一个地址。

多表操作

外键约束

有一个部门的表,还有一个员工表。

create table dept(
    did int primary key auto_increment,
    dname varchar(30)
);

create table emp(
    eid int primary key auto_increment,
    ename varchar(20),
    salaly double,
    dno int
);

insert into dept values(null,'研发部');
insert into dept values(null,'销售部');
insert into dept values(null,'人事部');
insert into dept values(null,'扯淡部');
insert into dept values(null,'牛宝宝部');

insert into emp values(null,'班长',10000,1);
insert into emp values(null,'美美',10000,2);
insert into emp values(null,'小凤',10000,3);
insert into emp values(null,'如花',10000,2);
insert into emp values(null,'芙蓉',10000,1);
insert into emp values(null,'东东',800,null);
insert into emp values(null,'波波',1000,null);

把研发部删除?
研发部下有人员?该操作不合理。
引入外键约束?
外键作用:保证数据的完整性。
添加外键
语法:alter table emp add foreign key 当前表名(dno) references 关联的表(did);

alter table emp add foreign key emp(dno) references dept(did);

多表查询

笛卡尔积的概念

表A
aidaname
a1aa1
a2aa2
表B
bidbname
b1bb1
b2bb2
b3bb3

查询的语法
select * from 表A,表B; 返回的结果就是笛卡尔积。
结果:
a1 aa1 b1 bb1
a1 aa1 b2 bb2
a1 aa1 b3 bb3
a2 aa2 b1 bb1
a2 aa2 b2 bb2
a2 aa2 b3 bb3

多表查询

内连接
  • 普通内连接
    提交关键字 inner join … on
select * from dept inner join emp on dept.did = emp.dno;
  • 隐式内连接(用的是最多的)
    可以不使用inner join … on关键字
select * from dept,emp where dept.did = emp.dno;
外连接
  • 左外链接
    (看左表,把左表所有的数据全部查询出来)
    使用关键字left [outer] join … on
select * from dept left outer join emp on dept.did = emp.dno;
  • 右外链接
    看右表,把右表所有的数据全部查询出来
    使用关键字 right [outer] join … on
select * from dept right join emp on dept.did = emp.dno;

子查询

查询的内容需要另一个查询的结果。
select * from emp where ename > (select * from emp where 条件);
这里写图片描述


例:

create table dept(
    did int primary key auto_increment,
    dname varchar(30)
);

create table emp(
    eid int primary key auto_increment,
    ename varchar(20),
    salaly double,
    dno int
);

查看所有人所属的部门名称和员工名称?

select dept.dname,emp.ename from dept,emp where dept.did = emp.dno;
    select d.dname,e.ename from dept d,emp e where d.did = e.dno;

统计每个部门的人数(按照部门名称统计,分组group by count)

select d.dname,count(*) from dept d,emp e where d.did = e.dno group by d.dname;

统计部门的平均工资(按部门名称统计 ,分组group by avg)

select d.dname,avg(salaly) from dept d,emp e where d.did = e.dno group by d.dname;

统计部门的平均工资大于公司平均工资的部门(子查询)
公司的平均工资

select avg(salaly) from emp;

部门的平均工资

select d.dname,avg(e.salaly) as sa from dept d,emp e where d.did = e.dno group by d.dname having sa > (select avg(salaly) from emp);
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值