分组和过滤

分组:**GROUP BY **
过滤:**HAVING**

  1. SELECT
  2. `subjectname`,
  3. avg( studentresult ) AS 平均分,
  4. max( studentresult ) AS 最高分,
  5. min( studentresult ) AS 最低分
  6. FROM
  7. result r
  8. INNER JOIN `subject` sub ON r.subjectno = sub.subjectno
  9. GROUP BY
  10. r.`subjectno` --通过什么字段来分组
  11. HAVING
  12. 平均分 > 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’;

  1. **"**`**%**`**",“**`*****`**”区别**
  2. ```sql
  3. select * from table1 where name like '*明*'
  4. select * from table1 where name like '%明%'

前一条语句列出来的是所有的记录,而后一条记录列出来的是name字段中含有“明”的记录,所以说,当我们作字符型字段包含一个子串的查询时最好采用“%”而不用“”`**,用“”的时候只在开头或者只在结尾时*,而不能两端全由“`”代替任意字符的情况下。

order by_排序

  • 升序: **asc** 小—>大
  • 降序: **desc** 大—>小

    注意:**默认是升序**,怎么指定升序或者降序呢?asc表示升序,desc表示降序。

1、按照成绩升序,找出学生姓名和成绩

  1. SELECT
  2. studentname,
  3. studentresult
  4. FROM
  5. student s
  6. JOIN result r ON s.studentno = r.studentno
  7. ORDER BY
  8. studentresult ASC // 升序

2、按照成绩降序,找出学生姓名和成绩

  1. SELECT
  2. studentname,
  3. studentresult
  4. FROM
  5. student s
  6. JOIN result r ON s.studentno = r.studentno
  7. ORDER BY
  8. studentresult DESC // 降序

3、按照成绩的降序排列,当成绩相同的时候再按照名字的升序排列

  1. SELECT
  2. studentname,
  3. studentresult
  4. FROM
  5. student s
  6. JOIN result r ON s.studentno = r.studentno
  7. ORDER BY
  8. studentresult DESC,
  9. studentname ASC;

注意:越靠前的字段越能起到主导作用。只有当前面的字段无法完成排序的时候,才会启用后面的字段。

4、找出年级是大一的学生,并且要求按照成绩的降序排列

  1. SELECT
  2. s.studentname,
  3. studentresult,
  4. gradename
  5. FROM
  6. result r
  7. INNER JOIN student s ON r.studentno = s.studentno
  8. INNER JOIN grade g ON s.gradeid = g.gradeid where g.gradeid =(select gradeid from grade where gradename ='大一')

in_区间范围

  1. SELECT *FROM 表名
  2. WHERE 字段 IN (value1,value2,...)

limit_分页

**limit是mysql特有的**,其他数据库中没有,不通用。(**Oracle**中有一个相同的机制,叫做**rownum**
语法机制:
limit startIndex, length

  • **startIndex**表示起始位置,**从0开始,0表示第一条数据**
  • length表示取第几行

1、取出成绩前5名的员工(思路:降序取前5个)

  1. SELECT
  2. studentname,
  3. studentresult
  4. FROM
  5. student s
  6. JOIN result r ON s.studentno = r.studentno
  7. ORDER BY
  8. studentresult DESC
  9. LIMIT 0,5;
  1. SELECT
  2. studentname,
  3. studentresult
  4. FROM
  5. student s
  6. JOIN result r ON s.studentno = r.studentno
  7. ORDER BY
  8. studentresult DESC
  9. LIMIT 5;

2、找出成绩排名在第3到第5名的学生?**n-1** ,**m-n+1**

  1. SELECT
  2. studentname,
  3. studentresult
  4. FROM
  5. student s
  6. JOIN result r ON s.studentno = r.studentno
  7. ORDER BY
  8. studentresult DESC
  9. LIMIT 2,3;