1、复习
字段类型
create table 模板
insert
update
delete
where
2、条件查询
select * from hbinzdata where XXX;
(1)查询name为HBinz以及id为3的数据:
(2)查询name为HBinz或者id为5的数据:
(3)查询name为HBinz或id为5的数据,再做“且”运算,查询HBinz以及id为3的数据
3、数据仓库
事实表 :确实存在的表
维表(维度表):决策分析的维度的表
--部门员工表
create table emp ( empno numeric(4) not null, ename varchar(10), job varchar(9), mgr numeric(4), hiredate datetime, sal numeric(7, 2), comm numeric(7, 2), deptno numeric(2) );
--部门表
create table dept ( deptno numeric(2), dname varchar(14), loc varchar(13) );
--工资等级表
create table salgrade ( grade numeric, losal numeric, hisal numeric );
数据:
insert into dept values (10, 'ACCOUNTING', 'NEW YORK'); insert into dept values (20, 'RESEARCH', 'DALLAS'); insert into dept values (30, 'SALES', 'CHICAGO'); insert into dept values (40, 'OPERATIONS', 'BOSTON'); insert into salgrade values (1, 700, 1200); insert into salgrade values (2, 1201, 1400); insert into salgrade values (3, 1401, 2000); insert into salgrade values (4, 2001, 3000); insert into salgrade values (5, 3001, 9999); insert into emp values (7369, 'SMITH', 'CLERK', 7902, '1980-12-17', 800, null, 20); insert into emp values (7499, 'ALLEN', 'SALESMAN', 7698, '1981-02-20', 1600, 300, 30); insert into emp values (7521, 'WARD', 'SALESMAN', 7698, '1981-02-22', 1250, 500, 30); insert into emp values (7566, 'JONES', 'MANAGER', 7839, '1981-04-02', 2975, null, 20); insert into emp values (7654, 'MARTIN', 'SALESMAN', 7698, '1981-09-28', 1250, 1400, 30); insert into emp values (7698, 'BLAKE', 'MANAGER', 7839, '1981-05-01', 2850, null, 30); insert into emp values (7782, 'CLARK', 'MANAGER', 7839, '1981-06-09', 2450, null, 10); insert into emp values (7788, 'SCOTT', 'ANALYST', 7566, '1982-12-09', 3000, null, 20); insert into emp values (7839, 'KING', 'PRESIDENT', null, '1981-11-17', 5000, null, 10); insert into emp values (7844, 'TURNER', 'SALESMAN', 7698, '1981-09-08', 1500, 0, 30); insert into emp values (7876, 'ADAMS', 'CLERK', 7788, '1983-01-12', 1100, null, 20); insert into emp values (7900, 'JAMES', 'CLERK', 7698, '1981-12-03', 950, null, 30); insert into emp values (7902, 'FORD', 'ANALYST', 7566, '1981-12-03', 3000, null, 20); insert into emp values (7934, 'MILLER', 'CLERK', 7782, '1982-01-23', 1300, null, 10);
(1)查询工资大于3000的数据:
select * from emp where emp.sal > 3000
(2)查询工资不等于3000的数据:
select * from emp where emp.sal <> 3000
(3)模糊查询 like查询名字带s的数据,位置不详:
select * from emp where emp.ename like '%s%'
(4)查询名字首位带s的:
select * from emp where emp.ename like 's%'
(5)查询名字末尾带s的:
select * from emp where emp.ename like '%s'
(6)查询名字第二位带o的,_为占位符:
select * from emp where emp.ename like '_o%'
(4)排序 order by 默认升序
select * from emp order by sal
=
select * from emp order by sal asc
降序:
select * from emp order by sal desc
(5)限制多少行返回
只看前三行:
select * from emp limit 3
工资前三行:
select * from emp order by sal desc limit 3
(5)聚合
count():多少行,求数量
sum():数值求和
思路:先拆解问题,再聚合
select ? from tableA
问题1:各个部门的薪酬和
select emp.deptno,sum(emp.sal) from emp group by emp.deptno
问题2:各个部门的岗位的薪酬和
select emp.deptno,emp.job,sum(emp.sal) from emp group by emp.deptno,emp.job
注意:
group by 后面的字段要出现在select后面
问题3:各个部门的各个岗位薪酬和大于5000的数据
select emp.deptno,emp.job,sum(emp.sal) from emp group by emp.deptno,emp.job having sum(emp.sal) > 5000
(6)常用组合:where order limit
select emp.deptno,emp.job,sum(emp.sal) from emp
where emp.job = 'SALESMAN'-------先
group by emp.deptno,emp.job -----其次
having sum(emp.sal) > 5000------接着
order by sum(emp.sal) desc------再次
limit 1------最后
(7)join (left join ,right join ,inner join, join
重新创建表
create table a (aid int,aname varchar(40))
create table b (bid int,bname varchar(40),age int)
构建数据
insert into a values(1,'xiaoming');
insert into a values(2,'LY');
insert into a values(3,'KUN');
insert into a values(4,'ZIDONG');
insert into a values(5,'HB');
insert into b values(1,'xiaoming',10);
insert into b values(2,'LY',101);
insert into b values(3,'KUN',102);
insert into b values(4,'ZIDONG',105);
insert into b values(6,'niu',106);
insert into b values(7,'meng',343);
insert into b values(8,'cindy',435);
(8)left join:
select
a.aid,a.aname,b.bid,b.bname,b.age
from a a left join b b
on a.aid = b.bid
左表为主表,左表a有的值,对应右表b有的话会补全,没有就不显示(A全,B匹配A表,匹配不到的为NULL)
注意:
a left join b on a.id = b.id left join c on b.id =c.id
此时仍旧a表是b表的主表,但b表也是c表的主表,即c表匹配b表,b表匹配a表
(9)right join:
select
a.aid,a.aname,b.bid,b.bname,b.age
from a a right join b b
on a.aid = b.bid
与left join相反
(10)inner join(join):
select
a.aid,a.aname,b.bid,b.bname,b.age
from a a inner join b b
on a.aid = b.bid
取交集,共同有的数据。
(11)union
业务需求:
将现有的数据膨胀起来构造新表。
将表a7月的数据以及8月的数据都在一个表里出现,构建新表,此处使用union的能力:
select '2018-07-12'date,a.aid,a.aname from a
union
select '2018-08-13'date,a.aid,a.aname from a
1)union案例
构造一个新表,包含所有人的出勤记录
create table c (cid int,cretime timestamp);
insert into c values(1,'2018-07-12 08:23:11');
insert into c values(1,'2018-07-12 18:23:11');
insert into c values(1,'2018-07-13 08:13:11');
insert into c values(1,'2018-07-13 18:23:11');
insert into c values(2,'2018-07-12 02:23:11');
insert into c values(2,'2018-07-12 16:23:11');
insert into c values(2,'2018-07-13 07:13:11');
insert into c values(2,'2018-07-13 08:23:11');
insert into c values(3,'2018-07-12 07:13:11');
insert into c values(4,'2018-07-13 08:23:11');
2)查出没用出勤的人的id和名字
这里引申出子表的概念。
(select '2018-07' mouth,a.aid,a.aname from a
union
select '2018-08' mouth,a.aid,a.aname from a)
3)由于构造的子表数据最全,因此应作为left join的左表
4)补全表的数据
select
testa.date,testa.aid,testa.aname,c.cid,c.cretime from --------补全考勤的日期、id、名字、出勤id,出勤时间
(select '2018-07-12' date,aid,aname from a
union
select '2018-07-13' date,aid,aname from a) testa--------------总表
left join c on testa.date = date_format(c.cretime,'%Y-%m-%d') -------由于date是年月日,因此匹配的C表的出勤时间也要是年月日的格式
-- Y:年(4位) m:月 d:日
and testa.aid = c.cid --------id匹配
where c.cid is null -----没出勤id即为没出勤
9、union 与 union all的区别
union:
select a.aid from a
union
select b.bid from b
union不补全,取两表id的交集。
union all:
全部补全,不去重。