单行:一个输入一个输出
多行:多个个输入一个输出

单行处理函数

  1. /*
  2. lower
  3. upper
  4. substr 取子串
  5. trim 去空格
  6. str_to_date 字符串转日期
  7. date_format 格式化日期
  8. round 四舍五入
  9. rand 0-1随机数
  10. ifnull 将null转为具体值
  11. case..when..then..when..then..else..end 如果条件是..则如何,else 其他的如何
  12. */
  13. select lower(ENAME) from emp;
  14. -- 1开始
  15. select substr(ENAME, 1, 2) from emp;
  16. select ENAME from emp where substr(ENAME, 1, 1) = 'a';
  17. -- concat字符串拼接,以下语句输出结果是首字母大写其它小写
  18. select
  19. concat(upper(substr(ENAME, 1, 1)), lower(substr(ENAME, 2, length(ENAME))))
  20. from emp;
  21. select length(ENAME) from emp;
  22. select ENAME from emp where ENAME = trim(' SMITH ');
  23. select round(1234.567, 0) as result from emp; // 1235
  24. select round(1234.567, -1) as result from emp; // 1230
  25. select rand() * 100 as result from emp;
  26. // 将comm中的null值改为0值
  27. select ENAME, (SAL + ifnull(COMM, 0)) * 12 as salcomm from emp;
  28. // 当员工职位是manager时,工资上调10%,当职位是salesman时工资上调50%,其他正常
  29. select
  30. ENAME,
  31. JOB,
  32. sal as oldsal,
  33. (case JOB when 'MANAGER' then SAL * 1.1 when 'SALESMAN' then SAL * 1.5 else SAL end) as newsal
  34. from
  35. emp;

注:null在数据库参与数学运算,最终结果都为null

多行处理函数(分组函数)

  • count() 计数
  • sum() 求和
  • avg()
  • max()
  • min()

注:先分组,再输出;未分组,整张表为一组
注:分组函数会直接忽略null,不需要对其进行提前处理
注:

  • count():为一整行
  • count(字段):字段下不为null的数据

注:分组函数不能直接使用在where子句中,原因 group by 在where后执行,所以不能在where中用函数
注:所有分组函数可以一起用

  1. select max(sal) from emp;
  2. select count(sal) from emp;
  3. // 找出比最低工资高的员工

分组查询(group by)

  1. /**
  2. * 执行顺序
  3. * from
  4. * where
  5. * group by
  6. * select
  7. * order by
  8. */
  9. select
  10. ...
  11. from
  12. ...
  13. where
  14. ...
  15. group by
  16. ...
  17. order by
  18. ...
  19. // mysql可以,oracle中报错,因为按照job分组后的组数和ename的总数对不上
  20. // 所以,在加入group by时,select后面只能跟分组的字段和分组函数
  21. select // 错误写法
  22. ENAME,
  23. JOB,
  24. sum(SAL)
  25. from
  26. emp
  27. group by
  28. JOB;
  29. select // 正确写法
  30. JOB,
  31. sum(SAL)
  32. from
  33. emp
  34. group by
  35. JOB;

练习:

  1. # 每个部门、不同岗位的最高工资
  2. select
  3. DEPTNO,
  4. JOB,
  5. max(SAL)
  6. from
  7. emp
  8. group by
  9. DEPTNO, JOB
  10. order by
  11. DEPTNO;
  12. # 每个部门最高薪资, 显示最高薪资大于3000的
  13. # having对分完组的数据进行过滤,但是having必须与group by配合使用
  14. select
  15. DEPTNO,
  16. max(SAL)
  17. from
  18. emp
  19. group by
  20. DEPTNO
  21. having
  22. max(SAL) > 3000;
  23. # 以上语句效率低
  24. select
  25. DEPTNO,
  26. max(SAL)
  27. from
  28. emp
  29. where
  30. SAL > 3000
  31. group by
  32. DEPTNO;
  33. # 可以先对薪资进行筛选,然后在分组
  34. # 要求每个部门的评价薪资高于 2500
  35. select
  36. DEPTNO,
  37. avg(SAL)
  38. from
  39. emp
  40. group by
  41. DEPTNO
  42. having
  43. avg(SAL) > 2500;
  44. # 此处只能使用having
  45. # where效率高于having

注:去重distinct;只能出现在所有字段的最前面

  1. # 内容去重
  2. select distinct JOB from emp;
  3. # 联合去重 意为 job 和 deptno 两个组合情况共同去重
  4. select distinct JOB, DEPTNO from emp;

连接查询