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';。