MySQL查询实例
1、对部分的定义
subsuperposition允许查询是嵌套在另一个查询,例如,考试评分项目分为测试事件2例,T和Q下面的查询只能看到学生的考试成绩
SELECT * FROM评分event_id在(选择event_id从事件类型=不);
2部分(3)的使用
用部分来产生一个参考值
在这种情况下,一个内部查询用于检索数据,然后数据值是用于外查询语句的比较操作。例如,如果你要查询的中学生考试结果的某一天,我们应该使用内层查询的一天首先,事件的数量,然后使用事件数找到在外表查询学生成绩的记录。具体的语句:
从得分中选择*
ID =(选择event_id从事件日期= '2002-03-21'and型= Q);
应该注意,当内部查询结果的应用主要用于比较操作时,内部查询必须只有一个输出结果。例如,如果您想知道哪一位美国总统的生日最小,请构建以下查询
从出生=出生(出生)的总统中选择*
这个查询是错误的!因为MySQL不允许在子句中使用统计函数!min()函数应该具有一定的工作参数!因此我们使用的部分:
选择*从总统那里出生=(选择min(出生)从总统);
存在和不存在子选择
以前使用的是转移的interlook从内层到外层的结果,并将外部查询的结果向内层。看外部查询的结果满足内部查找匹配的直径。这种替代使用从外到内是与另一个表中的一个匹配记录的检索数据表非常合适。
数据表t1数据表T2
I1 I2 C2 C1
一
二
3
C 2
三
4 C
一
查找存在于两个表中的数据
选择I1从T1存在(SELECT * FROM T2,T1,T2 I1 I2 =。);
查找T1表中存在的数据,在T2表中不存在。
这里不存在选择I1形成T1(SELECT * FROM T2,T1,T2 I1 I2 =。);
It is important to note that in the Subselection of these two forms, the asterisk in the inner query represents the output of the outer query.The internal query does not need to list the names of the relevant data columns, and Tian's internal query is concerned with how many rows of the result of the outer query.I hope you can understand this.
在和不在子选择中
在这种种子选择中,内层查询应该只返回一个数据列,而数据列中的值将通过外部查询中的比较操作来进行评估。
查找存在于两个表中的数据
选择从T1,I1(I1 I2在选择从T2);
查找T1表中存在的数据,在T2表中不存在。
选择在不形成T1 I1 I1(选择I2从T2);
这种说法似乎更容易理解,还有另一个例子。
例如,你想找到所有住在A和B的学生。
SELECT * FROM学生状态(a,b)
二、利用关系查询选择查询重写方法。
1、匹配的查询重写
下一个例子是学生在成绩表中的成绩(不包括考试成绩)。查询。
SELECT * FROM评分event_id在(选择event_id从事件类型=不);
可以看出,内部查询查找所有的考试事件,外部查询利用这些考试事件来获取学生的成绩。
这种查询可以改写为一个简单的关联查询:
选择得分。*评分、事件的地方得分。event_id = event.event_id和事件。event_id =不;
下一个例子可以用来找出所有女生的成绩。
SELECT * FROM评分student_id在(选择student_id形式学生性别==);
它可以转换成一个相关的查询,如下所示:
从分数中选择*
在学生_id = student.student_id和student.sex = F;
它是正则重写匹配的子选择查询到相关的查询。在下面的部分查询形式:
SELECT * FROM表1
其中column1在(选择column2a从表2,column2b =价值);
它可以转换成一个相关的查询,如下所示:
选择表。从表1,表2
在table.column1 = table2.column2a和table2.column2b =价值;
(2)重写一个不匹配(或丢失)类型的子查询
部分查询的另一个常见用途是发现在一个数据表,但不是在其他数据表的东西。我们可以看到,这种说法,在一个数据表,在另一个数据表通常意味着我们可以解决这个问题,一个左连接没有数据。看下面的子查询,可以发现学生不在的情况下的数据表(即那些从来没有工作)。
从学生中选择*
在student_id没有(选择student_id从缺失);
这部分的查询改写左连接查询如下图所示:
选择*学生。
From student left join absence on student.student_id =absence.student_id
在absence.student_id是空的;
这是规则的重写非匹配的子选择查询相关的查询。在下面的部分查询形式:
SELECT * FROM表1
其中column1没有(选择方法从表2);
它可以转换成一个相关的查询,如下所示:
选择表。*
从表1左连接表在表1。1 = table2.column2
Where table2.column2 is null;
注:这需要重写的数据列table2.column2被声明为NOT NULL。