分组和过滤
分组:**GROUP BY **
过滤:**HAVING**
SELECT`subjectname`,avg( studentresult ) AS 平均分,max( studentresult ) AS 最高分,min( studentresult ) AS 最低分FROMresult rINNER JOIN `subject` sub ON r.subjectno = sub.subjectnoGROUP BYr.`subjectno` --通过什么字段来分组HAVING平均分 > 80
like_模糊查询
**%**:表示**零个或任意个字符**。可匹配任意类型和长度的字符**_**:表示**任意单个字符**。匹配单个任意字符,它常用来限制表达式的字符长度语句:(可以代表一个中文字符) ```sql 例1,查询name字段中包含有“明”字的。 select * from table1 where name like ‘%明%’
例2,查询name字段中以“李”字开头。 select from table1 where name like ‘李‘
例3,查询name字段中含有数字的。 select * from table1 where name like ‘%[0-9]%’
例4,查询name字段中含有小写字母的。 select * from table1 where name like ‘%[a-z]%’
例5,查询name字段中不含有数字的。 select * from table1 where name like ‘%[!0-9]%’
例5,找出名字中有下划线的? select name from tuser where name like ‘%\%’;
找出名字中最后一个字母是T的? select ename from emp where ename like ‘%T’;
**"**`**%**`**",“**`*****`**”区别**```sqlselect * from table1 where name like '*明*'select * from table1 where name like '%明%'
前一条语句列出来的是所有的记录,而后一条记录列出来的是name字段中含有“明”的记录,所以说,当我们作字符型字段包含一个子串的查询时最好采用“
%”而不用“”`**,用“”的时候只在开头或者只在结尾时*,而不能两端全由“`”代替任意字符的情况下。
order by_排序
- 升序:
**asc**小—>大 - 降序:
**desc**大—>小注意:
**默认是升序**,怎么指定升序或者降序呢?asc表示升序,desc表示降序。
1、按照成绩升序,找出学生姓名和成绩
SELECTstudentname,studentresultFROMstudent sJOIN result r ON s.studentno = r.studentnoORDER BYstudentresult ASC // 升序
2、按照成绩降序,找出学生姓名和成绩
SELECTstudentname,studentresultFROMstudent sJOIN result r ON s.studentno = r.studentnoORDER BYstudentresult DESC // 降序
3、按照成绩的降序排列,当成绩相同的时候再按照名字的升序排列
SELECTstudentname,studentresultFROMstudent sJOIN result r ON s.studentno = r.studentnoORDER BYstudentresult DESC,studentname ASC;
注意:越靠前的字段越能起到主导作用。只有当前面的字段无法完成排序的时候,才会启用后面的字段。
4、找出年级是大一的学生,并且要求按照成绩的降序排列
SELECTs.studentname,studentresult,gradenameFROMresult rINNER JOIN student s ON r.studentno = s.studentnoINNER JOIN grade g ON s.gradeid = g.gradeid where g.gradeid =(select gradeid from grade where gradename ='大一')
in_区间范围
SELECT *FROM 表名WHERE 字段 IN (value1,value2,...)
limit_分页
**limit是mysql特有的**,其他数据库中没有,不通用。(**Oracle**中有一个相同的机制,叫做**rownum**)
语法机制:
☆ limit startIndex, length
**startIndex**表示起始位置,**从0开始,0表示第一条数据**length表示取第几行
1、取出成绩前5名的员工(思路:降序取前5个)
SELECTstudentname,studentresultFROMstudent sJOIN result r ON s.studentno = r.studentnoORDER BYstudentresult DESCLIMIT 0,5;
SELECTstudentname,studentresultFROMstudent sJOIN result r ON s.studentno = r.studentnoORDER BYstudentresult DESCLIMIT 5;
2、找出成绩排名在第3到第5名的学生?**n-1** ,**m-n+1**
SELECTstudentname,studentresultFROMstudent sJOIN result r ON s.studentno = r.studentnoORDER BYstudentresult DESCLIMIT 2,3;
