MySQL子查询操作实例

2018-11-20 03:19:39来源:爱站网 阅读 ()

新老客户大回馈,云服务器低至5折

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。

以上就是小编分享的MySQL子查询操作实例,希望本文的内容对大家的学习或者工作能带来一定的帮助,如果有疑问大家可以留言交流。?

标签:

版权申明:本站文章部分自网络,如有侵权,请联系:west999com@outlook.com
特别注意:本站所有转载文章言论不代表本站观点,本站所提供的摄影照片,插画,设计作品,如需使用,请与原作者联系,版权归原作者所有

上一篇:MySQL仿ASP的数据库操作类实例

下一篇:浅析MySQL的数据类型和建库策略