2020-08-10

2020-08-10
mysql

竖向拼接(联合查询):

union :将俩表数据联合输出,去除重复数据
union all:将俩表的数据全部输出,无论重复不重复

使用注意事项:
1)要拼接的俩虚拟表的字段数量要一致
2)要拼接的拉虚拟表字段的数据类型要一致
表a
在这里插入图片描述
表b
在这里插入图片描述

SELECT a.aid,a.aname FROM a UNION ALL SELECT b.bid,b.bname FROM b;

运行结果:
在这里插入图片描述

连接查询 - 横向拼接

内连接
SELECT 字段1,字段2,... FROM 表1 INNER JOIN 表2 ON 表1.字段 = 表2.字段;
说明:on后的字段是 俩表关联关系字段
特点:
1)将俩表数据横向拼接在一张虚拟表中
2)只会保留on后关联的数据,其他不保留
3)如果没有on后的条件,会出现[笛卡尔积],即出现一些不符合需求的数据,
所以一定要有on后的条件,过滤掉其他数据
简写格式

SELECT 字段1,字段2,...FROM1,2 WHERE2.字段 =1.字段;
-- 内连接
SELECT * FROM sty INNER JOIN class ON stu.id = class.cid;
-- 简化写法
SELECT * FROM stu,class WHERE stu.cid = class.cid;
-- 使用别名
SELECT * FROM stu s,class c WHERE s.cid = c.cid;
-- 查询学生id,姓名,班级名称和地址
SELECT
	s.sid,
	s.sname,
	s.cid,
	c.caddress
FROM
	stu s,
	class c
WHERE
	s.cid = c.cid;

– 查询成绩大于60的学生id,姓名,成绩,班级名称和地址,并按照班级编号排序

SELECT
	s.sid,
	s.sname,
	s.cid,
	c.caddress
FROM
	stu s,
	class c
WHERE
	s.cid = c.cid
AND s.score > 60
ORDER BY
	cid;

stu表
在这里插入图片描述
class表
在这里插入图片描述

外连接
内连接是只保留符合on后关联田间的数据,但是这样会损失一些数据.
比如class表的[5 UI 106]
外连接就可以实现 保留某些部分和on后关联条件的数据

– 外连接 :保留某些不符合on后关联条件的数据
– 左外连接:

SELECT * FROM1 LEFT OUTER JOIN21.字段 =2.字段;

关键词左侧[表1]中如果没有数据不满足on后的条件,也可以保留
右外连接

SELECT * FROM1 RIGHT OUTER JOIN2 on1.字段 =2.字段;

关键词右侧表[表2]中如果没有数据不满足on后的条件,也可以保留

-- 左外连接
SELECT * FROM stu s LEFT OUTER JOIN class c on s.cid = c.cid;
-- 右外连接
SELECT * FROM stu s RIGHT OUTER JOIN class c on s.cid = c.cid;
-- 简写 :可以省略outer
SELECT * FROM stu s LEFT JOIN class c ON s.cid = c.cid;

左外连接
在这里插入图片描述
右外连接
在这里插入图片描述

– 查询学生id,姓名,班级名称和地址,如果学生没有对应的班级,学生信息保留

SELECT
	s.sid,
	s.sname,
	s.cid,
	c.caddress
FROM
	stu s
LEFT JOIN class c ON s.cid = c.cid;

在这里插入图片描述

– 查询成绩大于60的学生id,姓名,成绩,班级名称和地址,并按照班级编号排序

SELECT
	s.sid,
	s.sname,
	s.score,
	c.cname,
	c.caddress
FROM
	stu s
LEFT JOIN
	class c
ON
	s.cid  = c.cid
WHERE
	s.score > 60
ORDER BY
	s.cid ;

在这里插入图片描述

子查询-嵌套查询
将一个select语句运行结果做一张表,作为一个新的表去使用,获得当作条使用,
1)查询出的虚拟表可以放在from后面当表用
2)查询出的虚拟表可以放在where后面当条件用
– 虚拟表当作表,放在from后面使用

SELECT
	*
FROM
	(
		SELECT
			sid,
			sname,
			score
		FROM
			stu
		WHERE
			gender = '男'
	) a
WHERE
	a.score > 80;

在这里插入图片描述
– 虚拟表当作条件,放在where后面使用

SELECT * FROM stu WHERE sid IN(SELECT sid FROM stu WHERE gender = '男');

在这里插入图片描述

