本篇博客讲解(子查询)非相关子查询/相关子查询,一对一,一对多,多对一,多对的的关系!
准备:
首先我们创建一列sex。再为部分行设置好值0(女)或者1(男);
delete from stud where age=26;
删除年龄为26的行。
update stud set sex='1' where saddress like '湖南%';
将地址中湖南开头的人的的sex修改为1。
update stud set sex='0' where age>=30 and sex is null;
将年龄大于等于30的,且性别为null的人的sex设置为0.
case-when then else end 语句.
现在要做这样一件事,查询显示的时候sex不显示0,1和null,我们让它0的就显示女,1的就显示男,null就显示未知。
这时我们需要用到:
case-when then else end 语句.
修改 * 当 * 时候 修改成 * 否则修改成 * END
when then 可以写多句
select sno,sname,age,saddress,(case sex when '0' then '女' when '1' then '男' else '未知' end) as 性别 from stud;
有人可能会有疑问,不是定义了sex只能有一个字符嘛,为什么还能用‘未知’啊,因为这里只是显示的,并不是存储到数据库中的数据,只是相当于输出字符。
子查询:
子查询:嵌套在其它查询中的查询语句。(又称为内部查询)
主查询:包含其它子查询的查询称为主查询。(又称外部查询)
非相关子查询:
在主查询中,子查询只需要执行一次,子查询结果不再变化,供主查询使用,这种查询方式称为非相关子查询。
也可以这么理解:
非相关子查询是独立于外部查询的子查询,子查询总共执行一次,执行完毕后将值传递给外部查询。
现在我们来对这个表做一个查询:
查询具有年龄相同的人在2人及以上的,他们的年龄分别是多少。
select age from stud group by age having count(age)>=2;
count(age)在这里只是作为供主查询使用的条件。
相关子查询:
相关子查询的执行依赖于外部查询的数据,外部查询执行一行,子查询就执行一次。
也可以这么理解:
执行查询的时候先取得外部查询的一个属性值,然后执行与此属性值相关的子查询,执行完毕后再取得外部父查询的下一个值,依次再来重复执行子查询;
我们先把表格增加一列sex并设置好值。
接下来:
查询不但具有年龄相同的人在2人及以上的,而且性别是1的那些人的年龄。
SELECT age,sex FROM stud GROUP BY age,sex HAVING COUNT(age)>=2 AND sex='1';
表与表之间的关系:
一对一:
需要两个表。当然做项目时为了省空间,通常只建一个表,如果要实现一对一的查询,可以建立两个视图。示例如下:
1)先建物理表,初始化数据、
create table person( id int, name varchar(10), sex char(1), wife int, husband int ); insert into person values(1,'小花','0',1,3); insert into person values(2,'玉芳','0',0,4); insert into person values(3,'张三','1',1,0); insert into person values(4,'李四','1',2,0); insert into person values(5,'王五','1',0,0);
2)建立两个视图
create view women as select * from person where sex='0'; create view men as select * from person where sex='1';
3)查询夫妻信息
92年以前是这样查询的:
select women.name as 妻子,men.name as 丈夫 from women,men where women.husband=men.id and women.id=men.wife;