SQL脚本:
bjpowernode.sql
Day01单表简单查询
sql 语句执行顺序:开始->FROM子句->WHERE子句->GROUP BY子句->HAVING子句->ORDER BY子句->SELECT子句->LIMIT子句->最终结果source C:\test.sql 或者 \. C:\test.sqldesc 数据/表 查看数据库/表结构like 模糊查询asc 升序desc 降序order by 分组between and 两者之间is null/is not null 是null 不是nullin / not in 包含/不包含(100,200)找出来 100 200 不是区间and 和 or 同时出现and的优先级高,加小括号先执行_ 是占位符单行处理函数:Concat 字符串拼接concat(对象 ,对象)lower 小写upper 大写length 长度substr 取子串(substr(被截取的对象,起始下标,截取的长度 ))trim 去除空格Round 四舍五入 ROUND(123.252,小数点位)Rand 生成随机数round(rand()*100,0)ifnull 可以将null装换成一个具体的值ifnull(判断对象,替换为值)case when ....then ....when.....then....else....end (if ...else)分组函数:count 计数(*)计算所有(字段)计数不为null的sum求和avg平均数max最大min最小注意:自动忽略null分组函数不能在where后使用,要先分组所有的分组函数可以组合使用where和having 都是过滤 优先使用where,不行在使用having分组查询:group...... by....select .... from... where ... group....by ....order.....byfrom - where - group by - select - order by在一条select语句当中,如果有group by 语句的话,select后面只能跟参加分组的字段以及分组函数其余一律不能加having 可以对分组后的数据再次过滤 不能单独使用 不能代替where 必须和group by 联合使用总结:select ... from ... where ... group by....having...order by..from > where>group by>having>select>order by开始->FROM子句->WHERE子句->GROUP BY子句->HAVING子句->ORDER BY子句->SELECT子句->LIMIT子句->最终结果从xx表以where条件过滤,分组 ,在过滤 ,在查询 ,在以排序输出先从某个表中查询数据,先经过where条件筛选出来有价值的数据,在进行分组,分组后可以使用having继续筛选。select查询出来,最后排序输出eg:查询除MANAGER 部门的平均工资大于1500的 并以降序排列SELECT AVG(sal) AS avgsal,JOB FROM emp WHERE job !='MANAGER' GROUP BY JOB HAVING AVG(SAL)>'1500' ORDER BY avgsal DESC ;
Day02:
去除重复记录:distinct 在查询字段的前面,可以使用分组函数链接查询(多表查询)根据链接的方式分类:内连接: 等值链接 非等值链接 自连接外连接: 左外连接(左连接) 右外连接(右连接)eg:等值链接查询每个员工所在部门名称,显示员工功名和部门名?sql92:SELECT ename ,dname FROM emp,dept WHERE emp.DEPTNO=dept.DEPTNO;缺点:结构不清晰,表的连接条件和后期进一步筛选的条件都放在where后面sql99:select ename,dname FROM emp e inner join dept d on e.DEPTNO=d.DEPTNO;(内连接)优点:表连接的条件是独立的,连接之后,如果还需要进一步筛选 在添加where条件eg:非等值链接找出每个员工的薪资等级,要求显示员工名,薪资 薪资等级?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;eg:自连接 (一张表当成两张表用)查询员工的上级领导,要求显示员工和对应的领导名?select a.ename as '员工名' ,b.ename as '领导名' from emp a inner join emp b on a.mgr=b.DEPTNO;外连接:右连接:right代表将关键字右边的这张表看成主表,主要是为了将这张表的数据全部查出来,捎带着关联查询左边的表,在外连接当中,两张表连接产生了主次关系。select e.ename,d.dname FROM dept d right outer join emp e on e.depton=d.DEPTNO;eg:查询每个员工的上级领导,要求显示所有的员工的名字和领导名?select a.ename as '员工名',b.ename as '领导名' from emp a left outer join emp b on a.mgr=b.empno;三张表和四张表的连接查询:一条sql语句中内连接和外连接都可以使用select ...from a join b on a和b的连接条件 join c on a和c的连接条件 right join d on a和d 的连接条件eg: 找出每个员工的部门的名称以及工资的等级,要求显示员工名,部门名 薪资 薪资等级?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;eg: 找出每个员工的部门的名称以及工资的等级,还有上级领导,要求显示员工名,部门名 薪资 薪资等级?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;子查询:select语句中嵌套select语句 被嵌套的select的语句叫做子查询可以出现在 select (select) from(select) where(select)eg: 找出比最低工资高的员工姓名和工资select sal from emp where sal>(select min(sal) from emp);eg:from后面的子查询,可以把子查询的查询结果当做一张临时表找出每个岗位的平均工资的薪资等级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;union 合并查询结果集(效率高,可以减少匹配的次数)a=10 连接 b=10 连接 c=10 匹配次数 1000a=10 连接 b=10 匹配次数 100 a=10 连接 c=10 匹配次数 100 使用union合并100+100=200eg: 查询工作岗位是MANAGER和SALESMAN的员工select ename,job from emp where job='MANAGER' union select ename,job from emp where job='SALESMAN';
