SQL脚本:
bjpowernode.sql

Day01单表简单查询

  1. sql 语句执行顺序:
  2. 开始->FROM子句->WHERE子句->GROUP BY子句->HAVING子句->ORDER BY子句->SELECT子句->LIMIT子句->最终结果
  3. source C:\test.sql 或者 \. C:\test.sql
  4. desc 数据/表 查看数据库/表结构
  5. like 模糊查询
  6. asc 升序
  7. desc 降序
  8. order by 分组
  9. between and 两者之间
  10. is null/is not null null 不是null
  11. in / not in 包含/不包含(100,200)找出来 100 200 不是区间
  12. and or 同时出现and的优先级高,加小括号先执行
  13. _ 是占位符
  14. 单行处理函数:
  15. Concat 字符串拼接concat(对象 ,对象)
  16. lower 小写
  17. upper 大写
  18. length 长度
  19. substr 取子串(substr(被截取的对象,起始下标,截取的长度 ))
  20. trim 去除空格
  21. Round 四舍五入 ROUND(123.252,小数点位)
  22. Rand 生成随机数round(rand()*100,0)
  23. ifnull 可以将null装换成一个具体的值ifnull(判断对象,替换为值)
  24. case when ....then ....when.....then....else....end (if ...else)
  25. 分组函数:
  26. count 计数(*)计算所有(字段)计数不为null
  27. sum求和
  28. avg平均数
  29. max最大
  30. min最小
  31. 注意:
  32. 自动忽略null
  33. 分组函数不能在where后使用,要先分组
  34. 所有的分组函数可以组合使用
  35. wherehaving 都是过滤 优先使用where,不行在使用having
  36. 分组查询:
  37. group...... by....
  38. select .... from... where ... group....by ....order.....by
  39. from - where - group by - select - order by
  40. 在一条select语句当中,如果有group by 语句的话,select后面只能跟参加分组的字段以及分组函数其余一律不能加
  41. having 可以对分组后的数据再次过滤 不能单独使用 不能代替where 必须和group by 联合使用
  42. 总结:
  43. select ... from ... where ... group by....having...order by..
  44. from > where>group by>having>select>order by
  45. 开始->FROM子句->WHERE子句->GROUP BY子句->HAVING子句->ORDER BY子句->SELECT子句->LIMIT子句->最终结果
  46. xx表以where条件过滤,分组 ,在过滤 ,在查询 ,在以排序输出
  47. 先从某个表中查询数据,先经过where条件筛选出来有价值的数据,在进行分组,分组后可以使用having继续筛选。select查询出来,最后排序输出
  48. eg:查询除MANAGER 部门的平均工资大于1500 并以降序排列
  49. SELECT AVG(sal) AS avgsal,JOB FROM emp WHERE job !='MANAGER' GROUP BY JOB HAVING AVG(SAL)>'1500' ORDER BY avgsal DESC ;

Day02:

  1. 去除重复记录:distinct 在查询字段的前面,可以使用分组函数
  2. 链接查询(多表查询)
  3. 根据链接的方式分类:
  4. 内连接: 等值链接 非等值链接 自连接
  5. 外连接: 左外连接(左连接) 右外连接(右连接)
  6. eg:等值链接
  7. 查询每个员工所在部门名称,显示员工功名和部门名?
  8. sql92:SELECT ename ,dname FROM emp,dept WHERE emp.DEPTNO=dept.DEPTNO;
  9. 缺点:结构不清晰,表的连接条件和后期进一步筛选的条件都放在where后面
  10. sql99:select ename,dname FROM emp e inner join dept d on e.DEPTNO=d.DEPTNO;(内连接)
  11. 优点:表连接的条件是独立的,连接之后,如果还需要进一步筛选 在添加where条件
  12. eg:非等值链接
  13. 找出每个员工的薪资等级,要求显示员工名,薪资 薪资等级?
  14. select e.ename,e.sal,s.grade from emp e inner join salgrade s on e.sal between s.losal and s.hisal order by s.grade desc;
  15. eg:自连接 (一张表当成两张表用)
  16. 查询员工的上级领导,要求显示员工和对应的领导名?
  17. select a.ename as '员工名' ,b.ename as '领导名' from emp a inner join emp b on a.mgr=b.DEPTNO;
  18. 外连接:
  19. 右连接:right代表将关键字右边的这张表看成主表,主要是为了将这张表的数据全部查出来,捎带着关联查询左边的表,在外连接当中,两张表连接产生了主次关系。
  20. select e.ename,d.dname FROM dept d right outer join emp e on e.depton=d.DEPTNO;
  21. eg:
  22. 查询每个员工的上级领导,要求显示所有的员工的名字和领导名?
  23. select a.ename as '员工名',b.ename as '领导名' from emp a left outer join emp b on a.mgr=b.empno;
  24. 三张表和四张表的连接查询:
  25. 一条sql语句中内连接和外连接都可以使用
  26. select ...from a join b on ab的连接条件 join c on ac的连接条件 right join d on ad 的连接条件
  27. eg: 找出每个员工的部门的名称以及工资的等级,要求显示员工名,部门名 薪资 薪资等级?
  28. select e.ename,e.sal,d.dname,s.grade from emp e join dept d on e.DEPTNO=d.DEPTNO join salgrade s on e.sal between s.losal and s.hisal;
  29. eg: 找出每个员工的部门的名称以及工资的等级,还有上级领导,要求显示员工名,部门名 薪资 薪资等级?
  30. select e.ename,e.sal,d.dname,s.grade,l.JOB from emp e join dept d on e.DEPTNO=d.DEPTNO join salgrade s on e.sal between s.losal and s.hisal LEFT join emp l on e.mgr=l.empno;
  31. 子查询:select语句中嵌套select语句 被嵌套的select的语句叫做子查询
  32. 可以出现在 select (select) from(select) where(select)
  33. eg: 找出比最低工资高的员工姓名和工资
  34. select sal from emp where sal>(select min(sal) from emp);
  35. egfrom后面的子查询,可以把子查询的查询结果当做一张临时表
  36. 找出每个岗位的平均工资的薪资等级
  37. SELECT t.*, s.GRADE FROM (SELECT job , avg(sal) avgsal FROM emp GROUP BY JOB) t JOIN salgrade s on t.avgsal BETWEEN s.LOSAL and s.HISAL;
  38. union 合并查询结果集(效率高,可以减少匹配的次数)
  39. a=10 连接 b=10 连接 c=10 匹配次数 1000
  40. a=10 连接 b=10 匹配次数 100 a=10 连接 c=10 匹配次数 100 使用union合并100+100=200
  41. eg: 查询工作岗位是MANAGERSALESMAN的员工
  42. select ename,job from emp where job='MANAGER' union select ename,job from emp where job='SALESMAN';