加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 站长学院 > MySql教程 > 正文

Mysql入门MySQL里面的子查询实例

发布时间:2020-12-12 02:47:00 所属栏目:MySql教程 来源:网络整理
导读:《Mysql入门MySQL里面的子查询实例》要点: 本文介绍了Mysql入门MySQL里面的子查询实例,希望对您有用。如果有疑问,可以联系我们。 一,子选择基本用法 1,子选择的定义 子迭择允许把一个查询嵌套在另一个查询当中.比如说:一个考试记分项目把考试事件分为考

《Mysql入门MySQL里面的子查询实例》要点:
本文介绍了Mysql入门MySQL里面的子查询实例,希望对您有用。如果有疑问,可以联系我们。

一,子选择基本用法
1,子选择的定义
子迭择允许把一个查询嵌套在另一个查询当中.比如说:一个考试记分项目把考试事件分为考试(T)和测验(Q)两种情形.下面这个查询就能只找出学生们的考试成绩
select?*?from?score?where?event_id?in?(select?event_id?from?event?where?type='T');
2,子选择的用法(3种)
?????????用子选择来生成一个参考值
在这种情况下,用内层的查询语句来检索出一个数据值,然后把这个数据值用在外层查询语句的比较操作中.比如说,如果要查询表中学生们在某一天的测验成绩,就应该使用一个内层查询先找到这一天的测验的事件号,然后在外层查询语句中用这个事件号在成绩表里面找到学生们的分数记录.具体语句为:
select?*?from?score?where?
id=(select?event_id?from?event?where?date='2002-03-21'?and?type='Q');
需要注意的是:在应用这种内层查询的结果主要是用来进行比较操作的分法时,内层查询应该只有一个输出结果才对.看例子,如果想知道哪个美国总统的生日最小,构造下列查询
select?*?from?president?where?birth=min(birth)
这个查询是错的!因为MySQL不允许在子句里面使用统计函数!min()函数应该有一个确定的参数才能工作!所以我们改用子选择:
select?*?from?president?where?birht=(select?min(birth)?from?presidnet);
?????????exists?和?not?exists?子选择
上一种用法是把查间结果由内层传向外层、本类用法则相反,把外层查询的结果传递给内层.看外部查询的结果是否满足内部查间的匹配径件.这种“由外到内”的子迭择用法非常适合用来检索某个数据表在另外一个数据表里面有设有匹配的记录

数据表t1????????????????????????????????????????数据表t2
I1????????C1????????????????I2????????C2
1
2
3????????A

C????????????????2
3
4????????C

A
先找两个表内都存在的数据
select?i1?from?t1?where?exists(select?*?from?t2?where?t1.i1=t2.i2);
再找t1表内存在,t2表内不存在的数据
select?i1?form?t1?where?not?exists(select?*?from?t2?where?t1.i1=t2.i2);

需要注意:在这两种形式的子选择里,内层查询中的星号代表的是外层查询的输出结果.内层查询没有必要列出有关数据列的名字,田为内层查询关心的是外层查询的结果有多少行.希望大家能够理解这一点
?????????in?和not?in?子选择
在这种子选择里面,内层查询语句应该仅仅返回一个数据列,这个数据列里的值将由外层查询语句中的比较操作来进行求值.还是以上题为例
先找两个表内都存在的数据
select?i1?from?t1?where?i1?in?(select?i2?from?t2);
再找t1表内存在,t2表内不存在的数据
select?i1?form?t1?where?i1?not?in?(select?i2?from?t2);
好象这种语句更容易让人理解,再来个例子
比如你想找到所有居住在A和B的学生.
select?*?from?student?where?state?in(‘A','B')
二,????????把子选择查询改写为关联查询的方法.
1,匹配型子选择查询的改写
下例从score数据表里面把学生们在考试事件(T)中的成绩(不包括测验成绩!)查询出来.
Select?*?from?score?where?event_id?in?(select?event_id?from?event?where?type='T');
可见,内层查询找出所有的考试事件,外层查询再利用这些考试事件搞到学生们的成绩.
这个子查询可以被改写为一个简单的关联查询:
Select?score.*?from?score,?event?where?score.event_id=event.event_id?and?event.event_id='T';
下例可以用来找出所有女学生的成绩.
Select?*?from?score?where?student_id?in?(select?student_id?form?student?where?sex?=?‘f');
可以把它转换成一个如下所示的关联查询:
Select?*?from?score
Where?student?_id?=student.student_id?and?student.sex?='f';
把匹配型子选择查询改写为一个关联查询是有规律可循的.下面这种形式的子选择查询:
Select?*?from?tablel
Where?column1?in?(select?column2a?from?table2?where?column2b?=?value);
可以转换为一个如下所示的关联查询:
Select?tablel.?*?from?tablel,table2
Where?table.column1?=?table2.column2a?and?table2.column2b?=?value;
(2)非匹配(即缺失)型子选择查询的改写
子选择查询的另一种常见用途是查找在某个数据表里有、但在另一个数据表里却没有的东西.正如前面看到的那样,这种“在某个数据表里有、在另一个数据表里没有”的说法通常都暗示着可以用一个left?join?来解决这个问题.请看下面这个子选择查询,它可以把没有出现在absence数据表里的学生(也就是那些从未缺过勤的学生)给查出来:
Select?*?from?student
Where?student_id?not?in?(select?student_id?from?absence);
这个子选择查询可以改写如下所示的left?join?查询:
Select?student.?*
From?student?left?join?absence?on?student.student_id?=absence.student_id
Where?absence.student_id?is?null;
把非匹配型子选择查询改写为关联查询是有规律可循的.下面这种形式的子选择查询:
Select?*?from?tablel
Where?column1?not?in?(select?column2?from?table2);
可以转换为一个如下所示的关联查询:
Select?tablel?.?*
From?tablel?left?join?table2?on?tablel.column1=table2.column2
Where?table2.column2?is?null;
注意:这种改写要求数据列table2.column2声明为not?null.

编程之家PHP培训学院每天发布《Mysql入门MySQL里面的子查询实例》等实战技能,PHP、MYSQL、LINUX、APP、JS,CSS全面培养人才。

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读