SELECT * FROM stu WHERE sid = (SELECT sid FROM stu WHERE sname = '周七');

在这里插入图片描述
子查询可以当作条件,放在where后使用
但是需要注意,where的运算符
如果是= >等等符号后必须跟一个值的,那么子查询就必须是返回一个值
如果是in那么子查询就可以返回多个值


子查询:嵌套查询

– 查询男生成绩大于80的id,姓名,成绩

SELECT sid,sname,score FROM stu WHERE score>80 AND gender = '男';

在这里插入图片描述
– 子查询完成
– 1)先找出男生的id,姓名,成绩

SELECT sid,sname,score FROM stu WHERE gender = '男';

在这里插入图片描述
– 2)从上述表中找到成绩大于80的

SELECT
	*
FROM
	(
		SELECT
			sid,
			sname,
			score
		FROM
			stu
		WHERE
			gender = '男'
	) a
WHERE
	score > 80;

在这里插入图片描述
– 选出编号为1005的学生信息

SELECT * FROM stu WHERE sid = 1005;

在这里插入图片描述
– 选出姓名为周七的所有信息

SELECT * FROM stu WHERE sname = '周七'; 
SELECT * FROM stu WHERE sid IN(SELECT sid FROM stu WHERE gender = '男');
select * FROM stu where sid = (SELECT sid FROM stu WHERE sname = '周七');

在这里插入图片描述
在这里插入图片描述
– 查询与张三同一个班级的学生

SELECT * FROM stu WHERE cid = (SELECT cid FROM stu WHERE sname = '张三');

在这里插入图片描述
– 1找到张三的班级编号

SELECT cid FROM stu WHERE sname = '张三';

在这里插入图片描述
– 2根据班级编号涨到其他学生

SELECT * FROM stu WHERE cid = 1;

在这里插入图片描述
– 合并

SELECT * FROM stu WHERE cid = (SELECT cid FROM stu WHERE sname = '张三');

在这里插入图片描述
– 成绩高于3号班级所有人的学生信息
– 1查询3号班级的最高成绩

SELECT MAX(score) FROM stu WHERE cid = 3;

在这里插入图片描述
– 查询成绩大于3号班级的学生信息

SELECT * FROM stu WHERE score > (SELECT MAX(score) FROM stu WHERE cid = 3);

在这里插入图片描述
– 有两个组员以上的的学生信息
– 1 找到所有组长

SELECT groupLeaderId FROM stu GROUP BY groupLeaderId;

在这里插入图片描述
– 找到组员数>2的组长的学生编号

SELECT groupLeaderId FROM stu GROUP BY groupLeaderId HAVING COUNT(groupLeaderId)>2; 

在这里插入图片描述
– 查询组员数>2的组长的学生信息

SELECT
	*
FROM
	stu
WHERE
	sid IN (
		SELECT
			groupLeaderId
		FROM
			stu
		GROUP BY
			groupLeaderId
		HAVING
			COUNT(groupLeaderId) > 2
	);

在这里插入图片描述
– 求1008学生编号,姓名,组长编号和组长姓名
– 查询1008学生编号的组长编号

SELECT groupLeaderId FROM stu WHERE sid = 1008;

在这里插入图片描述
– 查询 组长id 为1010的学生姓名

SELECT sid,sname from stu WHERE sid = 1010;

在这里插入图片描述
– 查询学生编号为1008的学生姓名

SELECT sid,sname from stu WHERE sid =1008;

在这里插入图片描述
– 合并 从学生编号为1008的表中选取 sid sname,
– 从学生编号为1008的学生组长的表中选取组长sid,sname

SELECT
	s.sid,
	s.sname,
	g.sid,
	g.sname
FROM
	(
		SELECT
			sid,
			sname
		FROM
			stu
		WHERE
			sid = 1008
	) s,
	(
		SELECT
			sid,
			sname
		FROM
			stu
		WHERE
			sid = 1010
	) g
WHERE
	s.sid = 1008;

在这里插入图片描述
– 查询每个学生成绩大于60且成绩总和小于200的班级编号以及成绩和并根据成绩和降序
– 查询每个班级中成绩的最小值

SELECT
	cid,
	SUM(score)
FROM
	stu
GROUP BY
	cid
HAVING
	SUM(score) < 200
AND MIN(score) > 60
ORDER BY
	SUM(score) DESC;

在这里插入图片描述每日美文:我们努力奋斗,不是为了改变世界,——是为了不让世界改变我们

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值