1. EXISTS子查询
语法:
select ....... from 表名 where EXISTS(子查询);
子查询有无返回结果:exists 子查询结果为TRUE
子查询无返回结果:exists 子查询结果为FALSE,外层查询不执行
其实exists这个单词早就在我们新建表的时候就有了,那个语法是create table if exists 表名,这句话会判断我们新建的表是否已经存在,不存在的话就会新建表,存在的话就报错,通过这个我们就可以知道exists是做什么的了吧,没错,就是判断一条语句是否有无结果,有的话就会执行,没有的话就不会,比如我们可以和一条语句绑定,如查询一个学生成绩的表,如果成绩有大于80分的同学,那就将他们的成绩由高到低排序,这里就可以用exists,举了一条栗子后是不是感觉exists和if很像啊,没错,这里的exists就相当于if,因为格式问题我就不把列子放出来了,就用文字给大家解释一遍。
2. 分组查询
MySQL里面我们用group by 来进行分组,而排序我们则用order by 来进行排序,所以分组排序就是先分组在排序,
其语法如下:
select 字段或者函数 from 表名 where 条件 group by 字段(要有重复字段属性) order by 字段
解释下这条语句,其中where 条件可写可不写,最后一个字段其中的属性要能比较大小,排序有asc(从小到大)和desc(从大到 小),不写的话默认是asc,也就是从小到大排序
列:
SELECT`subjectNo`,AVG(`studentResult`) AS 课程平均成绩
FROM `result`
GROUP BY `subjectNo`;
3.分组筛选
我们都知道筛选都是用where来筛选条件的,这个where语句我们都是写在 查询语句时 表的后面,但我们又想在分组或者排序后等条件后筛选怎么办呢,还能不能用where了呢,答案是不能的,我们这里就要用到HAVING 这个语法了
语法格式如下:
select 字段或者函数 from 表名 where 条件 GROUP BY 字段(按照什么来进行分组) HAVING(筛选条件)
比如:
SELECT`subjectNo`,AVG(`studentResult`) AS课程平均成绩
FROM `result`
GROUPBY `subjectNo`
HAVINGAVG(`studentResult`)>=60;
4. where与having的对比
where子句:用来筛选from子句中指定的操作所产生的行
group by 子句:用来分组where子句的输出
having子句:用来从分组的结果中筛选行
5.多表连接查询
1.内连接
首先我们要先了解什么是内连接,怎么说呢?简单来说就是将有相同字段的表根据语法将它们连接起来,从而得到我们想要的数据,而我们想要的数据分别在两张不同的表里面,这时候就要用到内连接了,
SELECT Cname,Cno,Tname,Depart FROM course INNER JOIN teacher ON course.`Tno`=teacher.`Tno`;
首先我们来看下这条语句,查询字段Cname,Cno,Tname,Depart,而这四个字段又不在同一张表里面,我们就要用inner join 这个语法将两张表连接起来,连接起来的办法就是找出两张表里面有相同的那个字段,并将两张表course和teacher用等号关联起来,这里写了两张表分别都有Tno这个字段,
其实还有一种简便的办法,我本人比较喜欢下面这个,但我们在工作中常用的是上面那种,我分不清两种方法有什么区别,感兴趣的可以自己百度。
SELECT Cname,Cno,Tname,Depart FROM course,teacher WHERE course.`Tno`=teacher.`Tno`;
看到没,from后面写上要关联的表,where 后面则写表字段的连接,多张表也可以这样,from后面写上每个表的名字并用逗号分隔开,where后面则每张表的字段相关联,比如表1.字段1=表2.字段1 and 表2.字段2=表3.字段2,这样,这就相当于a,b,c三条线,a与b平行,b与c 平行,那么a与c也平行,就是这个思想,只要任意两张表的相同字段就可以连接起来,不过是多用几个and
如果多张表的话,第一种方式也要随之改变,
SELECTS.studentName AS 姓名,SU.subjectName AS 课程,R.studentResult AS 成绩
FROMstudent AS S
INNER JOIN `result` AS RON (S.`studentNo` = R.`studentNo`)
INNER JOIN `subject` AS SUON(SU.subjectNo=R.subjectNo);
只不过是多用几个inner join 即可2.外连接
a.左外连接
什么叫左外连接呢?官方的解释是:左外联接是以左表为基础的,左表的记录将会全部表示出来,而右表只会显示符合搜索条件的记录。右表记录不足的地方均为NULL
这里也和上面的多表连接差不多,不过要分主表和从表,即左表和右表,我们查询的时候往往有多个字段,而两张表里面的字段又不可能全部都有,比如一张表有成绩这个字段,而另一张没有,如果查询的时候我们要看成绩字段怎么办,那其值就以null填充,意思就是空。
列:
SELECT S.studentName,R.subjectNo,R.studentResult
FROM studentAS S
LEFT JOIN result AS R
ON S.studentNo =R.studentNo;
b.右外连接
右外连接和左外连接一样,位置颠倒一下就行,只不过这里是字段是空值,而字段属性有值