四.多表联查

使用的表结构
CREATE TABLE teacher(
tid int(11) PRIMARY key auto_increment,
tname VARCHAR(20) UNIQUE,
tsex varchar(1) not null,
tphone varchar(11) ,
tcourse varchar(10)
);
CREATE TABLE class(
cid int(11) PRIMARY key auto_increment,
cname varchar(10),
cinfo varchar(255),
tid int(11) not null
);
CREATE TABLE garde (
tid int(6) NOT NULL,
math double(6,2) DEFAULT NULL,
english double(6,2) DEFAULT NULL,
chinese double(6,2) DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin;

1.多表查询
A.交叉连接
交叉连接不带WHERE 子句,它返回被连接的两个表所有数据行的笛卡尔积,返回到结果集合中的数据行数等于第一个表中符合查询条件的数据行数乘以第二个表中符合查询条件的数据行数。

SELECT *from teacher,class;

B.内连接
内连接查询操作列出与连接条件匹配的数据行,它使用比较运算符比较被连接列的列值。内连接分三种:等值连接、自然连接、不等连接;最常见的是等值连接。
1.等值连接:连接规则由“=”号组合而成并且列出所有查询的字段()。
2. 自然连接:在等值连接的基础上,查询出需要的字段,将(
)替换为需要显示的字段。
3. 不等值连接:连接规则由等号以外的运算符组成。>,=,<,>=,<=,<>,!=,between等。

– 内鏈接 inner join on
等值连接
select *from teacher t inner join class c on t.tid=c.tid
自然连接
select t.tid,t.tname,t.tgrad,c.cid,c.cinfo from teacher t inner join class c on t.tid=c.tid
不等值连接
select t.tid,t.tname,t.tgrad,c.cid,c.cinfo from teacher t
inner join class c on t.tid=c.tid where t.tid>1001
C.外连接
– 左外链接 显示所有的左表数据,右表只显示匹配信息
SELECT *from teacher t LEFT JOIN class c on t.tid=c.tid
– 右外链接 显示所有的右表数据,左表只显示匹配信息
SELECT *from teacher t right JOIN class c on t.tid=c.tid
D.全连接
– 全连接 左右两表的数据全都显示 没有匹配的数据将用null填充
SELECT *from teacher t LEFT JOIN class c on t.tid=c.tid UNION
SELECT *from teacher t right JOIN class c on t.tid=c.tid
2.子查询

– 子查询(注意子查询语句 查询的结果要和 主查询语句 条件相当)
SELECT tname from teacher t1 where t1.tid=(SELECT tid from class where cid=1)
3.聚合函数及分组统计
聚合函数 avg()平均值 count()行数 max()最大值 min()最小值 sum()总和 都是针对一列 – NULL不做计算

SELECT AVG(tgrad) as 平均分 from teacher
– 注意null不算在内
SELECT count(tgrad) 总人数 from teacher
SELECT max(tgrad) 最大值 from teacher
SELECT min(tgrad) 最小值 from teacher
– null不算在内
SELECT sum(tgrad) 总和 from teacher

– 查询表里面有多少条数据
SELECT count(*) from teacher where tsex=‘女’
4.group by—分组查询

– 分组查询 group by 字段 having 条件 order by 排序 concat()
– group by 只显示第一条其他的被合并了 group_concat(tname)与group by一起使用 以逗号隔开 展示所有的数据
SELECT tsex,group_concat(tname) from teacher group by tsex
– group by 一般和聚合函数一起使用
select tsex,sum(tgrad) from teacher group by tsex
– having 必须与group by 一起使用(注意 无论是group by 后面的列 还是会having后面的列 都必须在select 后面写出来)
SELECT tid,tsex,tgrad,avg(tgrad) from teacher group by tsex having tgrad>avg(tgrad);
5.对一行数据查询的总分
– sum(math+english+chinese) 单独使用那么查询一张表的总分
SELECT tid,sum(math+english+chinese)from garde
– sum(math+english+chinese) 与where一起使用那么查询一个id的总分
SELECT tid,sum(math+english+chinese)from garde where tid=1001
– sum(math+english+chinese) 与group by一起使用那么查询每个id的总分
SELECT tid,sum(math+english+chinese)from garde group by
– 查询一行的数据总和
SELECT tid,math+english+chinese from garde
SELECT tid,sum(math+english+chinese)from garde group by

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值