当前位置:文档之家› 传智 韩忠康 mysql 课程笔记4(吐血整理)

传智 韩忠康 mysql 课程笔记4(吐血整理)

Order by2013年4月19日星期五09:39校对规则,决定排序关系。

按照字段值进行排序Order by 字段升序|降序(asc|desc)默认升序,asc。

允许多字段排序,指的是,先按照第一个字段排序,如果说不能区分,才使用第二个字段。

以此类推。

注意,如果是分组,则应该使用对分组字段进行排序的groupby语法。

limit2013年4月19日星期五09:50限制获得的记录数量:limit的语法:Limit offset,row_countOffset 偏移量,从0开始。

可以省略,默认为0.Row_count总记录数,如果数量大于余下的记录数,则获取所有余下的即可:select * from teacher_class limit 3, 4; select * from teacher_class limit 5;select * from teacher_class limit 5, 100;distinct2013年4月19日星期五10:17去除重复记录:重复的记录,指的是,字段值都相同的记录,select days from teacher_class ;select distinct days from teacher_class ;select days, begin_date from teacher_class ; select distinct days, begin_date from teacher_class ;相对的是all,表示所有。

默认就是all行为。

Union2013年4月19日星期五10:26联合查询:将多条select语句的结果,合并到一起。

称之为联合操作。

获得2个班代课最多的老师:select t_name, days from teacher_class where c_name='php0115' order by days desc limit 1; select t_name, days from teacher_class where c_name='php0228' order by days desc limit 1;union联合使用union关键字联合两个加括号的select语句即可:(select t_name, days from teacher_class where c_name='php0115' order by days desc limit 1) union(select t_name, days from teacher_class where c_name='php0228' order by days desc limit 1)场景:获得数据的条件,出现逻辑冲突,或者很难在一个逻辑内表示,就可以拆分成多个逻辑,分别实现最后将结果合并到一起。

Union all:环境:1,获得0115班所有代课教师,结果按照代课天数升序排序,同时需要获得0228班,结果按照降序排序注意,如果union 的结果存在重复的记录,那么会消除重复.可以通过union选项all 达到不去重的目的。

子查询2013年4月19日星期五11:25场景:查询代课天数最多的哪个老师的信息。

select t_name, male from teacher_class order by days limit 1;逻辑没有问题:但是出现了代课天数一致最多(上表李白和韩信)的如何处理?不能是否有重复的,或者几个重复的。

无法确定有几个是代课天数最多的。

换个思路:先获得最多的代课天数是多少天,Select max(days) from teacher_class;再判读哪个老师的代课天数和最大值是一样的。

mysql允许将上面的查询结果,作为一个值来使用。

Var1 = Select max(days) from teacher_class;保存起来Select t_name, gender from teacher_class where days = var1;可以直接:Select t_name, gender from teacher_class where days = (Select max(days) from teacher_class);定义:语句内部的查询语句,就是子查询语句。

子查询分类,不同的分类,会有不同的使用方式:分类标准:子查询出现的位置:子查询的返回值形式:返回值分类:单一值,一列,多列,表(多行,多列)出现位置:where型,where后from型,from后。

exists型,不常用,相当于where型的一个特殊情况。

返回一行在参与比较时,使用括号可以构建一行:(filed1, field2)select t_name, gender, c_name from teacher_class where (gender, c_name) = (select distinct gender, c_name from teacher_class where t_name='李白' and c_name='php0115' limit 1);ExistsExists(subquery)判断依据:如果子查询的可以返回数据,则认为exists 表达式返回真。

否者,返回假。

下面的两个语句完成的是同样的事情:select * from teacher_class where exists (select * from teacher where teacher_class.id=t_id); select * from teacher_class where id in (select t_id from teacher);解决思路是不一样的:exists:先获得每一条teacher_class的数据,然后获得id字段,去teacher表内查找对应值,找到,说明符合条件。

in:先获得所有的id的可能性。

再在检索teacher_class数据时,判断当前的id是否在id集合内。

join2013年4月19日星期五15:07每个实体,一个表一个业务逻辑,使用多个实体的数据,多张表应该在一起使用,将多个表的记录连接起来。

如下面三个表:总体思路:将所有的数据,按照某种条件,连接起来,再进行筛选处理。

连接的分类:根据连接的条件不同,分类入如下:内连接外连接自然连接内链接的处理:内连接,在连接时,是可以省略连接条件的。

意味着,所有的左表的数据,都要与右表的记录做一个连接。

共存在MXN个连接这种连接,就称之为,交叉连接,或者笛卡尔积。

此时可以使用cross join 代替inner join。

可以通过多表查询,不使用where,做到笛卡尔积。

注意:mysql中crossjoin与innerjoin相同,但在数据库的定义上,交叉连接就是笛卡尔积。

是没有条件的innerjoin。

Mysql inner join是默认的连接方案,可以省略inner。

有条件的内连接:会在连接时过滤非法的连接。

where的写法:数据过滤,理解上,数据安装交叉连接连接完成后,再做数据过滤。

on的写法:在连接时,就对数据进行判断。

Using的写法。

Using 要求,负责连接的两个实体之间的字段名称,一致。

建议是,在有同名字段时,使用using ,而在通用条件时,使用on。

在数据过滤时(不是指的连接过滤)使用where。

注意,查询条件,与外连接通用(外连接,不能使用where作为连接条件);外连接:如果负责连接的一个或多个数据不真实存在,则称之为外连接Using:会去掉结果中的重复字段,并放在列前。

自然连接:通过mysql 自己的判断完成连接过程!不需要指定连接条件。

mysql会使用多表内的,相同的字段,作为连接条件。

自然连接分成内外之分:Array内,natural join外,左外,右外。

Natrual left joinNatrual right joinselect * from one natural join two;select * from one inner join two using (public_field);select * from one natural left join two;select * from one left join two using (public_field);select * from one natural right join two;select * from one right join two using (public_field); Join = inner joinCross join (交叉连接,mysql体现上insert join)连接时,支持多表连接:select s.*, si.* from info_class as c left join info_student as s on c.id=s.class_id left join info_student_info as si on s.id=si.id where c.class_name='php0331';Match left join class on match.host_id=class.id left join classOn match.guest_id=class.id作业Select h.class_name, g.class_name, m.match_time, m.match_resultFrom `match` as m left join class as h on m.host_id =h.id left join class as g onm.guest_id=g.id where m.match_time between '2013-04-01' and '2013-04-30';。

相关主题